VBA获得空白字符的string的长度,如新行和回车

我试图在Excel中截断Excel列到一定的长度。

但是, LEN函数似乎不会将\n and \r为单个字符。

有没有其他函数可以给出确切的string长度?

例如,我试图得到一个单元格中以下string的长度。 ( 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 

string的实际长度是10

编辑

我终于弄明白了。 它与空格字符无关,但与其他一些特殊的Unicode字符无关。

VBA LEN函数和Java String.length()方法不会给出string的大小,而是字符数。 由于Oracle使用字节长度作为列的实际大小( varchar(50) means 50 bytes ),所以即使在截断之后也不允许插入string。

我终于用下面的代码截断了Java端的string,因为我无法在VBA中find任何方法。

 stringBytes = strCellValue.getBytes("UTF-8"); stringLength = stringBytes.length; strCellValue = new String( stringBytes, 0, maxCellWidth, "UTF-8"); cell.setCellValue(strCellValue); 

感谢David Zemens和P57提供的线索。

我刚刚testing从记事本++复制/粘贴并validation它不复制回车。

如果你检查你的手机,如:

Instr(Sheet1.Cells(1,1).Value, vbCrLF)

您会看到0的结果,表示vbCrLFChar(10) & Char(13) )在单元格中不存在。 剪贴板必须以某种方式改变文本stream。

所以Excel中string的实际长度只有7。

要解决这个问题,请将vbCr & vbLf行转换为vbCr & vbLf

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

注意:这可能不是一个通用的方法,它假定所有的换行应该被强制回车+换行。 你的里程可能会有所不同。

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

我仍然很好奇,为什么如果从Java读取Excel值,为什么你会看到你的例子的字符数为10。

这段代码给出了一些关于Excel范围如何复制回剪贴板的进一步见解。 看起来好像在粘贴到单元格之后,回车消失了,而且在复制之后,实际的剪贴板文本包含引号,并且附加了“\ n \ r”,但没有原始\r字符的踪迹。

  Sub CellStringCheck() 'Copy cell to clipboard Range("A1").Copy 'Get clipboard contents directly Dim obj As MSForms.DataObject Set obj = New MSForms.DataObject obj.GetFromClipboard 'Convert to string and set object to nothing Dim s As String s = obj.GetText Set obj = Nothing 'Print Information Debug.Print "___________________" Debug.Print "String: " Debug.Print s Debug.Print "Len = " & Len(s) Debug.Print "Characters:" On Error Resume Next For i = 1 To Len(s) Debug.Print AscW(Mid(s, i, 1)) Next End Sub 

如果我A\n\rA粘贴到范围A1中,则此代码产生以下内容:

  ___________________ String: "A A " Len = 7 Characters: 34 65 10 65 34 13 10 

如果您将此剪贴板内容粘贴回NP ++中,您将得到引用和全部内容,但是NP ++自动将单独的\n转换回\n\r ,显然是因为它不属于剪贴板内容。

我想知道这是否与剪贴板格式是VbCFText,但如果VBA处理剪贴板粘贴,那么没有问题。 没有回车符被删除,如下所示使用此代码:

  Sub CellStringCheck() 'Set clipboard contents Dim obj As MSForms.DataObject Set obj = New MSForms.DataObject obj.SetText vbLf & vbCr obj.PutInClipboard 'Copy cell to clipboard obj.GetFromClipboard Range("A1") = obj.GetText Range("A1").Copy 'Get clipboard contents directly obj.GetFromClipboard 'Convert to string and set object to nothing Dim s As String s = obj.GetText 'Print Information Debug.Print "___________________" Debug.Print obj.GetFormat(1) Debug.Print "String: " Debug.Print s Debug.Print "Len = " & Len(s) Debug.Print "Characters:" On Error Resume Next For i = 1 To Len(s) Debug.Print AscW(Mid(s, i, 1)) Next Set obj = Nothing End Sub 

所以,所有这一切,我仍然不知道为什么你会直接从Java读取单元格的值,但是如果你要通过剪贴板,那么你可能会拿起追加回车。 显然,Excel和NP ++在粘贴时自己处理string。 Excel删除回车符,而NP ++将\n转换为\n\r 。 如果直接通过剪贴板,这不会发生,所以我怀疑它与应用程序级别的事件处理有关。 我还没有直接testing读取或写入.Net或Java值,但我的猜测是,直接访问值将避免这个问题。 另一个解决方法是使用Environment.NewLine或者对\n任何实例强制\n\r

我怀疑这是最好的答案。 实际上,我很确定,但是一个比较复杂的方法是在使用Len函数之前,在回车和换行上做一个replace。 就像是

 for i = 1 to 10 cells(i,1) = Replace(Cells(i,1), Char(10), "-") 'newline Chr(10) cells(i,1) = Replace(cells(i,1), Char(13), "-") 'carriage return Chr(13) next i 

那么你将有一个破折号和换行符,并且可以将Len应用到所涉及的单元格以获取全长。

你能举一个你的string的例子吗?

 Const vcr As String = "L" & vbCr & _ "n" & vbCr & _ "." & vbCr & _ "." Const vlf As String = "L" & vbLf & _ "n" & vbLf & _ "." & vbLf & _ "." Const vslashn As String = "l\nn\n.\n." len(vcr) gives 7 len(vlf) gives 7 Dim vslashnConverted As String vslashnConverted = Replace(vslashn, "\n", crlf) Len(vslashn) : 10 Len(vslashnConverted) : 4 

这是你想要的吗?

 Sub countStr() MsgBox (Len(Worksheets("sheet1").Cells(1, 1).Text)) End Sub 

从单元格计数文本

使用这个函数来获得你想要的结果

注:考虑\ r和\ n是两个不同的字符

 Public Function getlength(d As Range) As Long getlength = WorksheetFunction.Sum((Len(d) - Len(WorksheetFunction.Substitute(d, "\r", ""))) / 2, (Len(d) - Len(WorksheetFunction.Substitute(d, "\n", ""))) / 2, Len(WorksheetFunction.Substitute(WorksheetFunction.Substitute(d, "\r", ""), "\n", ""))) End Function 

在这里输入图像说明

编辑1:

注意:下面的函数考虑\ r \ n作为单个字符

 Public Function getlength(d As Range) As Long getlength = WorksheetFunction.Sum((Len(d) - Len(WorksheetFunction.Substitute(d, "\r\n", ""))) / 4, Len(WorksheetFunction.Substitute(d, "\r\n", ""))) End Function 

在这里输入图像说明