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

时间:2014-12-24 19:16:38

标签: excel vba excel-vba

赏金问题:

虽然有一个答案可以提供合理的解释,但我想确定是否因为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

2 个答案:

答案 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