除了使用Excel提供的标准类外,VBA还提供类模块功能,使开发者可根据需要定义自己的类。
将常用代码封装为类,可重复应用在不同的应用程序中,从而提高程序的开发效率。
在自定义类中,通过属性、方法和事件向用户提供服务,把完成运算的过程隐藏起来。
1 类的作用
在VBA中,开发人员不使用类模块也能开发绝大多数的应用系统。不使用类模块编写程序时,一些程序代码和程序处理的数据是分离的。这样可能会出现多个不同过程用一定的规则修改数据。当需要调整修改数据的规则时,就需要修改多段程序的代码。
如果使用类将数据和处理这些数据的代码封装在一起,将使管理任务更加简单。主要体现在以下几个方面:
1.1 数据作为对象的属性,都与特定对象相关联,使数据与对象具有特定的关系(不再是分离的松散关系)。
1.2 数据作为对象的属性,用户只能通过设置的接口(属性、方法和事件)进行修改,使对象的数据可保持在有效的范围内。
1.3 使用对象提供的方法,对一个对象可以进行的操作提供统一接口。在对象的定义中,只需要修改一次代码,即可调整数据的修改规则。
1.4 使用类可以将复杂的过程封装在类的内部,类的使用人员不需要知道类的实现过程,只需要熟悉类的属性、方法和事件即可。
2 创建类模块
通过创建一个“数据库类”来说明自定义类的操作细节。该类的功能在于可创建与Access数据库的连接。将数据库连接字符封装在类模块中,用户通过属性给出要访问的Access数据库名和SQL语句,执行内置的方法即可返回记录集。
2.1 新建类模块
Alt+F11→“插入”→“类模块”→在“属性”窗口中修改类的名称为"clsADO"。
2.2 创建类属性
2.2.1 创建私有变量
Option Explicit
'使用本类模块,需添ADO的引用"Microsoft ActiveX Data Objects 2.8 Library"
Private cnn As Connection '连接对象
Private rs As Recordset '记录集对象
Private m_DBFullName As String 'Access数据库名称(包含路径信息)
Private m_CommandText As String 'SQL语句
2.2.2 创建Property Get过程来获取对象的属性值
Property Get DBFullName() As String '返回数据库名称
DBFullName = m_DBFullName
End Property
Property Get CommandText() As String '返回SQL语句
CommandText = m_CommandText
End Property
2.2.3 创建Property Let过程改变对象属性
Property Let DBFullName(strDBFullName As String) '设置数据名称
If LCase(Right(strDBFullName, 4)) <> ".mdb" And _
LCase(Right(strDBFullName, 6)) <> ".accdb" Then
Exit Property
End If
m_DBFullName = strDBFullName
End Property
Property Let CommandText(strSQL As String) '设置SQL语句
m_CommandText = strSQL
End Property
2.3 定义类的方法
Private Sub ConnDB() '连接数据库
If cnn.State = 0 And Len(m_DBFullName) > 0 Then
cnn.Provider = "Microsoft.Jet.OLEDB.4.0"
cnn.Open m_DBFullName
End If
End Sub
Public Sub CloseDB() '关闭连接
cnn.Close
End Sub
Public Function RunSQL() As Recordset '执行SQL语句
If Len(m_CommandText) > 0 Then
Call ConnDB '创建数据库连接
If rs.State <> 0 Then rs.Close
rs.Open Source:=m_CommandText, _
ActiveConnection:=cnn, _
CursorType:=adOpenStatic, _
LockType:=adLockReadOnly
Set RunSQL = rs '返回记录集
End If
End Function
2.4 定义类模块的事件
Private Sub Class_Initialize() '初始化类
Set cnn = New Connection
Set rs = New Recordset
End Sub
Private Sub Class_Terminate() '终止类
If cnn.State = 1 Then
cnn.Close
End If
Set cnn = Nothing
Set rs = Nothing
End Sub
3 使用类模块
3.1 用新定义的类声明对象
Dim tstADO As New clsADO
3.2 使用对象编写过程
Sub test()
Dim rs As Recordset, fld As Field
On Error Resume Next
tstADO.DBFullName = ThisWorkbook.Path & "\Northwind.mdb" '设置属性
tstADO.CommandText = "select * from 客户" '设置属性
Set rs = tstADO.RunSQL '调用自定义对象的方法
With Worksheets(1)
i = 1: j = 1
For Each fld In rs.Fields
.Cells(i, j) = fld.Name
j = j + 1
Next
j = 1
i = i + 1
Do While Not rs.EOF
For Each fld In rs.Fields
.Cells(i, j) = fld.Value
j = j + 1
Next
j = 1
rs.MoveNext
i = i + 1
Loop
End With
End Sub
以上过程执行完后,即可在工作簿的第一个工作表中显示数据库“Northwind.mdb”中的数据库表“客户”的全部数据。
本文暂时没有评论,来添加一个吧(●'◡'●)