《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。
类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入,有必要理解这些抽象的理论知识。对象,类,过程,方法,属性,事件,接口,接口如何实现等等。掌握了这些理论,不仅对于VBA这种寄生语言的实质有所深入的理解,也对自然界的很多事物将同样有所感悟。目前,这套教程程序文件已经通过32位,64位两种office系统测试。
这套教程共两册,八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:VBA中类的解读及应用第八讲:实现定时器功能的自定义类事件
【分享成果,随喜正能量】千万别把运气当实力,别把平台当本事。认清自己的实力,知道自己有几斤几两,不低估风险,不高估自己,才不会被时代淘汰 。因为这个世界上,没有稳定的工作,只有赖以生存的实力。 。
第八讲 用户自定义类事件
2 实现定时器功能的自定义类事件代码实例讲解
实例:下面的示例实现一个定时器功能。代码实现了所有与事件相关的方法、属性和语句,包括Event 语句。该示例使用一个窗体,该窗体有两个按钮,以及两个文本框。单击按钮后,第一个文本框显示提示内容,第二个文本框中时钟开始计时。
建立一个类,命名为mytime
Option Explicit
Public Event UpdateTime(ByVal mynow As Double)
Public Event dabiao()
Public Sub TimerTask(ByVal biaozhun As Double)
Dim myStart As Double
Dim mySecond As Double
Dim myFar As Double
myStart = Timer
myFar = myStart
Do While Timer < myStart + biaozhun
If Timer - myFar >= 1 Then
myFar = myFar + 1
RaiseEvent UpdateTime(Timer - myStart)
End If
Loop
RaiseEvent dabiao
Do While Timer >= myStart + biaozhun
If Timer - myFar >= 1 Then
myFar = myFar + 1
RaiseEvent UpdateTime(Timer - myStart)
End If
Loop
End Sub
建立一个窗体:
Option Explicit
Private WithEvents mText As mytime
Private Sub CommandButton1_Click()
TextBox1.Text = "开始计时:"
TextBox2.Text = "0"
mText.TimerTask (9)
End Sub
Private Sub CommandButton2_Click()
End
End Sub
Private Sub mText_dabiao()
TextBox1.Text = "已经达到标准"
DoEvents
End Sub
Private Sub mText_UpdateTime(ByVal mynow As Double)
TextBox2.Text = Str(Format(mynow, "0"))
DoEvents
End Sub
Private Sub UserForm_Initialize()
TextBox1.Text = ""
TextBox2.Text = ""
Set mText = New mytime
End Sub
Private Sub UserForm_Terminate()
End
End Sub
代码的运行过程及解释:
1) 在窗体的构建过程中TextBox1.Text = "";TextBox2.Text = "";Set mText = New mytime;这里mytime 是一个类,Set mText = New mytime就是将mText实例了一个新的mytime的类。
2) 我们点击“开始按钮”,这个时候TextBox1.Text = "开始计时:",然后在第二个文本框中显示计时的开始为0, TextBox2.Text = "0",然后执行类的TimerTask过程,(什么是过程呢?其实就是方法、函数、事件的总称).此处的过程指的是方法,会传递一个参数9,mText.TimerTask (9)。
3) 我们看看上述类的过程是如何执行的. mText.TimerTask (9)
Public Sub TimerTask(ByVal biaozhun As Double)
Dim myStart As Double
Dim mySecond As Double
Dim myFar As Double
myStart = Timer
myFar = myStart
Do While Timer < myStart + biaozhun
If Timer - myFar >= 1 Then
myFar = myFar + 1
RaiseEvent UpdateTime(Timer - myStart)
End If
Loop
RaiseEvent dabiao
Do While Timer >= myStart + biaozhun
If Timer - myFar >= 1 Then
myFar = myFar + 1
RaiseEvent UpdateTime(Timer - myStart)
End If
Loop
End Sub
上面的过程中先定义了几个变量,然后将执行一个循环,循环执行到RaiseEvent UpdateTime(Timer - myStart)会触发事件UpdateTime(Timer - myStart).
4) 关于UpdateTime(Timer - myStart)事件.这个事件是在类模块中Public Event UpdateTime(ByVal mynow As Double)进行声明的相应的是myclass事件,我们回到窗体的代码,看看这个事件的过程。
Private Sub mText_UpdateTime(ByVal mynow As Double)
TextBox2.Text = Str(Format(mynow, "0"))
DoEvents
End Sub
这个事件就是在textbox2的文本框中显示一个值,这个值是TimerTask传递过来的.显示值后,会DoEvents。交出程序的控制权,也就是说程序会向下进行。
5) 程序向下进行仍是执行的是第一个循环语句。
6) 当第一个循环语句结束时,会执行RaiseEvent dabiao,会触发dabiao事件,这个事件同样也是在类模块中声明的Public Event dabiao(),是mText的事件。仍是回到窗体代码看看这个事件过程:
Private Sub mText_dabiao()
TextBox1.Text = "已经达到标准"
DoEvents
End Sub
这个时间在文本框中显示已经达到标准。执行完后交出程序的控制权。
7) 程序执行完上面的代码后将向下执行第二个循环。这个循环和上面第一个循环类似。
好,我们看看程序的运行:
当点击结束,程序将停止运行。
今日内容回向:
1 如何利用一个类的方法?
2 方法、事件的区别是什么?
本讲内容参考程序文件:VBA-CLASS(1-28).xlsm
本讲内容参考程序文件:VBA-CLASS(1-28).xlsm
我20多年的VBA实践经验,全部浓缩在下面的各个教程中: