为什么Application.Clean()会删除可打印的字符?

Chr*_*007 8 excel vba excel-vba

赏金问题:

虽然有一个答案提供了合理的解释,但我想确定字符串的截断是否发生,因为Clean()是a WorksheetFunction和该问题背后的原因.做WorksheetFunctions时调用由VBA传递字符串为"细胞"可以这么说这在截断null Chr(0)

原始问题:

为什么TestItApplication.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)

Ins*_*ast 2

答案似乎非常简单:删除后面的所有字符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)