我正在Excel中运行资产管理项目。使用与SQL数据库的连接,我可以导入大量维护计划。
根据输入的内容,我用特定的短字符串填充多个单元格,然后另外用两种颜色之一绘制各个单元格的内部。稍后由用户填充的单元将保持未绘制状态。
使用数据库数据填充的单元格始终为彩色
当我稍后运行再次填充大量单元格的命令时,其中一些单元格可能已经由用户或数据库填充。必须跳过这些特定的单元格,到目前为止,我知道确定是否必须跳过单元格的三种可能的方法:
If not cell.Value = vbNullstring Then
If not cell.Interior.Color = vbRed Then
现在,因为从理论上讲,填充单元的数量可能高达50万甚至更多,所以我想知道 second 和第三选项
检查单元格的值与单元格的内部颜色之间是否有明显的区别?
答案 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