在for循环或数组中处理Range值更为理想

我想知道什么是更好的填充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单元格)设置了两种方法:

  1. 将所有单元格设置为1; 迭代单元格并将每个单元格值设置为2
  2. 将所有单元格设置为1; 给数组赋值范围; 迭代数组并将所有数组值设置为2; 分配回范围

方法2不到一秒,方法1在我的电脑上花费> 4秒。

在这个例子中,它迭代了数组,但是你可以使用更less的代码行,只是做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 

我相信数组的效率更高,在使用大量数据时使用它们。

你会使用这样的东西,在循环的开始处添加一个断点,并使用本地窗口来查看数组a。

 Dim a() As Variant a = Range("a1:a10").Value For i = 1 To UBound(a) Next i