一、前言
本文所说的VBA代码编程,即通过编程方法创建、删除或编辑VBA工程部件、模块或代码程序对象,还可以通过VBA代码创建新的代码,以此可以实现VBA的二次开发。
VBA代码编程,也就是所谓的VBA可扩展性。要实现VBA扩展功能,或者说实现对VBA代码的编程,我们必须事先完成以下相关设置。
1.1引用VBA扩展类库(Microsoft Visual Basic For Applications Extensibility5.3)
在ACCESS2003中扩展库文件为:VBE6EXT.OLB,你可以在VBE(Visual Basic Editor即VB编辑器)窗口,点菜单[工具]—[引用],在[引用对话框]中钩,来手动引用该扩展类库,你也可以通过代码实现对其的引用。
Dim ref As Reference
'申明引用类对象
On Error Resume Next'避免因重复引用造成的错误提示
'通过扩展库标识号,主版本号,次版本号完成引用
Set ref=References.AddFromGuid("{0002E157-0000-0000-C000-000000000046}",5,3)
1.2需要启用编程方式访问VBA项目(仅在EXCEL中需设定)
在Excel2003和更早版中,需设定允许对VBA项目的访问,否则将报错。ACCESS则不需对该项进行设定。
点选菜单[工具](在Excel中,而不是在VBA编辑器中)—[宏]—[安全性],在[安全对话框]中,单击[可靠发行商]页,点选[信任对于“Visual Basic项目”的访问]项(见下图)
注册表键值:
HKLM\Software\Microsoft\Office\11.0\Excel\Security\AccessVBOM",1,"REG_DWORD"
键值为:1,则钩选;0,则取消钩选
二、VBA的可扩展模型对象简介
● Library VBIDE(扩展库)
路径:C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB
描述:Microsoft Visual Basic for Applications Extensibility5.3
● VBE(VB编辑器)
指VB编辑器,为根对象,其包含所有其它可在Visual Basic for Applications中表示的对象和集合。
● VBProject(工程)
VB工程(或称项目)中包含了所有的代码模块和部件。VB项目可包含若干个VB部件对象。
● VBComponent(部件)
代表包含在工程中的部件对象,如:类模块或标准模块。部件(VBComponent)对象的Type 属性:
● CodePane(代码窗格)
用CodePane对象来操作CodePane中可视文本的位置或者代码窗格中显示的文本选择。
●CodeModule(代码模块)
代码模块是VB部件VBA源代码,可用CodeModule对象来修改(添加、删除、编辑)与部件相关联的代码CodePane或CodeModule内程序类别(prockind)常数:
以上为VBA的可扩展模型部分对象(非全部对象),其它模型对象请参阅帮助。
三、工程对象(Project)
表示一个工程。可用VBProject对象设置工程的属性、访问VBComponents集合以及访问References集合。通常我们会用ActiveVBProject返回“工程”窗口中选定的工程,但在实际编程中,无论此工程是否被显式地选定,都只有一个工程是活动的。
3.1判断工程是否锁定
通过工程Protection属性,判断工程锁定状态。工程Protection属性(只读),指示工程是否处于保护状态。返回的值为一事先定义好的常量,表示工程的状态。
'函数功能:判断工程是否锁定
Public Function VBProjectlocked(Optional VBProj As VBProject=Nothing)As Boolean Dim Proj As VBProject
'如未指定工程,则为当前工程
If VBProj Is Nothing Then
Set Proj=VBE.ActiveVBProject
Else
Set Proj=VBProj
End If
'判断工程是否锁定
If Proj.Protection=vbext_pp_locked Then
VBProjectlocked=True
Else
VBProjectlocked=False
End If
End Function
3.1.2调用自定义函数,判断当前工程是锁定示例
'函数输出为真(True),否则当前工程锁定
If VBProjectlocked=True Then
vba编程技巧MsgBox"工程已锁定"
Else
MsgBox"工程未锁定"
End If
3.2获得工程名
'获得当前工程名
VBE.ActiveVBProject.Name
四、部件对象(VBComponent)
代表一个包含在工程中的部件,例如类模块或标准模块。使用VBComponent对象访问与部件关联的代码模块CodeModule或改变部件的属性设置。
4.1添加工程部件
4.1.1向当前工程添加部件公用过程
'***************************************************
'公用过程:添加模块或指定名模块
'ComponentType部件类型(可选参数),默认为标准模块
'VBCompName部件名(可选参数),默认不指定部件名
'***************************************************
Public Sub AddVBComponents(Optional ComponentType As vbext_ComponentType=1,_
Optional VBCompName As String="")
Dim VBProj As VBProject'申明工程(项目)对象
Dim VBComps As VBComponents'申明部件集合
'设定为当前工程
Set VBProj=VBE.ActiveVBProject
设定为当前工程部件集合
Set VBComps=VBProj.VBComponents
'判断是否指定部件名,未指定则按默认名建立指定类型部件
If VBCompName=""Then
VBComps.Add(ComponentType)
Else
VBComps.Add(ComponentType).Name=VBCompName
End If
End Sub
4.1.2调用自定义过程,添加标准模块
'例一:以默认名添加标准模块
Call AddVBComponents
'例二:以指定名“我的模块”添加标准模块
Call AddVBComponents(,"我的模块")
4.1.3调用自定义过程,添加类模块
'例一:以默认名添加类模块
Call AddVBComponents(2)
'例二:以指定名“我的类模块”添加标准模块
Call AddVBComponents(2,"我的类模块")
4.1.4调用自定义过程,添加(MSForm)窗体
'例一:以默认名添加MSForm窗体
Call AddVBComponents(3)
'例二:以指定名“我的窗体”添加MSForm窗体
Call AddVBComponents(3,"我的窗体")
说明:这里窗体是指“Microsoft窗体”,而非ACCESS通常意义所说的窗体,ACCESS窗体实际为ACCESS类对象,你可以通过CreateForm方法创建一个ACCESS对象窗体。
4.2移除工程中部件
4.2.1移除当前工程部件自定义过程
'***********************************************
'公用过程:移除指定部件或删除某类部件
'ComponentType部件类别(可选参数),默认为标准模块
'VBCompName部件名(可选参数),默认不指定部件名
'************************************************
Public Sub RemoveVBComponents(Optional VBCompType As vbext_ComponentType,_
Optional VBCompName As String="")
Dim VBProj As VBProject'申明工程对象
Dim VBComp As VBComponent'申明部件对象
Dim VBComps As VBComponents'申明部件集合
'设定为当前工程
Set VBProj=VBE.ActiveVBProject
'设定为当前工程部件
Set VBComps=VBProj.VBComponents
'判断是否指定部件名,如未指定则删除所有指定类型部件
If VBCompName<>""And VBCompType=0Then
VBComps.Remove VBComps(VBCompName)
Else
For Each VBComp In VBComps
If VBComp.Type=VBCompType Then
VBComps.Remove VBComps(VBComp.Name)
End If
Next
End If
End Sub
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论