对于Chr(1),Range.Replace始终为true

时间:2017-08-10 00:41:49

标签: excel vba excel-vba replace

现在我很困惑。我打算为this question创建一个答案。

通过运行一些测试,我注意到了

{
    "ID": 2,
    "Title": "It's a new UserGroup 1",
    "Description": null,
    "UserGroupMembers": [{
        "ID": 1,
        "UserID": null,
        "User": null,
        "UserGroupID": 2,
        "UserGroup": ... // Pointing to UserGroup with ID = 2
        "ChildUserGroupID": 1,
        "ChildUserGroup": null
    }]
}

完全清除表格。它ActiveSheet.Cells.Replace Chr(1), "", xlPart, , True, , False, False Chr(42)是有意义的,但为什么*

有谁知道原因?它是某种第二/隐藏占位符吗? (无法找到某些内容,但可能只使用了错误的搜索字词)

4 个答案:

答案 0 :(得分:9)

从两者之间的差异可以推断出原因

  • NUL :无字符。它用于在没有数据的存储设备的表面(例如磁盘表面)上填充时间或填充空间。在为数据擦除器(破坏性和非破坏性的)进行编程时,将使用此字符以擦除未分配的空间,以便任何人或任何程序都无法恢复已删除的数据。

    < / li>
  • SOH :此字符用于指示标题的开始,其中可能包含地址或路由信息。

  • STX :此字符用于指示文本的开头,因此也用于指示标题的结尾。

Source of Definition


各种注释已经指出,这些字符(前32个)被称为控制字符,因为这些字符执行各种打印机和显示控制操作,而不是显示符号。

在Hadoop中,SOH通常用作字段分隔符,尤其是在读取CSV文件时。同样,在记事本中打开Excel文件(不解压缩为普通xlsx,即二进制格式)并打印控制字符时,将看到很多SOH字符。由于具有安全性功能,因此无法看到实际数据。

chr(0)= SOH是指向所有包含TEXT的单元格的内存地址的指针

chr(1)= NUL是指向所有包含NULL或空白单元格的单元的内存地址的指针

让我们看一下上面的语句,以了解下图中显示的不同命令。 TOP-LEFT是原始数据范围,示例显示了如何使用Range.Replace函数替换SOH,NUL和ASTERISK(*)。

SOH Replace ALL in EXCEL


那么,如果Chr(0)和Chr(1)仅仅是地址指针,并且为什么chr(1)的行为不同于chr(42),为什么它们能够替换Excel单元格中的值?

由于Excel工作表的结构而发生这种情况。当您打开全新的Excel工作簿时,未标记Excel单元格。它完全在视觉上以及系统的硬内存和软内存中。

但是,一旦一个人在单元格B2中输入内容,那么直到B2的所有空白单元格都将被分配一个带有Chr(0)的指针,而单元格B2将会被分配一个带有Chr(1)的指针。

现在,如果删除一个单元格B2的内容,则将与其他单元格B2一起分配一个NUL或Chr(0)指针。

这也是为什么仅使用Cells.ClearContents清除内容时并不会清除内存和Excel工作簿膨胀中的单元格的原因,而使用了较远的单元格却没有使用Cells.Clear或Ctrl + Delete将其删除。


现在,很明显,为什么Excel用给定的命令替换了内容或清除了工作表。了解星号(*)和SOH [或Chr(0)]之间的区别也很重要。

星号(*)替换最小长度为0的单元格内容。

当Chr(0)标识具有SOH的单元格时,即包含值的单元格,然后在指针的目标位置替换该值。

差异不是结果,而是找到或识别要更换的电池的方式。


我创建了一个小宏来验证以下假设:我正在记录使用Chr(1)= SOH和Chr(42)= *替换半百万个单元格(A1至CZ5000)所花费的时间

事实证明,使用指针指向带有TEXT的单元格地址(即SOH)所花费的时间少于ASTERISK(*)。

Time taken to replace text


Sub Replace_Timer()

    Sheet3.Activate

    Dim startTime, endTime
    Dim i As Integer

        Sheet3.Range("A1:CZ5000").Value = "A"

    For i = 1 To 25
        startTime = Timer
            Sheet3.Cells.Replace Chr(1), "X", xlPart, xlRows, False
        endTime = Timer
        Sheet4.Cells(i + 1, 2).Value = endTime - startTime 'Execution time in miliseconds

        startTime = Timer
            Sheet3.Cells.Replace Chr(42), "Z", xlPart, xlRows, False
        endTime = Timer

        Sheet4.Cells(i + 1, 3).Value = endTime - startTime 'Execution time in miliseconds
    Next

    Sheet4.Activate

End Sub

答案 1 :(得分:0)

ASCII 1是&#39; SOH&#39; (标题的开头)和ASCII 2&#39; STX&#39;意味着标题的结尾,数据流的开始。 (这允许您在文件中的实际数据之前隐藏文件中的地址,注释等)。看起来Excel正在解释您的命令从文件的开头开始并包括一切。

答案 2 :(得分:0)

我想我找到了答案。
我怎么找到的。
我键入“Alt + 1”(来自num pad的1)然后我得到了这个“?” (问号)。
现在我键入下面的代码,清除工作表。

ActiveSheet.Cells.Replace "?", "", xlPart, , True, , False, False

答案 3 :(得分:-3)

ASCII 1,由许多人识别,它被应用程序解释为每个字符的标题的开头。但是,特殊字符可以被其他一些字符转义('〜'是Excel中的转义字符)check here

我相信,你应该避免在你的代码中用chr(1)替换。