赏金问题:
虽然有一个答案可以提供合理的解释,但我想确定是否因为Clean()
是WorksheetFunction
而发生字符串截断以及该问题背后的原因。 WorksheetFunctions
调用时VBA
将字符串传递给"单元格"那么说哪个截断在null Chr(0)
?
原始问题:
为什么TestIt
' Application.Clean
方法会删除Chr(0)
之后的所有字符,即使它们是可打印的?在TestIt2
上替换后,null Chr(0)
正确返回8个字符。
编辑:
值得注意的是,某些版本的Excel将要求您编写Application.WorksheetFunction.Clean()
测试这个错误。
代码的
Sub TestIt()
Dim TryIt As String
TryIt = "Test" & Chr(0) & "asdf"
MsgBox Len(TryIt) 'Prints 9
TryIt = Application.Clean(TryIt)
MsgBox Len(TryIt) 'Prints 4
End Sub
和
Sub TestIt2()
Dim TryIt As String
TryIt = "Test" & Chr(0) & "asdf"
MsgBox Len(TryIt) 'Prints 9
TryIt = Replace(TryIt, Chr(0), "")
MsgBox Len(TryIt) 'Prints 8
End Sub
答案 0 :(得分:3)
@Gserg在上面的评论中是正确的
Visual Basic 不能处理由NULL字符终止的字符串。事实上,所有DLL都以这种方式终止字符串。 Chr(0)
被视为字符串的终止字符。
这是检查它的最佳方式。
Sub TestIt()
Dim TryIt As String
TryIt = "Test" & Chr(0) & "asdf"
Debug.Print Len(TryIt)
Debug.Print TryIt
ThisWorkbook.Sheets(1).Range("A1").Value = TryIt
End Sub
这将只写"测试"在单元格A1
最好的方法是像处理它一样处理它。使用.Replace
。另一种(更长)方式是使用INSTR
。
答案 1 :(得分:3)
答案似乎很简单:删除chr(0)
后面的所有字符都是一个错误。
Clean
旨在删除chr(0)
以及其他非打印字符,如VBA语言参考中所示:
Clean函数旨在从文本中删除7位ASCII代码(值0到31)中的前32个非打印字符。
Clean
按预期的方式处理所有其他提及的chr()
值除chr(0)
之后,它会明确删除所有后续字符。
如果必须使用null值,则需要进行某种转换。您可以通过执行TryIt = Replace(TryIt, Chr(0), Chr(1))
之类的操作来获得预期结果,之后结果将按预期工作(并且与chr()
旨在删除的所有其他31个Clean
代码一样:
Sub TestIt3()
Dim TryIt As String
Dim iCounter As Integer
For iCounter = 0 To 31
TryIt = "Test" & Chr(iCounter) & "asdf"
TryIt = Replace(TryIt, Chr(0), Chr(1))
Debug.Print "chr(" & iCounter & ")" & " " & Len(TryIt)
TryIt = Application.Clean(TryIt)
Debug.Print "cleaned - chr(" & iCounter & ")" & " " & Len(TryIt)
Next iCounter
End Sub