.Value =""和.ClearContents有什么区别?

Ana*_*a 秀 11 syntax excel vba excel-vba difference

如果我运行以下代码

Sub Test_1()
   Cells(1, 1).ClearContents
   Cells(2, 1).Value = ""
End Sub
Run Code Online (Sandbox Code Playgroud)

当我使用公式检查单元格(1,1)和单元格(2,1)时,ISBLANK()两个结果都返回TRUE.所以我想知道:

Cells( , ).Value = ""和之间有什么区别Cells( , ).ClearContents

它们基本相同吗?


如果我然后运行以下代码来测试方法之间的时差:

Sub Test_2()
Dim i As Long, j As Long
Application.ScreenUpdating = False

For j = 1 To 10
    T0 = Timer
    Call Number_Generator
    For i = 1 To 100000
        If Cells(i, 1).Value / 3 = 1 Then
            Cells(i, 2).ClearContents
           'Cells(i, 2).Value = ""
        End If
    Next i
    Cells(j, 5) = Round(Timer - T0, 2)
Next j

End Sub

Sub Number_Generator()
Dim k As Long
Application.ScreenUpdating = False

For k = 1 To 100000
    Cells(k, 2) = WorksheetFunction.RandBetween(10, 15)
Next k

End Sub
Run Code Online (Sandbox Code Playgroud)

我在我的机器上获得运行时的以下输出

.ClearContents  .Value = ""
4.20            4.44
4.25            3.91
4.18            3.86
4.22            3.88
4.22            3.88
4.23            3.89
4.21            3.88
4.19            3.91
4.21            3.89
4.17            3.89
Run Code Online (Sandbox Code Playgroud)

基于这些结果,我们发现该方法.Value = "".ClearContents平均速度快.一般来说这是真的吗?为什么这样?

NPC*_*ete 2

根据我的发现,如果您的目标是简单地拥有一个空单元格并且您不想更改有关格式的任何内容,那么您应该使用 Value = vbNullString 因为这是最有效的。

“ClearContents”正在检查和更改单元格中的其他属性,例如格式和公式(从技术上讲,这是与值不同的属性)。当使用 Value = "" 时,您只更改一个属性,因此速度更快。使用 vbNullString 会提示编译器您正在使用空字符串,而使用双引号的其他方式则需要通用字符串。因为 vbNullString 提示它需要一个空字符串,所以它能够跳过一些步骤,从而获得性能提升。

  • 更改单元格的“.Value”如何避免更改单元格的“.Formula”?这没有多大意义。此外,删除单元格值的方法都不会影响格式设置。 (3认同)
  • 我认为您是正确的,“.ClearContents”不会更改格式,因此感谢您的更正。我在原来的帖子中所说的是“.ClearContents”确实检查“.Formula”。所以澄清一下,“.ClearContents”肯定会检查并更改“.Value”、“.Formula”和“.FormulaR1C1”。如果检测到“=”,则更改“.Value”可能会检查并更改其他值,但由于它并不总是检测到这一点,因此它会做更少的事情,并且这就是它更快的原因。 (2认同)