VBA:要在后台计算工作表,而消息用户表单处于活动状态

时间:2015-12-04 12:53:18

标签: vba excel-vba userform excel

我在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 

1 个答案:

答案 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