




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、vba代码对象编程方法详解一、前言21.1 引用vba扩展类库(microsoft visual basic for applications extensibility 5.3)21.2 需要启用编程方式访问vba项目(仅在excel中需设定)2二、vba的可扩展模型对象简介3三、工程对象(project)43.1判断工程是否锁定43.2 获得工程名5四、部件对象(vbcomponent)54.1 添加工程部件54.2 移除工程中部件64.3 列举部件名及类型信息74.4 判断部件是否存84.5 导入部件文件添加部件84.6 导出部件为部件文件8五、代码窗格对象(codepane)95.1
2、显示代码窗格105.2 获取窗格所选代码行列信息10六、代码模块对象(codemodule)116.1 获得指定行代码116.2 列举模块中所有过程及类型116.3 判断过程是否存在136.4 获得指定行所在过程名146.5 获取过程代码行数信息146.6 获取部件或模块中代码行信息166.7 获取工程代码行数信息186.8 代码模块中添加代码操作196.9 代码模块中插入代码操作196.10 代码模块中替换代码操作206.11 代码模块中删除代码操作216.12 添加事件过程代码操作226.13 查找代码获取相关信息23一、前言本文所说的vba代码编程,即通过编程方法创建、删除或编辑vba工
3、程部件、模块或代码程序对象,还可以通过vba代码创建新的代码,以此可以实现vba的二次开发。vba代码编程,也就是所谓的vba可扩展性。要实现vba扩展功能,或者说实现对vba代码的编程,我们必须事先完成以下相关设置。1.1 引用vba扩展类库(microsoft visual basic for applications extensibility 5.3)在access 2003中扩展库文件为:vbe6ext.olb,你可以在vbe(visual basic editor即vb编辑器)窗口,点菜单 工具 引用,在 引用对话框 中钩,来手动引用该扩展类库,你也可以通过代码实现对其的引用。di
4、m ref as reference '申明引用类对象on error resume next '避免因重复引用造成的错误提示'通过扩展库标识号,主版本号,次版本号完成引用set ref = references.addfromguid ("0002e157-0000-0000-c000-000000000046", 5, 3)1.2 需要启用编程方式访问vba项目(仅在excel中需设定)在excel 2003和更早版中,需设定允许对vba项目的访问,否则将报错。access则不需对该项进行设定。点选菜单 工具(在excel中,而不是在vba编辑器
5、中)宏安全性,在 安全对话框中,单击 可靠发行商 页,点选 信任对于“visual basic项目”的访问 项(见下图)注册表键值:hklmsoftwaremicrosoftoffice11.0excelsecurityaccessvbom", 1, "reg_dword"键值为:1,则钩选;0,则取消钩选二、vba的可扩展模型对象简介l library vbide(扩展库)路径:c:program filescommon filesmicrosoft sharedvbavba6vbe6ext.olb 描述:microsoft visual basic for a
6、pplications extensibility 5.3l vbe(vb编辑器)指vb编辑器,为根对象,其包含所有其它可在 visual basic for applications 中表示的对象和集合。l vbproject(工程)vb工程(或称项目)中包含了所有的代码模块和部件。vb项目可包含若干个vb部件对象。l vbcomponent(部件)代表包含在工程中的部件对象,如:类模块或标准模块。部件(vbcomponent) 对象的 type 属性:常数值描述vbext_ct_stdmodule1标准模块vbext_ct_classmodule2类模块vbext_ct_msform3mi
7、crosoft 窗体(非access类窗体)l codepane(代码窗格)用 codepane 对象来操作 codepane 中可视文本的位置或者代码窗格中显示的文本选择。l codemodule(代码模块)代码模块是vb部件vba源代码,可用 codemodule 对象来修改(添加、删除、编辑)与部件相关联的代码codepane 或codemodule内程序类别 (prockind)常数:常数值描述vbext_pk_proc0指定所有过程除了property 过程。vbext_pk_let1指定一个赋值给属性的过程。vbext_pk_set2指定一个给对象设置引用的过程。vbext_pk_
8、get3指定一个返回属性值的过程。以上为vba的可扩展模型部分对象(非全部对象),其它模型对象请参阅帮助。三、工程对象(project)表示一个工程。可用 vbproject 对象设置工程的属性、访问 vbcomponents 集合以及访问 references 集合。通常我们会用activevbproject返回“工程”窗口中选定的工程,但在实际编程中,无论此工程是否被显式地选定,都只有一个工程是活动的。3.1判断工程是否锁定通过工程protection属性,判断工程锁定状态。工程protection 属性(只读),指示工程是否处于保护状态。返回的值为一事先定义好的常量,表示工程的状态。pr
9、otection属性常量:常数值描述vbext_pp_none0常量代表指定的工程未被保护。vbext_pp_locked1常量代表指定的工程是被锁住。 3.1.1 判断工程是否锁定自定义函数'函数功能:判断工程是否锁定public function vbprojectlocked (optional vbproj as vbproject = nothing) as boolean dim proj as vbproject '如未指定工程,则为当前工程 if vbproj is nothing then set proj = vbe.activevbproject else
10、 set proj = vbproj end if '判断工程是否锁定 if proj.protection = vbext_pp_locked then vbprojectlocked = true else vbprojectlocked = false end ifend function3.1.2 调用自定义函数,判断当前工程是锁定示例 '函数输出为真(true),否则当前工程锁定if vbprojectlocked = true then msgbox "工程已锁定" else msgbox "工程未锁定" end if3.2
11、获得工程名'获得当前工程名vbe.activevbproject.name四、部件对象(vbcomponent)代表一个包含在工程中的部件,例如类模块或标准模块。使用 vbcomponent 对象访问与部件关联的代码模块codemodule或改变部件的属性设置。4.1 添加工程部件4.1.1向当前工程添加部件公用过程'*'公用过程:添加模块或指定名模块' componenttype部件类型(可选参数),默认为标准模块' vbcompname部件名(可选参数),默认不指定部件名'*public sub addvbcomponents (option
12、al 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 vbc
13、ompname = "" then vbcomps.add (componenttype) else vbcomps.add (componenttype).name = vbcompname end ifend sub4.1.2 调用自定义过程,添加标准模块'例一:以默认名添加标准模块call addvbcomponents'例二:以指定名“我的模块”添加标准模块call addvbcomponents(, "我的模块")4.1.3 调用自定义过程,添加类模块'例一:以默认名添加类模块call addvbcomponents(2
14、)'例二:以指定名“我的类模块”添加标准模块call addvbcomponents(2, "我的类模块")4.1.4 调用自定义过程,添加(msform)窗体'例一:以默认名添加msform窗体call addvbcomponents(3)'例二:以指定名“我的窗体”添加msform窗体call addvbcomponents(3, "我的窗体")说明:这里窗体是指“microsoft 窗体”,而非access通常意义所说的窗体,access窗体实际为access类对象,你可以通过createform 方法创建一个access对
15、象窗体。4.2 移除工程中部件4.2.1 移除当前工程部件自定义过程'*'公用过程:移除指定部件或删除某类部件'componenttype部件类别(可选参数),默认为标准模块'vbcompname部件名(可选参数),默认不指定部件名'*public sub removevbcomponents (optional vbcomptype as vbext_componenttype, _ optional vbcompname as string = "") dim vbproj as vbproject '申明工程对象 dim
16、 vbcomp as vbcomponent '申明部件对象 dim vbcomps as vbcomponents '申明部件集合 '设定为当前工程 set vbproj = vbe.activevbproject'设定为当前工程部件 set vbcomps = vbproj.vbcomponents '判断是否指定部件名,如未指定则删除所有指定类型部件 if vbcompname <> "" and vbcomptype = 0 then vbcomps.remove vbcomps (vbcompname) else
17、 for each vbcomp in vbcomps if vbcomp.type = vbcomptype then vbcomps.remove vbcomps (vbcomp.name) end if next end ifend sub4.2.2 调用自定义过程,移除指定类型所有部件示例'移除指定所有类模块call removevbcomponents(vbext_ct_classmodule)4.2.3 调用自定义过程,移除指定名部件示例(无需指定部件类型)'移除指定名部件,实例:指定“我的窗体”call removevbcomponents(, "我的窗
18、体")4.3 列举部件名及类型信息4.3.1 获得部件类型自定义函数'-'函数功能:根据所获取部件类型常量值,获得部件类别名'-function componenttypetostring (componenttype as vbext_componenttype) as string select case componenttype case vbext_ct_classmodule componenttypetostring = "类模块" case 100 componenttypetostring = "其它"
19、 case vbext_ct_msform componenttypetostring = "微软窗体" case vbext_ct_stdmodule componenttypetostring = "标准模块" case else componenttypetostring = "未知类: " & cstr(componenttype) end selectend function4.3.2 获取工程中所有部件名及类型自定义函数'-'函数功能:列出所有部件名及类型'调 用:componenttype
20、tostring 函数,获取部件类型'-public function allvbcomponentsandtype () as string dim vbcomp as vbcomponent '申明工程部件 dim vbcomps as vbcomponents '申明部件集合 dim strcomps as string '输出结果 dim strobjname as string '对象名 dim strtype as string '类型名 set vbcomps = vbe.activevbproject.vbcomponents &
21、#39;遍历部件集合,将部件名及类型值赋值给变量 for each vbcomp in vbcomps strobjname = vbcomp.name strtype = componenttypetostring(vbcomp.type) '如果为其它类型,判断是access窗体、报表或其它对象 if strtype = "其它" then if instr(strobjname, "form") > 0 then strtype = "窗体" elseif instr(strobjname, "repor
22、t") > 0 then strtype = "报表" else strtype = "其它" end if end if '将获取的部件名及类型逐行输出 strcomps = strcomps & strobjname & space (12) & strtype & vbcrlf next allvbcomponentsandtype = strcomps '赋值输出end function4.4 判断部件是否存在4.4.1 判断部件是否存在自定义函数'-'函数功能:判断
23、指定模块是否存在,存在输出为true'-public function vbcomponentexists (byval vbcompname as string) as boolean dim vbproj as vbproject on error resume next set vbproj = vbe.activevbproject '存在输出为true,否则为false vbcomponentexists = cbool(len(vbproj.vbcomponents(vbcompname).name)end function4.4.2判断指定模块是否存在调用示例 i
24、f vbcomponentexists("模块1") = false then msgbox "不存在" else msgbox "存在" end if4.5 导入部件文件添加部件4.5.1 导入部件自定义过程'导入部件文件添加部件'输入参数:filename(字符串变量) 指示欲添加部件的路径及文件名public sub importfilestovbcomps (filename as string) dim vbproj as vbproject dim vbcomps as vbcomponents on er
25、ror resume next set vbproj = vbe.activevbproject set vbcomps = vbproj.vbcomponents '导入指定部件文件,添加部件 vbcomps.import (filename)end sub4.5.2 导入部件文件示例'调用示例:从指定c盘导入部件文件"模块1"添加到当前工程call importfilestovbcomps ("c:模块1")说明:导入文件部件如与部件重名,不会覆盖原部件,而是添加序号重新命名。4.6 导出部件为部件文件4.6.1 导出部自定义过程
26、39;过程功能:导出部件为部件文件'输入参数:filename(字符串变量) 用来指定部件输出为文件的文件名及导出路径' compsfile(variant) 可以是部件名或是部件索引,用以指定欲导出部件public sub exportvbcompstofiles (compsfile as variant, filename as string) dim vbproj as vbproject dim vbcomps as vbcomponents on error resume next set vbproj = vbe.activevbproject set vbcom
27、ps = vbproj.vbcomponents (compsfile) '导出部件为部件文件 vbcomps.import (filename)end sub4.6.2 导出部件示例'调用示例一:指定部件(模块1)call exportvbcompstofiles ("模块1","c:模块1.bas")'调用示例二:通过部件索引导出部件,实例中:索引1为form_窗体1类对象call exportvbcompstofiles (1,"c: form_窗体1.cls")说明:你可以通过“部件名”或“索引”来指定
28、需导出部件。4.6.3 根据部件类型获得输出部件文件后缀名'根据部件类型,确定输出部件文件后缀名public function getfileextension (vbcomp as vbide.vbcomponent) as string select case vbcomp.type case vbext_ct_classmodule getfileextension = ".cls" case vbext_ct_document getfileextension = ".cls" case vbext_ct_msform getfileex
29、tension = ".frm" case vbext_ct_stdmodule getfileextension = ".bas" case else getfileextension = ".bas" end selectend function说明:导出文件名要根据不同部件类型,指定后缀名,见下表:部件对象后缀名描述access类对象cls通常所说的“窗体”或“报表”对象等。类模块cls含有类定义的模块。标准模块bas只包含过程、类型以及数据的声明和定义的模块。窗体frm指微软窗体,而非access类对象窗体。五、代码窗格对象(
30、codepane)代码窗口中包含的代码窗格。代码窗口被用来输入和编辑代码。代码窗口可含有多个代码窗格。用 codepane 对象来操作 codepane 中代码或选取的代码或文本。5.1 显示代码窗格5.1.1 显示当前代码窗格'打开并显示当前代码窗格public sub showproject () vbe.activecodepane.showend sub5.1.2 显示指定部件代码模块窗格'函数功能:打开指定部件代码模块窗格public sub showcomponent (byval compsnameorindex as variant) dim vbproj as
31、 vbproject '工程项目对象 dim vbcomp as vbcomponent '组件对象 dim codemod as codemodule '代码模块 dim vbcodepane as codepane '窗格对象 '实例化对象 set vbproj = vbe.activevbproject set vbcomp = vbproj.vbcomponents (compsnameorindex) set codemod = vbcomp.codemodule set vbcodepane = codemod.codepane vbcode
32、pane.show '显示代码窗格end sub5.2 获取窗格所选代码行列信息5.2.1 获取当前窗格中所选代码起止行列信息'所选代码的起止行列信息定义数据类型public type sellinecolinfo sline as long '起始行 scol as long '起始列 eline as long '结束行 ecol as long '结束列end type'-'函数功能:获得所选代码开始行列及结束行列信息public function vbgetselection () as sellinecolinfo di
33、m selinfo as sellinecolinfo '数据类型 vbe.activecodepane.getselection selinfo.sline, selinfo.scol, _ selinfo.eline, selinfo.ecol '获取的行列信息输出 vbgetselection = selinfoend function'*'调用示例:在窗格中任选一处代码行列,再运行以下代码dim selinfo as sellinecolinfo '申明自定数据类型'起止行列信息赋值给变量 selinfo = vbgetselection
34、'输出显示 msgbox "起始行:" & selinfo.sline & vblf & _ "起始列:" & selinfo.scol & vblf & _ "结束行:" & selinfo.eline & vblf & _ "结束列:" & selinfo.ecol六、代码模块对象(codemodule)在诸如窗体,类或文档等部件之后表示程序代码。可用 codemodule 对象来修改(添加、删除、编辑)与部件相关联的代码。
35、每个部件都与一个 codemodule 对象相关联。但是,一个 codemodule 对象可以与多个代码窗格codepane相关联。6.1 获得指定行代码6.1.1 获得指定模块中指定一行或多行代码'函数功能:指定模块指定行代码'输入参数:compsnameorindex 部件名或索引' codeline(长整)代码所在行' countlines(长整)可选参数,选取代码行数,默认为1行public function linecodestring (byval compsnameorindex, _ byval codeline as long, _ optio
36、nal countlines as long = 1) as string dim vbproj as vbproject dim vbcomp as vbcomponent dim codemod as codemodule set vbproj = vbe.activevbproject set vbcomp = vbproj.vbcomponents (compsnameorindex) set codemod = vbcomp.codemodule linecodestring = codemod.lines (codeline, countlines)end function'
37、;*'调用示例一:获得“模块1”,第五行代码debug.print linecodestring("模块1",5)'*'调用示例二:获得“模块1”,第一行至第六行代码debug.print linecodestring("模块1",1 ,6)6.2 列举模块中所有过程及类型6.2.1获得过程种类自定义函数' 函数功能:获得过程种类名' 输入参数:prockind(过程类型常数)public function prockindstring(byval prockind as vbext_prockind) as st
38、ring select case prockind case vbext_pk_get prockindstring = "property get" case vbext_pk_let prockindstring = "property let" case vbext_pk_set prockindstring = "property set" case vbext_pk_proc prockindstring = "sub or function" case else prockindstring = &qu
39、ot;unknown type: " & cstr(prockind) end selectend function6.2.2 获得指定部件中过程名及类型'-'函数功能:列出指定模块中所有过程'输入参数:compsnameorindex 部件名或索引'调 用:自定义prockindstring函数'-public function listprocedures (compsnameorindex as variant) as string dim vbproj as vbproject '工程 dim vbcomp as vbc
40、omponent '部件 dim codemod as codemodule '代码模块 dim prockind as vbext_prockind '过程类型 dim linenum as long '代码行 dim sprockind as string '过程类型名 dim procname as string '过程名 '实例化当前活动的工程 set vbproj = vbe.activevbproject '实例化工程对象集合 set vbcomp = vbproj.vbcomponents(compsnameorin
41、dex) '实例化代码模块 set codemod = vbcomp.codemodule with codemod '获得代码所在起始行,等于申明行加一 linenum = .countofdeclarationlines + 1 '获得指定行所在过程名 procname = .procofline(linenum, prockind) '申明后第一行开始循环至代码结束,将获取过程名及类型名输出 do until linenum >= .countoflines sprockind = sprockind & procname & spa
42、ce(3) & _prockindstring(prockind) & vblf '代码行数累加, 将根据所在行获得过程名 linenum = linenum + .proccountlines(procname, prockind) procname = .procofline(linenum, prockind) loop end with listprocedures = sprockindend function'*'调用示例:获取"form_窗体1"中所有过程名及类型debug.print listprocedures (&
43、quot;form_窗体1")6.3 判断过程是否存在6.3.1 判断指定过程是否存在自定义函数'函数功能:判断指定过程是否存在,存在输出为真public function vbprocexists(byval vbprocname as string, _ optional vbcompnameorindex as variant) as boolean dim vbproj as vbproject dim vbcodemodule as codemodule dim prockind as vbext_prockind '过程类型 dim linenum as
44、long '代码行 dim procname as string '获得过程名 set vbproj = vbe.activevbproject '如不指定部件及为当前窗格代码模块 if vbcompnameorindex = "" then set vbcodemodule = vbe.activecodepane.codemodule else set vbcodemodule = vbproj.vbcomponents(vbcompnameorindex).codemodule end if with vbcodemodule '获得代
45、码所在起始行,等于申明行加一 linenum = .countofdeclarationlines + 1 '获得指定行所在过程名 procname = .procofline (linenum, prockind) '申明后第一行开始循环至代码结束,将获取过程名及类型名输出 do until linenum >= .countoflines '代码行数累加,将根据所在行获得过程名 linenum = linenum + .proccountlines (procname, prockind) procname = .procofline (linenum, pr
46、ockind) '进行二进制比对,比对结果等一,则存在 if strcomp (vbprocname, procname) = 1 then vbprocexists = true exit do end if loop end withend function6.3.2 调用自定义函数示例'示例一:指定过程名,但不指定部件debug.print vbprocexists("过程名")'示例二:指定过程名,并指定部件名debug.print vbprocexists("过程名","部件名")'示例三:指定过程名,并通过索引指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电磁继电器应用课件
- 电瓶车销售知识培训总结课件
- 北师大新生开学考试题及答案
- MGTA-117-Antibody-生命科学试剂-MCE
- 3-Hydroxy-5-methylhex-4-enoyl-CoA-3-Hydroxy-5-methylhex-4-enoyl-coenzyme-A-生命科学试剂-MCE
- Desmethylene-oxobexarotene-methyl-ester-13C4-生命科学试剂-MCE
- 保健人员岗位考试试题及答案
- 包头高中教师考试真题及答案
- 高山族民风民俗课件
- 2025年法人大数据项目提案报告
- 2026届广东省六校高三语文上学期第一次联考试卷附答案解析
- 2025年医院胸痛中心应知应会试题(附答案)
- 医院投诉处理标准化培训
- 2025年广东法官入额考试题库
- 肺康复专题讲座
- 卵巢保养课件教学
- 2025年医师定期考核业务水平测评理论考试(公共卫生)历年参考题库含答案详解(5套)
- 防雷防静电培训考试试题及答案
- 2025年发展对象培训考试试题(含答案)
- 测绘工程技术专业介绍
- 亚马逊运营每周工作汇报
评论
0/150
提交评论