我想知道如何更好地填充 Range
中的单元格:
For..Next
循环通过它们访问单元格(请参阅下面的代码),或 Variant
加载了单元格数据的数组,或 这是我的代码:
' Count number of rows and columns we have
rowCounter = CountRowsFunction
colCounter = CountColsFunction
' Do operations needed
For i = 2 To rowCounter
originalSheet.Cells(i, colCounter + 1).Value = Round(DateDiff("n", originalSheet.Cells(i, ColumnsIndex(2)).Value, originalSheet.Cells(i, ColumnsIndex(3)).Value) / 60, 2)
Next i
在这种情况下,我直接访问单元格。但是,我相信这可能会导致对电子表格的不必要调用。谢谢
最佳答案
使用数组来设置多个单元格值是非常优越的。在下面的示例中,范围 A1:MZ390
(152100 个单元格)设置有两种方法:
在我的电脑上,方法 2 耗时不到一秒,而方法 1 耗时 > 4 秒。
在示例中,它迭代数组,但您可以使用更少的代码行,只需执行
varData = 2
- 但人们不太可能将一堆单元格值设置为常数。Option Explicit
Sub Test()
Dim dt1 As Date, dt2 As Date
Dim lngX As Long, lngY As Long
Dim varData As Variant
Dim ws As Worksheet
Dim rng As Range
'set ws
Set ws = ThisWorkbook.Worksheets("Sheet1")
'for loop method - without screen updating
Application.ScreenUpdating = False
ws.Cells.Delete
Set rng = ws.Range("A1:MZ390")
dt1 = Now
rng.Value = 1
For lngY = 1 To rng.Rows.Count
For lngX = 1 To rng.Columns.Count
rng.Cells(lngY, lngX).Value = 2
Next lngX
Next lngY
dt2 = Now
Application.ScreenUpdating = True
Debug.Print "For loop (without screen updating) took: " & Format(dt2 - dt1, "s") & " seconds"
'array method
ws.Cells.Delete
Set rng = ws.Range("A1:MZ390")
dt1 = Now
rng.Value = 1
varData = rng.Value
For lngX = 1 To UBound(varData, 1)
For lngY = 1 To UBound(varData, 2)
varData(lngX, lngY) = 2
Next lngY
Next lngX
rng.Value = varData
dt2 = Now
Debug.Print "Array method took: " & Format(dt2 - dt1, "s") & " seconds"
End Sub
关于vba - 在 for 循环或数组中处理 Range 值是否更优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41558946/