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

时间:2016-07-19 10:05:33

标签: excel vba excel-vba syntax difference

如果我运行以下代码

Sub Test_1()
   Cells(1, 1).ClearContents
   Cells(2, 1).Value = ""
End Sub

当我使用公式ISBLANK()检查单元格(1,1)和单元格(2,1)时,两个结果都返回 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

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

.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

根据这些结果,我们发现方法.Value = ""平均比.ClearContents快。一般来说这是真的吗?为什么这样?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-1)

您可以注意到Excel电子表格的巨大差异。

假设B1由等式填充返回空白 A1 = 5 B1 =“= if(A1 = 5,”“,”x“)

在这种情况下,您必须使用可以在C1中编写的方程式 (1)C1 =< = isblank(B1)> (2)C1 =

解决方案1将返回false,因为单元格填充了等式 解决方案2将返回True

答案 2 :(得分:-2)

我遇到这个话题有点晚,但我想用我的一些代码分享我注意到的东西,我认为我不能完全解释它,但我会尽力而为。

For Each Cell In ws.Range("D12:D161") 'Order feed colom
Select Case Cell.Value
    Case 0
        Cell.Interior.Color = Cell.Offset(0, -1).Interior.Color
    Case 1
        Cell.Interior.Color = 10198015
    Case 2
        Cell.Interior.Color = 11854022
End Select
Cell.value = "" 
Next Cell

这是我用来清除某些字段并为 D12:D161 范围赋予一些颜色的一些代码。这里没什么特别的,如果值为 0,则复制您的邻居,如果为 1,则为红色,如果为 2,则为绿色。然后清除单元格

但是为了让这段代码运行起来,对我来说大约需要 5-6 秒,我认为这对于一小段代码来说是相当不错的。另外,我在 Private Sub Workbook_SheetActivate(ByVal Sh As Object) 上使用了它,这让用户不愉快地等待 5-6 秒进行屏幕转换。所以我放了一个循环来检查连续的空值,然后跳过。

值得注意的是,这是脚本的一部分,是的,我在这段代码中关闭了屏幕更新、计算和事件。

For Each Cell In ws.Range("D12:D161") 'Order feed colom
Select Case Cell.Value
    Case 0
        Cell.Interior.Color = Cell.Offset(0, -1).Interior.Color
        Erow = Erow +1
    Case 1
        Cell.Interior.Color = 10198015
        Erow = 0
    Case 2
        Cell.Interior.Color = 11854022
        Erow = 0
End Select
Cell.value = ""
if Erow = 10 then exit for
Next Cell

现在我不需要做 149 行,而是做了大约 58 行,这取决于我在列中的数据。但仍然需要 3-4 秒才能完全运行。在调试模式期间,我根本没有注意到任何延迟。如果我已经在工作表上手动运行代码,则延迟为 0。几乎是即时的,经过更多的测试,但是当使用带有此代码的 Private Sub Workbook_SheetActivate(ByVal Sh As Object) 时,它仍然运行了 3-4 秒。 在测试了单行代码后,我遇到了 .Value = ""。从代码中删除这一行使它运行了 0.5 秒......所以现在我知道我的问题出在哪里,使用多种方法来清空我的单元格。我注意到 .clearcontents 对我来说是最快的。显然,如果您从一个工作表移动到另一个工作表 EVENTHOUGH ws. 已被声明为我的活动工作表,它只是需要很多时间

For Each Cell In ws.Range("D12:D161") 'Order feed colom
Select Case Cell.Value
    Case 0
        Cell.Interior.Color = Cell.Offset(0, -1).Interior.Color
        Erow = Erow +1
    Case 1
        Cell.Interior.Color = 10198015
        Erow = 0
    Case 2
        Cell.Interior.Color = 11854022
        Erow = 0
End Select
Cell.ClearContents 'DONT USE .Value = "", makes the code run slow
if Erow = 10 then exit for
Next Cell

总结。 使用上面的代码 .value = "" 用了 4-5 秒 .value = VbNullstring 用了 3-4 秒 .ClearContents 只用了 0.5 秒。但仅在工作表转换期间 Private Sub Workbook_SheetActivate(ByVal Sh As Object)

如果有人能够解释为什么会这样或究竟发生了什么,我将不胜感激。