我试图在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的结果,指示vbCrLFChar(10) & Char(13))根本不存在于单元格中。剪贴板必须以某种方式更改文本流。

因此,Excel中字符串的实际长度仅为7。

要解决此问题,请将换行符转换为vbCr & vbLf

Debug.Print Len(Replace(sheet1.Cells(1,1).value, vbLF, vbCR & vbLF))


注意:这可能不是一种“一刀切”的方法,它假定所有换行都应强制为回车+换行。您的行驶里程可能会有所不同。

建议不要从Notepad ++复制/粘贴,并直接将文本文件作为TextStream对象消费到VBA中。

07-24 09:37
查看更多