除了使用Excel提供的标准类外,VBA还提供类模块功能,使开发者可根据需要定义自己的类,我来为大家科普一下关于vba 模块 里的 子程序?以下内容希望对你有帮助!

vba 模块 里的 子程序(使用类模块自定义类和对象)

vba 模块 里的 子程序

除了使用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”中的数据库表“客户”的全部数据。

,