循环遍历具有多列和多行的数组

Posted

技术标签:

【中文标题】循环遍历具有多列和多行的数组【英文标题】:Loop through arrays with multiple columns and rows 【发布时间】:2018-01-25 18:02:33 【问题描述】:

我进行了大量搜索以尝试优化此代码。我已经大大减少了运行时间,但我似乎找不到其他任何东西(注意:我已经完成了所有的 xlcalculationmanual 和 screenupdating = false jazz)

这是我当前循环的基本结构。该矩阵目前向下 5 行,其中包含要循环的数据和要循环的 9 行。

Application.Calculation = xlCalculationManual
i = 0
Do While wsc1.Cells(10, i + 65) <> "things" And wsc1.Cells(10, i + 65) <> "thing2" And wsc1.Cells(10, i + 65) <> ""
    j = 0
    Do While wsc1.Cells(j + 11, 64) <> ""
        wsc.Cells(109, 3) = wsc1.Cells(j + 11, 64)    'rows
        wsc.Cells(109, 6) = wsc1.Cells(10, i + 65)    'columns
        Application.Calculation = xlCalculationAutomatic
        Application.Calculation = xlCalculationManual
        wsc1.Cells(j + 11, i + 65) = wsc.Range("O6")    'Print
        j = j + 1
    Loop
    i = i + 1
Loop

我认为我的下一个最佳选择是将列/行向量存储为变量并循环遍历它?

谢谢

【问题讨论】:

O6 单元格中的公式是什么?您是否必须依赖根据 C109 和 F109 中的值重新计算 O6 中的结果?这可以通过代码来完成。 我愿意。它链接到循环运行时重新计算的内容。 O6 基本上链接到一个更大的计算,该计算会根据我在这里循环的内容而变化。 如果您可以编写代码以在 VBA 变体数组中工作,并且只读取/写入工作表一次(嗯,两次 - 开始一次,结束一次),我的经验是与访问多个工作表相比,您可能会看到速度提高了 10 倍。 你能举个例子说明你在说什么吗? 【参考方案1】:

你也可以添加这些行吗?

Application.EnableEvents = False
Application.ScreenUpdating = False ' it seems that you already have this one?

【讨论】:

我已经添加了。这是比那些应用程序更大的优化。优化。【参考方案2】:

试试这个。然而,不得不等待工作表计算是一个相当困难的减速,如果我们不能将计算放入代码中,那么除此之外真的没有什么可以提高性能的了。

Sub tgr()

    Dim wsc1 As Worksheet
    Dim CValues As Variant
    Dim FValues As Variant
    Dim Results() As Variant
    Dim i As Long, j As Long
    Dim xlCalc As XlCalculation

    With Application
        xlCalc = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With
    On Error GoTo CleanExit

    Set wsc1 = ActiveWorkbook.ActiveSheet
    With wsc1.Range("BL11", wsc1.Cells(wsc1.Rows.Count, "BL").End(xlUp))
        If .Row < 11 Then Exit Sub 'No data
        If .Cells.Count = 1 Then
            ReDim CValues(1 To 1, 1 To 1)
            CValues(1, 1) = .Value
        Else
            CValues = .Value
        End If
    End With

    With wsc1.Range("BM10", wsc1.Cells(10, wsc1.Columns.Count).End(xlToLeft))
        If .Column < Columns("BM").Column Then Exit Sub 'No data
        If .Cells.Count = 1 Then
            ReDim FValues(1 To 1, 1 To 1)
            FValues(1, 1) = .Value
        Else
            FValues = .Value
        End If
    End With

    ReDim Results(1 To UBound(CValues, 1), 1 To UBound(FValues, 2))

    For i = LBound(CValues, 1) To UBound(CValues, 1)
        For j = LBound(FValues, 2) To UBound(FValues, 2)
            wsc1.Range("C109").Value = CValues(i, 1)
            wsc1.Range("F109").Value = FValues(1, j)
            wsc1.Calculate
            Results(i, j) = wsc1.Range("O6").Value
        Next j
    Next i

    wsc1.Range("BM11").Resize(UBound(Results, 1), UBound(Results, 2)).Value = Results

CleanExit:
    With Application
        .Calculation = xlCalc
        .ScreenUpdating = True
        .EnableEvents = True
    End With
End Sub

【讨论】:

我认为这通常是我试图自己编程的。我发布的代码中的 wsc1 和 wsc 来自我定义的单独工作表,我想我的主要问题是如何正确地循环遍历数组,你在这里使用它,但我可能需要弄乱它,因为我的版本给了我一个错误。这至少让我开始

以上是关于循环遍历具有多列和多行的数组的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何从具有多列的数据框中循环遍历每两列组合以进行聚类?

循环遍历数据表

如何循环遍历传递给具有 Vuex 存储和计算属性的组件的对象数组?

循环遍历具有可观察属性的 Knockout 可观察对象数组

循环遍历具有子数组的嵌入式文档并将它们显示在 EJS 文档上

连续循环遍历数组以创建水平股票行情