循环嵌套数组与arrays更快

我有一个工作表上的数据数组。 我需要循环访问数组,根据特定条件评估每行,然后采用条件匹配的行并将其复制到另一个工作表中。 我写了下面的代码来完成这个过程。

但是,循环需要很长时间。 大约需要5分钟的时间。 我需要它在不到30秒的时间内运行。 我在SO上读取以下内容: 在VBA(excel)中循环行的最有效/最快的方法是什么? 这导致我创build数组。 我也试图保持代码简单。 我closuresscreenupdating和enableevents。

我能做些什么来使这个过程更快? 感谢您的帮助。

Sub tester() Dim vData() As Variant Dim R As Long Dim C As Long Dim LastRow1 As Long Dim rng1 As Range, rng2 As Range Set sh3 = Sheets("ABC") Set sh5 = Sheets("XYZ") Application.ScreenUpdating = False Application.EnableEvents = False LastRow1 = sh3.Cells(Rows.Count, "A").End(xlUp).Row vData = Range("A1:N" & LastRow1).Value sh5.Range("B3:AV10000").ClearContents For R = 1 To UBound(vData, 1) For C = 1 To UBound(vData, 2) If sh3.Cells(R, "G").Value <= Date Then 'if date is prior to today then If sh3.Cells(R, "J").Value = "C" Then If sh3.Cells(R, "D").Value > 0 Then If sh3.Cells(R, "I").Value >= sh3.Cells(R, "H").Value Then Set rng1 = sh3.Range("A" & R & ":N" & R) Set rng2 = sh5.Range("B" & R & ":O" & R) rng1.Copy rng2 Else Set rng3 = sh3.Range("A" & R & ":N" & R) Set rng4 = sh5.Range("B" & R & ":O" & R) rng3.Copy rng4 End If ElseIf sh3.Cells(R, "D").Value < 0 Then If sh3.Cells(R, "I").Value >= sh3.Cells(R, "H").Value Then Set rng5 = sh3.Range("A" & R & ":N" & R) Set rng6 = sh5.Range("B" & R & ":O" & R) rng5.Copy rng6 Else Set rng7 = sh3.Range("A" & R & ":N" & R) Set rng8 = sh5.Range("B" & R & ":O" & R) rng7.Copy rng8 End If End If End If End If Next C Next R Application.ScreenUpdating = True Application.EnableEvents = True End Sub 

根据我的评论,尝试使用Application.Calculation = xlCalculationManualApplication.DisplayAlerts = False来加快速度。

只要一定要把Application.Calculation = xlCalculationAutomaticApplication.DisplayAlerts = True结尾:)

另外 – 通过频繁调用api,你正在损失大量节省时间的数组function。 例:

  if sh3.Cells(R, "G").Value 

应该是一样的事情

  if vData(R,7) 

你可能不需要循环

  For C = 1 to ubound(vData,2) Next C 

你不是在任何地方引用它,它会成指数地增加指令的数量。

尝试使用f8在本地窗口打开的情况下逐步执行代码,并观察已声明的variables的详细情况。

您应该操作数组内的值,而不是在工作表上,只要在过程结束时,您可以在一个指令中replaceactivesheet的值,而不是在循环中的值

只是要谨慎,你的格式不会进入你的数组“vData”,它只是设置使用的范围.value,因此格式将下降,变种数据typesvData将抓住最接近的表观数据types。 这意味着如果某个东西看起来像一个数字,如果它有前导零,即使它是文本,然后将其放到工作表中,那么丢失前导零的方法是在设置api中的值之前格式化单元格,否则excel只是做它最擅长的,我喜欢使用类似的东西

  sh5.cells.NumberFormat = "@"