我在vba中编写了一个循环过程,每次都会将大量数据粘贴到新工作表中。实际上它会粘贴计算出来的公式。完成所有计算需要大约40秒。不幸的是,下一个循环不会等待40秒并填充下一张表中的数据。这需要大量资源。为了使循环等待一点,但仍然执行计算我使用了userform,它出现了40秒,而不是它将被卸载并在下一个循环中使用。 userform的目的是允许在下一张表中的计算开始之前完成计算。这种策略有一个缺点,因为当useform处于活动状态时,后台的计算会冻结。可以将useform的选项更改为showmodal false,但是每次新循环开始时我都无法上传和卸载它。此外,我不确定天气仍在非活动表中计算的公式。我必须提到每次激活excel加载项时表单中的公式,即使打开选项手动计算,我也无法添加以等待计算。
如果有人知道如何推迟循环而不是使完整的Excel应用程序等待(Application.wait或ontime方法不起作用),我将非常感谢帮助。我还试图激活和停用事件,切换到手动计算并返回。这也无济于事,所有数据都是一次计算出来的。
另一篇文章中描述的方法对我没有用,所有公式仍在同一时间计算:
Application.Calculate
If Not Application.CalculationState = xlDone Then
DoEvents
End If
我将原始代码复制到新工作表:
For raw_i = 1 To 3
Set o = GetObject("d:\formulas.xlsx")
Set Sheet_i = Worksheets.Add(after:=Worksheets(Worksheets.Count))
Sheet_i.Cells(1, 1).Formula = o.Worksheets("Sheet1").Cells(raw_i, 1).Formula
Set o = Nothing
LoadForm
next raw_i
答案 0 :(得分:0)
VBA不支持多个进程线程 - 有一个执行路由,如果你暂停它,那么你暂停整个执行。这是全有或全无。
最好的希望是While
循环:
While Application.CalculationState <> xlDone
DoEvents
Wend
这将循环直到计算结束。
回复您最近的修改:
尝试将主循环更改为:
For raw_i = 1 To 3
Set o = GetObject("d:\formulas.xlsx")
Set Sheet_i = Worksheets.Add(after:=Worksheets(Worksheets.Count))
Sheet_i.Cells(1, 1).Formula = o.Worksheets("Sheet1").Cells(raw_i, 1).Formula
Sheet_i.Calculate
DoEvents
Set o = Nothing
Next