首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel Application.OnTime导致故障行为是否有其他替代方案?

Excel Application.OnTime导致故障行为是否有其他替代方案?
EN

Stack Overflow用户
提问于 2019-12-15 16:10:10
回答 1查看 153关注 0票数 0

在每隔10秒运行一次Application.OnTime之后,Excel最终会变得非常不稳定,迫使我在单元格中双击以强制其刷新,以及其他看似随机的行为。要经常运行任务,同时仍然允许EXCEL GUI保持响应性或可靠性,是否需要其他替代方案?

为了测试这一点,我确实运行了一个简单的VBA函数来修改多台计算机上的一些单元,问题最终仍然存在,几分钟或几个小时后,或者如果每5秒运行一次,问题就会立即出现。

一些伪代码:

代码语言:javascript
复制
Foo(){
wait 10 seconds (non blocking)
Foo()
}
EN

回答 1

Stack Overflow用户

发布于 2019-12-15 21:20:24

您可以在模块级别创建计时器。一个简单的定时器,但要注意所有必要的变量设置。否则,Excel可能会崩溃。您也可以创建一个非常稳定的计时器,但这是一个完整的项目背后的想法。无论如何,我可以在我的项目中使用这样的计时器而不会出现问题。令人欣慰的是,一旦启动,即使在单元格编辑模式中,计时器也可以正常工作。使用下面的代码创建一个标准模块(我一直将其命名为"Timer_module"):

代码语言:javascript
复制
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

在另一个模块中,计时器可以简单地调用,如下面的代码所示:

代码语言:javascript
复制
Sub testTimeer()
  StartTimer 2, 4
End Sub

第一个参数表示在计时器函数执行某些操作之前必须经过的秒数。代码可以很容易地适应毫秒级的工作。第二个参数表示定时器停止后,定时器函数运行的次数。这只是一个例子,它可以很容易地进行调整,以满足您的需求。所以你可以将它设置为只执行一次,你可以在需要的时候调用` `StopTimer()‘过程(例如,从循环中)等等……

附注:这样的计时器可以很容易地链接到表单。你必须注意TimerID的定义。它应该是窗体句柄。例如,以这种方式:

代码语言:javascript
复制
TimerID = GetActiveWindow

这段代码必须是初始化事件表单的一部分,当然,声明的变量必须是Public ...您必须注意,当计时器运行时,所有剩余的运行代码都要非常稳定,并且有错误处理程序能够在出现错误的情况下停止计时器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59342215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档