combox控件触发事件_如何构建VBA类的事件

本文深入讲解了类的属性、方法和事件的区别,并通过一个计数器实例演示了如何使用WithEvents关键字声明对象事件,以及如何在类中实现事件处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,今日我们继续类与集合的讲解,在前两讲中我们分别讲了类的属性和方法,我们再次区分一下什么是属性,什么是方法,什么是事件。

1属性 属性指的是对象的性质。

2方法 方法指的是类的一些操作,是对象的动作。

3事件 事件指的是类引发的一个调用;是对象的响应。

区分理解:

1 类方法的执行需要在代码中以显性的方式指定。

2 当最终操作者触发类对象时,需要对象产生一系列的操作,就是事件。

3 事件和方法都是类提供的一系列代码的操作,区别在于,事件无法也不必由代码显性调用,事件没有返回值。

为了使用对象的事件,需要在对象声明中使用WithEvents关键字声明源事件的对象。例如,需要在myclass 对象中使用mycmd对象的事件,那么我们在myclass类中做如下的声明:

Public WithEvents mycmd As CommandButton

需要注意的是,使用WithEvents只是声明了源事件的变量对象,而并不实际生成对象,为了应用这个对象,你需要将这个类实例化,生成真实的对象,才能在对象上应用这个事件,这个过程就是将魂转化为肉身的过程,转化完成之后,在肉身上才能应用你的事件。

注意点:WithEvents声明变量不能是通用类变量,如Object,而必须指定类名,也不能把WithEvents变量声明为As New。不能在标准模块中使用WithEvents。(这一点我在后面还有讲解)

下面我们通过一个实例来理解上面的讲解,这个实例有点像计数器。我们每次点击数字的时候,在TEXT控件中会显示数字。

思路:我们在一个窗体上建立10个数字按钮及清空按钮,并建立一个text的控件用于显示点击的数字,显示的数字也就是按钮的Caption.

实现的过程思路:构建一个myclass的类,在这个类中定义一个mycmd的对象,并应用这个对象的点击事件。我们看下面的代码:

类模块myclass的代码

Option Explicit

Public WithEvents mycmd As CommandButton

Private Sub mycmd_Click()

If mycmd.Caption = "清空" Then

UserForm2.TextBox1 = ""

Else

If mycmd.Caption = "0" And UserForm2.TextBox1 = "" Then

UserForm2.TextBox1 = ""

Else

UserForm2.TextBox1 = UserForm2.TextBox1 & mycmd.Caption

End If

End If

End Sub

窗体UserForm2的代码

Dim mycol As New Collection

Private Sub UserForm_Initialize()

Dim i%

Dim myct As MyClass

For Each r In Me.Controls

If TypeName(r) = "CommandButton" Then

Set myct = New MyClass

Set myct.mycmd = r

mycol.Add myct

End If

Next

tt = mycol.Count

Set myct = Nothing

End Sub

代码截图:

c8352160a4d3e2d07a043bbc0dd63b87.png

代码分析:

1 Public WithEvents mycmd As CommandButton这行预计声明mycmd作为CommandButton一个事件源的对象。

2 Private Sub mycmd_Click()

If mycmd.Caption = "清空" Then

UserForm2.TextBox1 = ""

Else

If mycmd.Caption = "0" And UserForm2.TextBox1 = "" Then

UserForm2.TextBox1 = ""

Else

UserForm2.TextBox1 = UserForm2.TextBox1 & mycmd.Caption

End If

End If

End Sub

上述过程是类模块的事件过程,是处理类对象在响应点击动作时的一系列操作。

3 在窗体的构建函数中,执行下面的代码:

Dim myct As MyClass

For Each r In Me.Controls

If TypeName(r) = "CommandButton" Then

Set myct = New MyClass

Set myct.mycmd = r

mycol.Add myct

End If

Next

首先要在窗体上每个控件进行循环,对于CommandButton控件,定义为新的MYCLASS类对象myct,然后对这个新的类进行set赋值,此后这个对象将响应mycd对象的系列事件了。

75eae1e47d64467c308f07d95cc9a1c4.png
c2092976eabe0efc0d3bc1e339bb7f96.png

点击,清空后会清空上述输入的数据。

今日内容回向:

1 类的事件是如何创建的?

2 什么是类的事件?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值