循环遍历具有多列和多行的数组
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 存储和计算属性的组件的对象数组?