我在vba中编写了一个循环程序,每次都会将大量数据粘贴到新的工作表中。实际上它粘贴了计算出来的公式。完成所有计算大约需要 40 秒。不幸的是,下一个循环不会等待 40 秒,而是在下一张表中填充数据。这需要很多资源。为了让一个循环等待一点,但仍然要执行计算,我使用了 userform,它出现了 40 秒,然后它将被卸载并在下一个循环中使用。用户表单的目的是允许在下一张表中的计算开始之前完成计算。这种策略有一个缺点,因为当用户表单处于事件状态时,后台的计算会卡住。可以将 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
最佳答案
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
关于VBA:在后台计算工作表,同时消息用户窗体处于事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34088885/