VBA:使用多个For循环,还是一个大?

我最近一直在想,在效率方面哪个更好?使用多个For循环还是一个包含许多操作的大循环?

我使用SQL数据库的17列中的50k-100k行。

现在,一个代码示例:

z = Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To z If Cells(i, 15) <> 0 Then Cells(i, 19) = 1 Else Cells(i, 19) = 0 Next i For i = 2 To z Cells(i, 20) = Val(Left(Cells(i, 2), 2)) Next i For i = 2 To z Select Case Cells(i, 18).Value Case Is = 1 Cells(i, 29).Value = 1 Case Is = 2 Cells(i, 29).Value = 1.6 Case Is = 3 Cells(i, 29).Value = 2.8 End Select Next i For i = 2 To z Cells(i, 30) = Val(Right(Cells(i, 14), 1)) Next i For i = 2 To z Cells(i, 31) = ((Cells(i, 18) + 1) * Cells(i, 16) * Cells(i, 17)) / 1000000 Cells(i, 31).NumberFormat = "0.00" Next i 

我的问题是:是否明智地做这些操作的列(每个列单独的For循环)或行(一个大循环包含每个logging的所有操作)?

从整体上看,性能瓶颈将在于获取数据logging,而不是如何构build循环。

你最好的目标是可读性,而不是试图过度优化那些对执行时间可以忽略不计的代码。

您的代码将非常缓慢,因为您正在对对象模型进行大量调用以检索单个单元格中的值。 每次通话都有很大的开销。

将所有需要的值读入variables数组会更快:

 dim vArr as variant vArr=Range("A1").resize(z,31).value2 

然后在将处理的数组返回到工作表之前处理生成的二维数组

如果您正在使用数据库中的excelvalidationlogging,那么您可以应用big for循环; 但我甚至可以build议使用find()方法,如果你有循环内循环。 (Find()方法可以提高性能)

我第二Bathsheba至于什么瓶颈手术会是。 但是,只要你有一个长的macros插入大量的数据,你可能想把这一块代码放在第一个循环之前

 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False 

而这一个你的行动结束时:

 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True 

它将首先禁用屏幕更新,事件和公式重新计算,并在完成操作后重新启用它。

根据你正在进行的操作的种类,我发现这个优化macros的速度高达75%。