使用VBA创建自已的对象(一)
本文译自Steve Saunders和Jeff Webb所著的《Programming Excel with VBA and .NET》一书第五章Creating Y our Own Objects。
第4章介绍了如何使用Excel对象,现在来创建自已的对象。本章介绍如何定义自定义类,以及从这些类实例化对象来创建可视的或功能的元素。在介绍的过程中,我试图解释为什么使用类以及如何执行独立面向对象程序的特定任务,您也将学习如何从Excel方便地发送邮件。
提示:本章所使用的代码和示例均可在chap05.xl s工作簿中到。
5.1 模块与类
模块与类之间的主要区别在于您如何使用它们:
● 模块中包含的代码可以用于输入在单元格中的公式。
● 存储在类中的代码响应在Excel中发生的事件。
区别决定了是在模块中还是在类中放置您的代码。通常,如果执行一个普通目的且计划在一些不同地方
重复使用的任务时,将代码放置在模块中。如果响应事件或表示一个可视的组件时,将代码放置在类中。
这些只是指导原则,下面的两节将更彻底地介绍它们之间的区别。
5.1.1 模块
例如,创建一个包含新的数学函数的模块,该函数可以使用在单元格的公式中:
1. 在Excel中,打开一个工作簿并选择菜单工具→宏→Visual Basic编辑器来开始编写程序。
2. 在VBE窗口中,选择菜单插入→模块。VBA添加一个新的模块到工程窗口中,并且在代码编辑窗口中显示这个新的空模块。
3. 在模块的属性窗口中,选择名称(Name)属性,输入Math重命名该模块。
4. 添加下面的代码在模块代码编辑窗口中:
'Math 模块
Public Function Inverse(x As Double) As Double
If x = 0 Then Inverse = 0 Else Inverse = 1 / x
End Function
Public Function CubeRoot(x As Double) As Double
If x < 0 Then CubeRoot = 0 Else CubeRoot = x ^ (1 / 3)
End Function
要在Excel中使用这些新函数,将它们包括在一个公式中,如图5-1所示。
为了在VBA中使用这些函数,应将它们包括在一个表达式中,如下所示:
Sub TestMathFunctions()
Dim result As Double, value As Double, str As String
value = 42
result = Inverse(value)
str = value & "的倒数为" & result
result = CubeRoot(value)
str = str & ",立方根为" & result
MsgBox str, , "测试Math函数"
End Sub
这里,result = Inverse(value)计算倒数并将值赋给变量result,也可以写作Math.Inverse(value),模块名是可选的,但包含模块名是一个好习惯,能使代码更清晰,或者如果在另一个工程中
重复使用该过程时,应包含模块名。
图5-1:使用模块创建用户自定义函数
5.1.2 类
Excel为每个工作簿和工作表提供了内置的类。能直接添加代码到这些类中以响应这些对象中的事件,如第4章所述。也可以创建自已的自定义类,在代码的其它地方使用它们。
自定义类在使用之前,需要实例化为对象。这允许创建多个代码实例,每次同时运行,并且行为彼此相互独立。
创建一个新的类:
1. 在Excel中,打开一个工作簿并选择菜单工具→宏→Visual Basic编辑器来开始编写程序。
2. 在VBE窗口中,选择菜单插入→类模块。VBA添加一个新的类到工程窗口中,并且在代码编辑窗口中显示新的空类。
3. 在类的属性窗口中选择名称(Name)属性,输入Message重命名该类。
4. 添加下面的代码在类代码编辑窗口中:
'Message类
Public V alue As String
Public Title As String
Public Sub show()
MsgBox V alue, , Title
End Sub
不能通过按F5键运行刚创建的类,而是必须首先从模块中创建一个类的实例,然后以某种方式使用这个类,如下所示:
'TestMessage模块
Sub TestMessageClass()
Dim msg1 As New Message, msg2 As New Message
msg1.Title = "Msg1对象"
msg1.V alue = "该信息通过Msg1产生."
msg2.Title = "Msg2对象"
msg2.V alue = "该信息通过Msg2产生."
msg1.Show
msg2.Show
End Sub
上面的代码从Message类中创建了两个对象msg1和msg2,演示每个对象有不同的值和标
题设置。这种独立性有时称作封装,因为如果没有直接引用对象,外部的影响不会改变它。允许对象代表一个可视的元素,诸如一个工作表或一个消息框,并且响应特定对象的事件,如图5-2所示。实例化类和实例化对象
图5-2:使用类创建多个对象
不能够使用模块来完成上面的操作。在任何给定的模块中仅有一个固定的实例,并且在该模块里的变量不能封装。
5.2 添加方法
方法是类里面的Sub或Function过程。可以使用方法来定义类里面的行为,例如计算出结果。将下面的代码添加到Message类中,来通过邮件发送消息:
'Send方法:通过email发送消息
Public Sub send(ToAddress As String)
Dim msgToSend As String, result As Double
msgToSend = "mailto:" & ToAddress
msgToSend = msgToSend & "?SUBJECT=" & Title
msgToSend = msgToSend & "&BODY=" & V alue
ThisWorkbook.Follow Hyperlink msgToSend, , True
End Sub
要在代码中使用该方法,需要创建一个对象并使用能接受的邮件地址来调用Send方法:
'TestMessage模块
Sub TestMessageSend()
Dim msg1 As New Message
msg1.Title = "传送消息"
msg1.V alue = "通过Excel传送这个消息"
msg1.Send ("*********************")
End Sub
如果运行TestMessageSend过程,Excel使用邮件客户端创建一个新的邮件消息框,如图5-3所示。
图5-3:从Excel发送邮件分类:ExcelVBA>>类

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。