当我调用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
完成并转到下一行时,我的工作表结果仍然不准确,只有在处理器计算状态栏消息几秒后,工作表才会更新。
我如何等待此操作完成,否则剩下的代码将会收到错误的结果。
答案 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