赏金问题:
虽然有一个答案提供了合理的解释,但我想确定字符串是否被截断,因为 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
最佳答案
@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
中写入“Test”
最好的方法就是像你正在做的那样去处理它。使用.Replace
。另一种替代(更长)的方法是使用 INSTR
。
关于vba - 为什么 Application.Clean() 会删除可打印字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27641324/