Dir*_*hel 31 excel vba replace excel-vba
现在我很困惑.我打算为这个问题创建一个答案.
通过运行一些测试,我注意到了
ActiveSheet.Cells.Replace Chr(1), "", xlPart, , True, , False, False
Run Code Online (Sandbox Code Playgroud)
完全清除表格.这有一定道理的Chr(42)这是*为什么Chr(1)?
有谁知道原因?它是某种第二/隐藏占位符吗?
(无法找到某些内容,但可能只使用了错误的搜索字词)
原因可以从两者之间的差异推断出来
NUL:没有性格.它用于在没有数据的存储设备的表面(例如盘片表面)上填充时间或填充空间.当我们为数据擦除器(破坏性和非破坏性两者)进行编程以消除未分配的空间时,我们将使用此字符,以便任何一个或任何程序都无法恢复已删除的数据.
SOH:此字符用于表示标题的开头,标题可能包含地址或路由信息.
STX:此字符用于指示文本的开头,这样也用于指示标题的结尾.
各种评论已经指出这些字符(前32个)被称为控制字符,因为这些字符执行各种打印机和显示控制操作而不是显示符号.
在Hadoop中,SOH通常用作字段分隔符,尤其是在读取CSV文件时.此外,在Notepad ++中打开Excel文件(不解压缩为普通xlsx,即二进制)并打印控制字符时,会看到很多SOH字符.由于安全功能,人们将无法看到实际数据.
chr(0)= SOH是指向包含TEXT的所有单元的存储器地址的指针
和
chr(1)= NUL是指向包含NULL或BLANK CELLS的所有单元的内存地址的指针
让我们看一下上面的语句,看看下图中显示的不同命令.TOP-LEFT是原始数据范围,示例显示了使用Range.Replace函数替换SOH,NUL和ASTERISK(*)的方式.
那么,为什么Chr(0)和Chr(1)能够替换Excel单元格中的值,如果它们只是地址指针以及chr(1)的行为与chr(42)不同?
这是因为Excel工作表的结构.打开全新的Excel工作簿时,不会标记Excel单元格.它完全在视觉上和系统的硬和软内存中.
然而,一旦一个人进入Cell B2中的某个东西,那么所有BLANK CELLS平方到B2将被分配一个带有Chr(0)的指针,而Cell B2将被分配一个带有Chr(1)的指针.
现在,如果删除单元格B2的内容,那么将与其他单元格B2一起分配NUL或Chr(0)指针.
这也是为什么仅使用Cells.ClearContents清除内容时不会清除内存中的单元格和使用远程单元格但未使用Cells.Clear或Ctrl + Delete删除时Excel工作簿膨胀的原因.
现在,虽然很清楚Excel为什么会替换内容或使用给定命令清除工作表.理解星号(*)和SOH [或Chr(0)]之间的区别也很重要.
星号(*)替换最小长度为0的单元格内容.
而Chr(0)用SOH识别单元格,即包含值的单元格,然后替换指针目的地的值.
差异不在于结果,而在于如何找到或识别要替换的细胞.
我创建了一个小宏来验证我正在记录使用Chr(1)= SOH和Chr(42)=*替换50万个单元(A1到CZ5000)所需时间的假设.
事实证明,使用指向TEXT(即SOH)的单元格地址的指针比ASTERISK(*)花费的时间更少.
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
Run Code Online (Sandbox Code Playgroud)