明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9743|回复: 6

在VBA里实现定时事件触发器Timer

[复制链接]
发表于 2005-5-12 15:17:00 | 显示全部楼层 |阅读模式

众所周知,在VB的标准控件里含有一个可以定时触发事件的Timer控件。可是,在VBA里却没有提供这一控件。而事实上,我们编写的很多程序都经常要用到后台运行或是定时触发某一事件的功能,怎么办呢?其实很简单,我们可以自己编写一个Timer控件。

VBA的工程里添加一个类模块,并将它命名为Timer,然后将下面的代码写入到这个模块中。

Option Explicit

'TimerEnd变量用于控制定时事件的状态,False表示启动定时事件,True表示停止定时事件

Private TimerEnd As Boolean

'Timer事件是一个每隔固定秒数自动触发的事件,该秒数由StartTimer方法的Interval参数控制

Public Event Timer()

'StartTimer方法用于启动定时事件,该方法的Interval参数用于设置定时事件的间隔秒数(1-32767之间的整数)

Public Sub StartTimer(ByVal Interval As Integer)

Dim Starttime As Single

'Timer函数返回从午夜开始到现在经过的秒数

Starttime=Timer

TimerEnd=False

If Interval<1 Then

MsgBox "Interval参数的值必须是1-32767之间的整数",,"错误"

Exit Sub

End If

'用循环结构重复触发Timer事件

Do

If TimerEnd Then Exit Do

If Timer>=Starttime+Interval Then

Starttime=Timer

RaiseEvent Timer

End If

'在循环过程中,用DoEvents函数将控制权转让给操作系统,这样可以实现后台运行定时事件的效果。

DoEvents

Loop

End Sub

'EndTimer方法用于停止定时事件

Public Sub EndTimer()

TimerEnd=True

End Sub

Private Sub Class_Terminate()

TimerEnd=True

End Sub

Private Sub Class_Initialize()

TimerEnd=False

End Sub

这样,便做好了一个可以定时触发事件的Timer类。下面只需要在相应的模块里添加这个类的实例,便可以像使用VB中的Timer控件一样使用了。

下面是一个具体的VBA程序例子。该例运行后可以通过单击窗体让窗体每隔1秒向右移动一段距离(而且不会影响窗体上其它控件的使用)。

首先,在VBA工程里添加一个用户窗体UserForm1,然后在其代码编辑器里写入下面的代码:

Option Explicit

'声明MyTimer为带有事件的模块级Timer对象变量

Private WithEvents MyTimer As Timer

'在UserForm的初始化事件里生成Timer的一个实例

Private Sub UserForm_Initialize()

Set MyTimer=New Timer

End Sub

'在UserForm的click事件里启动定时触发器,设置间隔秒数为1

Private Sub UserForm_Click()

MyTimer.StartTimer 1

End Sub

'在UserForm的结束事件里关闭定时触发器

Private Sub UserForm_Terminate()

MyTimer.EndTimer '一定要在程序结束前调用EndTimer方法

Set MyTimer=Nothing

End Sub

'在Timer事件里书写需要定时重复运行的代码

Private Sub MyTimer_Timer()

UserForm1.Left=UserForm1.Left+5

End Sub

其实,如果只是编写一段小程序,那也不一定非要制作一个Timer类,只要将需要定时重复运行的代码放入到一个循环中即可。另外,在循环中可以利用Timer函数控制间隔秒数,而通常也必须在循环中添加DoEvents函数,以便让该段代码在后台运行。最后,千万不要忘记书写循环的跳出条件,否则,这段后台执行的代码将会一直驻留内存,即使窗体被卸载。

 楼主| 发表于 2005-5-12 15:38:00 | 显示全部楼层
范例程序:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2005-5-12 15:51:00 | 显示全部楼层
看了以后很有启发.


原来有人贴过用api来实现Timer的.经实践很不稳定.


有关窗体和事件的操作会导致致命错误.
发表于 2005-10-10 17:03:00 | 显示全部楼层

楼主能不能用控制直线,让他水平移动,而不是让UserForm移动呢?

 楼主| 发表于 2005-10-11 14:06:00 | 显示全部楼层
当然可以!选择一条直线,设定两点,直线的Move方法实现.
发表于 2009-1-19 11:02:00 | 显示全部楼层

CPU 占用还是很高啊

有办法降低CPU占用吗

发表于 2009-1-21 10:35:00 | 显示全部楼层

占用率肯定高啦,一直在循环调用时间查询函数

基本原理的问题,与系统底层连接不够,最好还是调用系统内部的相关函数,否则代码低效

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 05:21 , Processed in 0.198045 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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