我试图在VBA中将Excel列截断为一定长度。
但是,LEN
函数似乎并未将\n and \r
视为单个字符。
还有其他函数可以给出字符串的确切长度吗?
例如,我试图获取单元格中后面字符串的长度。 (a\r\nb\r\nc\r\nd
)
a
b
c
d
代码获取长度。
print len( replace(replace(sheet1.Cells(1,1).value, chr(10), "-" ), chr(13), "#"))
输出:
7
字符串的实际长度为
10
。编辑
我终于弄明白了。它与空格字符无关,但与其他一些特殊的Unicode字符有关。
VBA
LEN
函数和Java String.length()
方法不提供字符串的大小,而是字符数。由于Oracle使用字节长度作为列(varchar(50) means 50 bytes
)的实际大小,因此即使在截断之后也不允许插入字符串。我最终使用以下代码在Java端截断字符串,因为我找不到在VBA中执行此操作的任何方法。
stringBytes = strCellValue.getBytes("UTF-8");
stringLength = stringBytes.length;
strCellValue = new String( stringBytes, 0, maxCellWidth, "UTF-8");
cell.setCellValue(strCellValue);
感谢David Zemens和P57提供的线索。
最佳答案
我刚刚测试了从Notepad ++复制/粘贴并确认它没有复制回车。
如果您像这样检查单元格:Instr(Sheet1.Cells(1,1).Value, vbCrLF)
您将看到0
的结果,指示vbCrLF
(Char(10) & Char(13)
)根本不存在于单元格中。剪贴板必须以某种方式更改文本流。
因此,Excel中字符串的实际长度仅为7。
要解决此问题,请将换行符转换为vbCr & vbLf
:
Debug.Print Len(Replace(sheet1.Cells(1,1).value, vbLF, vbCR & vbLF))
注意:这可能不是一种“一刀切”的方法,它假定所有换行都应强制为回车+换行。您的行驶里程可能会有所不同。
建议不要从Notepad ++复制/粘贴,并直接将文本文件作为TextStream对象消费到VBA中。