ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: fanjy

[原创]使用OnTime方法安排程序执行

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-10-24 14:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
感谢

TA的精华主题

TA的得分主题

发表于 2009-2-25 17:29 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-3-26 19:18 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-10-13 22:01 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-3-24 15:01 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-6-15 17:01 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-8-26 15:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
正在找这方面的资料,多谢楼主!

TA的精华主题

TA的得分主题

发表于 2011-10-22 08:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个很有用!

TA的精华主题

TA的得分主题

发表于 2012-5-28 17:32 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-7-21 14:29 | 显示全部楼层
使用OnTime安排执行过程
你可能需要设计Excel工作簿定期并自动地运行一个过程。例如,你可能想每隔几分钟从数据源中更新数据。使用VBA,你能执行Excel应用程序的OnTime方法指令Excel在给定的时间去运行某过程。通过编写代码使程序自已调用OnTime方法,能使VBA代码定期自动执行。本篇文章描述处理这种情况的VBA过程。
介绍
OnTime方法要求指定日期和时间以及要运行的过程作为参数,重要的是要记住具体地告诉Excel什么时候运行这个过程而不是从当前时间的偏差。为了取消一个未执行的OnTime过程,你必须经过该过程计划要运行的确切的时间,你不能够告诉Excel取消下一个计划执行的过程。因此,建议将安排过程开始运行的时间存放在一个公共的(或全局)变量中,该变量作用于所有的代码。然后,你能使用所存储时间的变量去安排运行或取消事件。下面的示例代码存储了所运行过程的名称和重复执行的时间间隔在公共的常量中,当然这不是必需的。
Public RunWhen As Double
Public Const cRunIntervalSeconds = 120    ' two minutes
Public Const cRunWhat = "The_Sub"
开始一个定时的过程
为开始这个过程,使用一个名为 StartTimer的子程序。代码如下:
Sub StartTimer()
RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)
Application.OnTime earliesttime:=RunWhen, procedure:=cRunWhat, _
schedule:=True
End Sub
将比当前时间多两分钟的日期和时间存放在RunWhen变量中,然后调用OnTime方法指令Excel何时运行cRunWhat过程。
“The_Sub”是一个字符串变量,Excel将在合适的时间运行该过程。下面是该过程代码示例:
Sub The_Sub()
'
' your code here
'
StartTimer
End Sub
注意The_Sub子程序的最后一行调用了StartTimer过程,再次重复运行这个过程。并且当The_Sub过程下次被OnTime调用时,将再次调用StartTimer来重复执行它自已。这就是如何执行周期循环的方法。
停止一个定时的过程
有时,当关闭工作簿时或者满足某个条件时需要停止定时执行的过程。由于OnTime方法是Application对象的一部分,简单地关闭已创建事件的工作簿不会取消对OnTime的调用。一旦Excel自身保持运行,它将执行OnTime过程。
为了停止OnTime过程,必须对OnTime方法指定确切的时间,这就是我们将时间作为公共的变量存放在RunWhen中的原因。否则,没办法知道过程计划执行的确切时间。(所计划的时间像OnTime方法中的一把“钥匙”,如果没有它,就没有通往事件的入口)
下面是一个名为StopTimer的子过程,它将停止要执行的OnTime过程。
Sub StopTimer()
   On Error Resume Next
   Application.OnTime earliesttime:=RunWhen, _
       procedure:=cRunWhat, schedule:=False
End Sub
这个子程序使用了和StartTimer子程序相同的OnTime语法,将schedule参数设置为False告诉Excel取消该过程的执行。你可能想在Auto_Close宏或Workbook_BeforeClose事件中包括一个对该过程的调用。在StopTimer子程序中,使用On Error Resume Next语句忽略当你企图删除一个不存在的过程时可能产生的任何错误。
使用Windows计时器
除了Excel的OnTime方法外,你能使用Windows API库提供的Timer函数。在某些情况下,使用API过程比使用OnTime方法更容易:第一,你告诉Windows需要计时器发生的时间间隔而不是某天的特定时间;第二,API过程将自动更新,计时器将每隔一段时间发生直到你告诉它停下为止。
这些过程需要在Office2000或更新的版本中运行,因为我们使用了AddressOf函数,他们不会在Excel97或更早的版本中运行。
为使用Windows计时器,将下面的代码放在一个标准代码模块中。
Public Declare Function SetTimer Lib "user32" ( _
    ByVal HWnd As Long, ByVal nIDEvent As Long, _
    ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" ( _
    ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
Public TimerID As Long
Public TimerSeconds As Single
Sub StartTimer()
    TimerSeconds = 1 ' how often to "pop" the timer.
    TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOf TimerProc)
End Sub
Sub EndTimer()
    On Error Resume Next
    KillTimer 0&, TimerID
End Sub
Sub TimerProc(ByVal HWnd As Long, ByVal uMsg As Long, _
    ByVal nIDEvent As Long, ByVal dwTimer As Long)
    '
    ' The procedure is called by Windows. Put your
    ' timer-related code here.
    '
End Sub
执行StartTimer过程开始计时。变量TimerSeconds指明计时器之间间隔有多少秒。这个值可能少于1。注意SetTimer过程在毫秒范围内取值,于是当我们调用SetTimer时我们通过将TimerSeconds乘以1000来增加间隔值。Windows每隔一段计时器发生的时间来调用TimerProc过程。你可以将这个过程命名为你想要的名字,但你必须如例子中所示声明这些参数变量。如果你变换了过程的名称,那么要确保你也变换了SetTimer中的名字。Windows将传递下面的值到TimerProc过程:
HWnd  Excel应用程序的Windows句柄。一般可忽略这个参数。
uMsg  值为275。一般可忽略这个参数。
nIDEvent 这个值通过SetTimer获得TimerID变量返回。如果你不止一次调用SetTimer,你能检查nIDEvent参数确定哪次调用SetTimer导致调用该过程。
dwTimer 计算机运行的毫秒数。相同的值通过GetTickCount Windows过程被返回。
调用EndTimer过程来停止计时器循环,这个过程调用KillTimer,通过SetTimer返回的值传递给它。
API计时器和Excel的Ontimer过程间有两个重要的区别:第一,API计时器有着更精确的时间间隔(达到1秒或更少);第二,即便Excel处在编辑模式(也就是说,当你正在编辑单元格时),API计时器也将执行。注意,当Excel处于编辑模式时,如果TImerProc企图修改工作表单元格,Excel将会立即退出。(By fanjy in 2006-6-18)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-25 13:09 , Processed in 0.038267 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表