Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA Excel用于带可变列的循环_Excel_Vba_For Loop - Fatal编程技术网

VBA Excel用于带可变列的循环

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 我的第一个问题:

我第一次使用VBA。到目前为止,我成功地建立了一个模型。但是,我仍然希望加快计算速度(我已经关闭了屏幕更新、EnableEvents、xlCalculationAutomatic和DisplayPageBreaks)。我在网上读到,for循环相当耗时。不幸的是,我真的有很多。因此,我的问题是:

假设我有这种类型的代码:

 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