VBA Excel用于带可变列的循环
我第一次使用VBA。到目前为止,我成功地建立了一个模型。但是,我仍然希望加快计算速度(我已经关闭了屏幕更新、EnableEvents、xlCalculationAutomatic和DisplayPageBreaks)。我在网上读到,for循环相当耗时。不幸的是,我真的有很多。因此,我的问题是: 假设我有这种类型的代码:VBA Excel用于带可变列的循环,excel,vba,for-loop,Excel,Vba,For Loop,我第一次使用VBA。到目前为止,我成功地建立了一个模型。但是,我仍然希望加快计算速度(我已经关闭了屏幕更新、EnableEvents、xlCalculationAutomatic和DisplayPageBreaks)。我在网上读到,for循环相当耗时。不幸的是,我真的有很多。因此,我的问题是: 假设我有这种类型的代码: For p = 1 To Periods Demand(p) = Worksheets("Sheet1").Cells(3, 1 + p) Next p 我的第一个问题:
For p = 1 To Periods
Demand(p) = Worksheets("Sheet1").Cells(3, 1 + p)
Next p
我的第一个问题:这个for循环真的会减慢运行时间吗?
第二个问题:如何重写它,从而加快计算速度
我一直在尝试以下方法:
Demand = Worksheets("Sheet1").Range(Worksheets("Sheet1").Cells(3, 2), Worksheets("Sheet1").Cells(3, 1 + Periods))
但不幸的是,这似乎不起作用。我已经在谷歌上搜索过了,但似乎没有找到答案
非常感谢您的帮助 花时间的不是
循环的,而是你在循环中所做的。使用Excel VBA,您可以做的最慢的事情之一就是与工作表交互
你可以考虑的一个快速变化是:
With Worksheets("Sheet1")
For p = 1 To Periods
Demand(p) = .Cells(3, 1 + p)
Next p
End With
。。。这意味着您的代码知道它总是处理同一个工作表,而不必在每次循环时都查找正确的工作表。您可能不会注意到太多的差异,但您已经从每个周期查找一个工作表变成了每次运行一个工作表。不过,每个时段仍有一个单元格查找
您可以对工作表进行一次调用:在一次调用中获取所有值并完全避免循环:
Demand = Worksheets("Sheet1").Cells(3, 2).Resize(1, Periods).Value
这将在Demand
中得到一个1 x周期数组。试试看-使用“查看…本地窗口”来查看您得到了什么。这实际上取决于您的末端计数器有多大以及您的步长有多小。如果终端计数器>500K(非常大),您可能会经历明显的减速
但是,你应该考虑以下几点:
Demand = Worksheets("Sheet1").Range(Worksheets("Sheet1").Cells(3, 2), Worksheets("Sheet1").Cells(3, 1 + Periods))
优化循环内的指令
您的速度更可能受到循环内指令的影响。您最好先优化它们,然后再考虑是否应该为每个
使用,还是为循环
使用
<> >:使用<代码> .Wr.(.TrimeRo.<代码)>一个循环内的属性通常会降低代码的速度,因为Excel会考虑一个范围为12百万个单元格的行。这正是让你的代码慢下来的原因
避免使用重复引用
With
语句是提高代码速度的好方法。只要确保循环嵌套在With
语句中即可。这样,VBA就不必多次查看家长的参考资料
@Mike Woodhouse的回答是一个很好的例子,说明了如何使用With
语句来提高代码的速度
VBA将在一次参考工作表(“Sheet1”)
的情况下执行指令:
然而,在您的旧代码(如下)中,VBA执行您的指令,并在执行时调用时段时间工作表(“Sheet1”)
非常感谢你的帮助。快速的变化已经是一个巨大的进步。但是,我在尝试单次通话时遇到了一些问题。我得到这个错误:“运行时错误'13':类型不匹配”。你知道哪里出了问题吗?你是在申报需求吗?类似于暗淡需求(1到周期)
?如果是这样,请尝试删除类型声明,Dim Demand
或显式将其设置为变量
:Dim Demand As Variant
。否则,正如前面提到的,我们需要看到更多的代码,特别是导致问题行的代码…再次感谢。我确实提出了要求。现在一切正常。
For p = 1 To Periods
Demand(p) = Worksheets("Sheet1").Cells(3, 1 + p)
Next p