vba - 在 for 循环或数组中处理 Range 值是否更优化

标签 vba excel loops for-loop

我想知道如何更好地填充 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;迭代单元格并将每个单元格值设置为 2
  • 将所有单元格设置为 1;将范围分配给数组;迭代数组并将所有数组值设置为2;分配回范围

  • 在我的电脑上,方法 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/

    相关文章:

    sql - ALTER USER 给出语法错误

    vba - IsError 和 InStr 上的过程调用或参数无效

    用于在 Outlook 邮件中搜索的 Excel VBA

    vba - 使用 VBA 将文本转换为 Excel 中的列

    vba - 将数据复制并粘贴到新工作表后如何更改子范围

    php - 我怎样才能避免在 PHP 的 While 循环中使用 MySQL 查询

    VBA,用于循环效率

    Excel公式找出3列中的日期是否相同?

    r - 获取 R 中警告的确切数量()

    JavaScript 循环正在更改数据源数组以及结果 - 为什么会这样?