检查单元格的内部颜色与其值之间的性能差异

时间:2019-03-27 14:39:44

标签: excel vba performance

我正在Excel中运行资产管理项目。使用与SQL数据库的连接,我可以导入大量维护计划。

根据输入的内容,我用特定的短字符串填充多个单元格,然后另外用两种颜色之一绘制各个单元格的内部。稍后由用户填充的单元将保持未绘制状态。

使用数据库数据填充的单元格始终为彩色

当我稍后运行再次填充大量单元格的命令时,其中一些单元格可能已经由用户或数据库填充。必须跳过这些特定的单元格,到目前为止,我知道确定是否必须跳过单元格的三种可能的方法:

  1. 检查数据库(速度较慢):解决方案不佳,因为单元格已经用数据库填充,所以另一次运行会覆盖数据库
  2. 检查是否已填充该单元格:If not cell.Value = vbNullstring Then
  3. 检查单元格是否有色:If not cell.Interior.Color = vbRed Then

现在,因为从理论上讲,填充单元的数量可能高达50万甚至更多,所以我想知道 second 第三选项

检查单元格的值与单元格的内部颜色之间是否有明显的区别?

2 个答案:

答案 0 :(得分:2)

似乎确实存在性能差异。我刚刚检查了一个单元格的值和一个单元格的内部颜色一亿次,但有明显的区别:

Checking the value :  456 seconds
Checking the colour: 1281 seconds

换句话说:检查值的速度提高了±2.8倍(遵循这个简单的实验)。

答案 1 :(得分:2)

只需从此处扩展代码即可:Performance difference between looping range vs looping array

测试范围:A1:A100000

Read/Write Cell        = 15,765625 seconds
Read/Write Array       = 0,203125 seconds

Read Cell              = 0,37109375 seconds
Read Array             = 0,0234375 seconds
Read Interior Color    = 1,421875 seconds

因此,您也可以在读取颜色与读取数组值之间进行直接比较。


Option Explicit

Const strRANGE_ADDRESS As String = "A1:A100000"

Sub LoopRangeReadWrite()

    Dim r As Range
    Dim lStart As Double
    Dim lEnd As Double

    lStart = Timer

    For Each r In Range(strRANGE_ADDRESS)
        r.Value = r.Value + 1
    Next r

    lEnd = Timer

    Debug.Print "Read/Write Cell = " & (lEnd - lStart) & " seconds"

End Sub

Sub LoopArrayAddOne()

    Dim varArray As Variant
    Dim var As Variant
    Dim lStart As Double
    Dim lEnd As Double

    lStart = Timer

    varArray = Range(strRANGE_ADDRESS).Value
    For Each var In varArray
        var = var + 1
    Next var
    Range(strRANGE_ADDRESS).Value = varArray

    lEnd = Timer

    Debug.Print "Read/Write Array = " & (lEnd - lStart) & " seconds"

End Sub

Sub LoopRangeReadColor()

    Dim r As Range
    Dim lStart As Double
    Dim lEnd As Double
    Dim a As Long

    lStart = Timer

    For Each r In Range(strRANGE_ADDRESS)

        a = r.Interior.Color
    Next r

    lEnd = Timer

    Debug.Print "Read Interior Color = " & (lEnd - lStart) & " seconds"

End Sub

Sub LoopRangeReadValue()

    Dim r As Range
    Dim lStart As Double
    Dim lEnd As Double
    Dim a As Variant

    lStart = Timer

    For Each r In Range(strRANGE_ADDRESS)
        a = r.Value
    Next r

    lEnd = Timer

    Debug.Print "Read Cell = " & (lEnd - lStart) & " seconds"

End Sub

Sub LoopArrayValue()

    Dim varArray As Variant
    Dim var As Variant
    Dim lStart As Double
    Dim lEnd As Double

    lStart = Timer

    varArray = Range(strRANGE_ADDRESS).Value
    For Each var In varArray
        var = var + 1
    Next var

    lEnd = Timer

    Debug.Print "Read Array = " & (lEnd - lStart) & " seconds"

End Sub