vba 自定义function返回值_用户自定义类事件

9f14257a935f4de4b1c2d355966bfa91.png

大家好,到上一讲,我们学习了有关类的定义部分,涉及到的概念较多,需要大家仔细地理解。我们今日这讲,将用户自定义事件。我们建立了类,通过对象把类进行了实例化,把灵魂具体到了了肉身,我们就要让这个实例的对象参与各种事件了,由于类是我们自己进行的定义,那么实例的对象要参与的事件我们也是能自己定义的。

定义用户自定义的事件的语法:[Public] Event procedurename [(arglist)]

上述参数中:

1 Public 可选的。指定该 Event 在整个工程中都是可见的。缺省情况下 Events 类型是 Public。应注意,事件只能在所声明的模块中产生。

2 procedurename 必需的。事件的名称;建议大家遵循标准的变量命名约定,但我们也可以自己加入自己的部分习惯。

3 arglist 参数的语法及语法的各个部分如下:[ByVal | ByRef] varname[( )] [As type]

其中:

①ByVal 可选的。表示该参数是按值传递的;

②ByRef 可选的。表示该参数是按地址传递的。ByRef 是缺省设置。

③varname 必需的。代表要传递给过程的参数变量的名称;遵循标准的变量命名约定。

④type 可选的。指传递给过程的参数的数据类型;可以是 Byte、布尔、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(只支持变长)、Object、Variant、用户定义类型或对象类型。

说明:

1 事件被声明之后,就可以使用RaiseEvent 语句来产生该事件。

2 声明事件只能在类模块中声明,如果在标准模块中出现 Event 声明,就会产生语法错误。这也好理解,事件是对我们产生的对象进行的声明,对象是由类产生的。

3 不能声明带返回值的事件。在下面的代码段中,给出了声明事件和产生事件的典型事件:

如下语句:在类模块的模块级中声明一个事件,及触发一个事件:

Public Event UpdateTime(ByVal mynow As Double) SubRaiseEvent

RaiseEvent UpdateTime(Timer - myStart)

注意 可以象声明过程的参数一样来声明事件的参数,但有以下不同:事件不能有带命名参数、Optional参数、或者 ParamArray 参数。事件没有返回值。

产生事件的类是事件源,实现该事件的类则是事件吸收。一个事件源可以有多个针对其所产生的事件的类。事件可以被每个选定出为对象的实例吸收事件的类所触发。

实例:下面的示例实现一个计时器功能。代码说明了所有与事件相关的方法、属性和语句,包括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

建立一个窗体:

0adbf00797589d70d97fb0055ca285f1.png

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 程序执行完上面的代码后将向下执行第二个循环。这个循环和上面第一个循环类似。

好,我们看看程序的运行:

84b34092a0752978a89357a7b252b83e.png

56714945ec9df81c8eaae03108a5fb08.png

当点击结束,程序将停止运行。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

学习有用的东西需要一种不知足的精神,知道什么是自己所需要的,不要蜷缩在一小块自认为天堂的世界里。待到暮年时再去做自欺欺人的言论。要努力提高自己,有一颗充满生机的心灵,把握现在,这才是进取。越是有意义的事情,困难会越多。愿力决定始终,智慧决定成败。不管遇到什么,都是风景。看淡纷争,看轻得失。茶,满也好,少也好,不要计较;浓也好,淡也好,其中自有值得品的味道。去感悟真实的时间,静下心,多学习,积累福报。而不是天天混日子,也不是天天熬日子。在后疫情更加严峻的存量残杀世界中,为自己的生存进行知识的储备,特别是新知识的储备。

VBA是利用Office实现自己小型办公自动化的有效手段,我根据自己20多年的VBA实际利用经验,现在推出了五部VBA教程。第一:VBA代码解决方案,是VBA中各个知识点的讲解,覆盖绝大多数的VBA知识点;第二:VBA数据库解决方案,是数据处理的专业利器,详细的介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作。第三:VBA数组与字典解决方案,讲解VBA中的数组和字典的利用。字典是VBA代码水平提高的手段,值得深入的学习。第四:VBA代码解决方案之视频,是专门面向初学者的视频讲解,可以快速入门,更快的掌握这门技能。第五:VBA中类的解读和利用,是一部高级教程,对于自己理论的提高很有益处。上述教程可以根据1,3,2,5或者是4,3,2,5的顺序逐渐深入的学习和利用。

在取代OFFICE新的办公软件没有到来之前,谁能在数据处理方面做到极致,谁就是王者。其中登峰至极的技能非VBA莫属!

今日内容回向:

1 如何利用一个类的方法?

2 方法、事件的区别是什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值