Chr*_*007 8 excel vba excel-vba
赏金问题:
虽然有一个答案提供了合理的解释,但我想确定字符串的截断是否发生,因为Clean()是a WorksheetFunction和该问题背后的原因.做WorksheetFunctions时调用由VBA传递字符串为"细胞"可以这么说这在截断null Chr(0)?
原始问题:
为什么TestIt的Application.Clean方法删除所有字符后,Chr(0)即使它们是可打印? TestIt2在替换后正确返回8个字符null Chr(0).
编辑:
值得注意的是,某些版本的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
Run Code Online (Sandbox Code Playgroud)
和
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
Run Code Online (Sandbox Code Playgroud)
答案似乎非常简单:删除后面的所有字符chr(0)是一个错误。
Clean旨在仅删除chr(0)以及其他非打印字符,如 VBA 语言参考中所示:
Clean 函数旨在从文本中删除 7 位 ASCII 代码(值 0 到 31)中的前 32 个非打印字符。
Clean对于所有其他提到的chr()值,chr(0)除了明确删除所有后续字符之外,都按预期工作。
如果必须使用 null 值,则需要进行某种转换。您可以通过执行类似的操作来获得预期的结果,TryIt = Replace(TryIt, Chr(0), Chr(1))之后结果将按预期工作(并且对于旨在删除的所有其他 31 个chr()代码也是如此):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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1649 次 |
| 最近记录: |