Excel VBA等待Application.calculatefull

时间:2014-10-14 07:15:10

标签: excel vba excel-vba

当我调用Application.calculatefull并在下一个语句中放置一个断点时,我在状态栏中看到处理器在一段时间后处理但已经到达下一行代码。

我检查了论坛,人们建议使用DoEvents。在我的情况下,这是一个问题。由于工作表有很多公式,并且有些公式在第一次运行后显示错误的结果虽然公式是正确的,所以当我为工作表调用calculateFull时,它会更正它但不等待

如果我使用DOEvents,则CalculateFull不会更新工作表。

所以我正在解决问题。

请建议我如何等待处理器完成对application.CalculationFull的处理。之后只进入下一行代码。

我也使用了application.wait但它似乎拿着处理器并且一旦发布它就开始计算然后,这不能解决我的问题。


waittime (1000)
SendKeys "+^%{F9}", True
Application.CalculateFullRebuild

这是我现在使用的代码。当我把断点放在下一行代码时,我看到application.calculatefullRebuild需要几秒钟然后走下一行,当我现在检查活动表时,再过2-3秒,我在状态栏中看到计算(4个处理器):xx%,然后将工作表值更改为正确的值

这是我的问题。当Application.CalculateFullRebuild完成并转到下一行时,我的工作表结果仍然不准确,只有在处理器计算状态栏消息几秒后,工作表才会更新。

我如何等待此操作完成,否则剩下的代码将会收到错误的结果。

2 个答案:

答案 0 :(得分:1)

所以我相信here这个问题有你想要的答案(稍微修改一下,把它放在while循环中):

Do While Application.CalculationState <> xlDone
     DoEvents
Loop

在开始计算过程后立即在代码中粘贴上述循环应该是所有必需的。

答案 1 :(得分:0)

我使用与计时器扩展的Brad相同的解决方案来通知用户是否出错。我发现在没有触发Application.Calculate命令(或CalculateFull)的情况下,excel没有通过DoEvents进行计算。

Const MAXTIME_S = 10
Dim t As Double
t = Timer()

If Application.CalculationState <> xlDone Then Application.Calculate

Do While Application.CalculationState <> xlDone
    DoEvents
    If Timer() - t > MAXTIME_S Then Exit Do
Loop

If Application.CalculationState <> xlDone Then
    MsgBox "Calculation not done. Please restart this Macro.", vbInformation + vbOKOnly, "Aktualisieren"
    Exit Sub
End If