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

标签 vba excel

赏金问题:

虽然有一个答案提供了合理的解释,但我想确定字符串是否被截断,因为 Clean()WorksheetFunction以及该问题背后的原因。做WorksheetFunctionsVBA 调用时可以说,将字符串传递到“单元格”中,该单元格在 null Chr(0) 处截断?

原始问题:

为什么TestItApplication.Clean方法删除 Chr(0) 之后的所有字符即使它们是可打印的? TestIt2null 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/

相关文章:

excel - 在不破坏使用 Range.Value 的 vba 宏的情况下在 excel 中添加新行

vba - Excel 工作表名称中的大小写更改

vba - 我的 ComboBox 不显示我在 VBA 中添加的值

excel - Application.Evaluate 与 Activesheet.Evaluate

xml - 用于 xls 转换的 Excel VBA 编码以及参数

vba - 使用vba从单元格中删除图片

excel - 从文本中解析子字符串

vba - 如何将文本拆分到不同的列或从原始列中删除文本?

excel - 使用对象调用方法时未定义 VBA 变量

java - Jasper Reports 中的 Excel 分组依据和大纲