类模块教程及实例 使用类模块可以创建自定义的类,使用此类作为模板创建对象。 类模块包含一系列的属性,方法和事件,用来和其他对象或创建对象的代码交互。 · 属性 有两类属性,第一类为Public类型的模块级变量,第二类为Property过程。 · 模块级变量 例: Public ProductId As Long 使用这种方法定义的属性不能返回数组,定长字符串,常量或用户自定义类型。 ·Property过程 Property Let:用来设置属性值的过程 Property Get:用来返回属性值的过程 Property Set:用来设置对象引用的过程 声明Property过程的语法: [Public | Private] [Static] Property { Get| Let | Set } propertyname [(arguments)] [As type] statements End Property 在Property过程声明中所需要的参数为: Property Get propname(1, ..., n) As Type Property Let propname(1, ..., n, n+1) Property Set propname(1, ..., n, n+1) 在具有相同名称的Property过程中,从第一个到最后一个参数(1, ..., n)都必须共享相同的名称与数据类型。 其中Property Get过程的数据类型必须与相关的Let及Set声明中的最后(n+1)个参数的类型相同。 ※在Property Set声明中,最后一个参数的数据类型必须是对象类型或Variant。 例: Property Let Names(intX As Integer, varZ AsVariant) ' statement here. End Property Property Get Names(intX As Integer) AsVariant ' statement here. End Property · 方法 就是一个过程。 定义为Private的方法只可以在类内部使用。 · 事件 使用Event语句定义事件。 [Pubulic] Event eventname [(arglist)] 事件只能在所声明的模块中产生。 使用RaiseEvent语句产生事件。 不能声明带返回值的事件。 VBA定义了2个特殊的事件,Initialize和Terminate。 ※在创建对象时使用WithEvents关键字来使用事件。 ※Class_Initialize事件的代码在类被创建时执行,Class_Terminate事件的代码在类被销毁时执行。 RaiseEvent语句使用例子下面的例子使用事件来模拟100米跑秒表计数器。 代码中,除了与事件有关的方法,属性,语句外, 还有RaiseEvent语句的记述。 下面的例子,除了类模块,还使用了Form模块(Form1)。 Form上,配置有命令按钮控件(Command1),标签控件(Label1)和2个文本框控件(Text1和Text2)。 点击命令按钮,第一个文本框中显示"开始",第二个文本框显示经过的秒数。 到达设定的最大秒数(9.84秒)后,第一个文本框中显示"终点",第二个文本框中显示经过的秒数"9.84"。 Form模块Form1中的代码。 包括开始和终了时刻执行的代码,事件发生时执行的代码。 OptionExplicit PrivateWithEvents mText As TimerState Private SubCommand1_Click() Text1.Text = "开始" Text1.Refresh Text2.Text = "0" Text2.Refresh Call mText.TimerTask(9.84) End Sub Private SubForm_Load() Command1.Caption = "点击开始" Text1.Text = "" Text2.Text = "" Label1.Caption = "经过的秒数:" Set mText = New TimerState End Sub Private SubmText_ChangeText() Text1.Text = "终点" Text2.Text = "9.84" End Sub Private SubmText_UpdateTime(ByVal dblJump As Double) Text2.Text = Str(Format(dblJump,"0")) DoEvents End Sub 类模块TimerState中的代码。 OptionExplicit Public EventUpdateTime(ByVal dblJump As Double) Public EventChangeText() Public SubTimerTask(ByVal Duration As Double) Dim dblStart As Double Dim dblSecond As Double Dim dblSoFar As Double dblStart = Timer dblSoFar = dblStart Do While Timer < dblStart + Duration If Timer - dblSoFar >= 1 Then dblSoFar = dblSoFar + 1 RaiseEvent UpdateTime(Timer -dblStart) End If Loop RaiseEvent ChangeText End Sub 响应Application事件可以在类模块和用户窗体中使用Application事件。 例: (1)新建frmEventForm窗体,添加一个lstEvent的ListBox,添加如下代码。 Public WithEvents appEvent As Application Private Sub appEvent_NewWorkbook(ByVal Wb AsWorkbook) Me.lstEvent.AddItem "Newworkbook" End Sub Private Sub appEvent_SheetActivate(ByVal ShAs Object) Me.lstEvent.AddItem " Activate" & Sh.Name End Sub (2)新建过程,输入如下代码 Dim frm As New frmEventForm Set frm.appEvent = Application frm.Show vbModeless Application对象事件的使用为了使用Application的事件, 要生成类模块,在类模块中声明事件型的Application对象。 例如,生成EventClassModule类模块。 将下面的代码加入类模块中。 PublicWithEvents App As Application 声明包含事件的对象后,类模块的“对象”一览框中可以看到此对象, 就可以写此对象的的事件处理过程了。 ([对象]栏中,选择事件对象,对象的有效事件会表示在处理过程一览框中) 但是,事件处理代码执行前,声明使用事件处理类的代码中, 需要将类中的对象变量与Application对象进行关联。 例: Dim X As NewEventClassModule SubInitializeApp() Set X.App = Application End Sub InitializeApp过程中, 类模块(EventClassModule)中的App与MicrosoftExcelApplication对象关联, Application对象事件发生后, 类模块(EventClassModule)中对应的事件处理过程被执行。 嵌入图形中事件的使用缺省的设置中,可以使用嵌入图形的事件。 为了使用表示嵌入图形的Chart对象的事件, 要生成新的类模块,声明事件型的Chart对象。 例如,生成"EventClassModule"类模块,写入下面的代码。 PublicWithEvents myChartClass As Chart 声明包含事件的对象后,类模块的“对象”一览框中可以看到此对象, 就可以写此对象的的事件处理过程了。 ([对象]栏中,选择事件对象,对象的有效事件会表示在处理过程一览框中) 但是,事件处理代码执行前,声明使用事件处理类的代码中, 需要将类中的对象变量与嵌入图形对象进行关联。 DimmyClassModule As New EventClassModule SubInitializeChart() Set myClassModule.myChartClass = _ Charts(1).ChartObjects(1).Chart End Sub InitializeChart过程中,类模块(EventClassModule)中的myChartClass与图表1中的图1对象关联, 这个图表对象事件发生后, 类模块(EventClassModule)中对应的事件处理过程被执行。 QueryTable对象事件的使用为了使用QueryTable的事件, 要生成类模块,在类模块中声明事件型的QueryTable对象。 例如,生成ClsModQT类模块。 将下面的代码加入类模块中。 PublicWithEvents qtQueryTable As QueryTable 声明包含事件的对象后,类模块的“对象”一览框中可以看到此对象, 就可以写此对象的的事件处理过程了。 ([对象]栏中,选择事件对象,对象的有效事件会表示在处理过程一览框中) 事件处理代码执行前, 需要将类中的对象变量与QueryTable对象进行关联。 类模块中 SubInitQueryEvent(QT as Object) Set qtQueryTable = QT End Sub ‘代码中 DimclsQueryTable as New ClsModQT SubRunInitQTEvent() clsQueryTable.InitQueryEvent _ QT:=ActiveSheet.QueryTables(1) End Sub RunInitQTEvent过程中, 类模块(ClsModQT)中的qtQueryTable与ActiveSheet.QueryTables(1)对象关联, 此对象事件发生后, 类模块(ClsModQT)中对应的事件处理过程被执行。
|