在每隔10秒运行一次Application.OnTime之后,Excel最终会变得非常不稳定,迫使我在单元格中双击以强制其刷新,以及其他看似随机的行为。要经常运行任务,同时仍然允许EXCEL GUI保持响应性或可靠性,是否需要其他替代方案?
为了测试这一点,我确实运行了一个简单的VBA函数来修改多台计算机上的一些单元,问题最终仍然存在,几分钟或几个小时后,或者如果每5秒运行一次,问题就会立即出现。
一些伪代码:
Foo(){
wait 10 seconds (non blocking)
Foo()
}发布于 2019-12-15 21:20:24
您可以在模块级别创建计时器。一个简单的定时器,但要注意所有必要的变量设置。否则,Excel可能会崩溃。您也可以创建一个非常稳定的计时器,但这是一个完整的项目背后的想法。无论如何,我可以在我的项目中使用这样的计时器而不会出现问题。令人欣慰的是,一旦启动,即使在单元格编辑模式中,计时器也可以正常工作。使用下面的代码创建一个标准模块(我一直将其命名为"Timer_module"):
Option Explicit
Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As LongPtr, _
ByVal nIDEvent As LongPtr, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Declare PtrSafe Function KillTimer Lib "user32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
Private TimerID As LongPtr
Private xTimer As Long, howMany As Long
Sub StartTimer(TimerSeconds As Long, howManyTimes As Long)
howMany = howManyTimes
TimerID = SetTimer(0&, 0&, TimerSeconds * 1000, AddressOf T_Pr)
End Sub
Sub StopTimer()
On Error Resume Next
KillTimer 0, TimerID
xTimer = 0
End Sub
Sub T_Pr(ByVal hWnd As Long, ByVal uMsg As Long, _
ByVal nIDEvent As Long, ByVal dwTimer As Long)
xTimer = xTimer + 1: Debug.Print xTimer, Now
DoEvents
If xTimer = howMany Then StopTimer: Debug.Print "Timer stopped: " & Now
End Sub在另一个模块中,计时器可以简单地调用,如下面的代码所示:
Sub testTimeer()
StartTimer 2, 4
End Sub第一个参数表示在计时器函数执行某些操作之前必须经过的秒数。代码可以很容易地适应毫秒级的工作。第二个参数表示定时器停止后,定时器函数运行的次数。这只是一个例子,它可以很容易地进行调整,以满足您的需求。所以你可以将它设置为只执行一次,你可以在需要的时候调用` `StopTimer()‘过程(例如,从循环中)等等……
附注:这样的计时器可以很容易地链接到表单。你必须注意TimerID的定义。它应该是窗体句柄。例如,以这种方式:
TimerID = GetActiveWindow这段代码必须是初始化事件表单的一部分,当然,声明的变量必须是Public ...您必须注意,当计时器运行时,所有剩余的运行代码都要非常稳定,并且有错误处理程序能够在出现错误的情况下停止计时器。
https://stackoverflow.com/questions/59342215
复制相似问题