学习资源:《Excel VBA从入门到进阶》第67集 by兰色幻想
这节学习的是用VBA代码来操作代码。
'VBE对象是根对象,表示在VBA编辑器中存在的所有对象的最上层对象
一、了解VBE对象
VBAproject对象:VBE编辑器中的工程。
VBComponents对象:表示工程中所有的部件集合,包括Excel对象、窗体、模块、类模块。
CodeModule 对象:表示部件中相关的代码。
2. 引用
在VBA编辑器找到工具-引用-勾选MicroSoft Visual Basic for Applications Extensibility Library,如果电脑安装了VB6,可以引用Microsoft Visual Basic 6.0 Extensibility。
二、返回模块信息
1、返回代码的总行数
① 返回模块A中的总行数CountOfLines
MsgBox ThisWorkbook.VBProject.VBComponents.CodeModule.CountOfLines
② 返回过程test中的总行数
ProcCountLines(ProcName,Prockind)
参数:ProcName——过程名
Prockind有四种值:
①vbext_pk_Get 指定一个返回属性值的过程
②vbext_pk_Let 指定一个赋值给属性的过程
③vbext_pk_Set 指定一个给对象设置引用的过程
④vbext_pk_Proc 指定所有过程除了Property 过程
注意:空行也会数进来。
MsgBox ThisWorkbook.VBProject.VBComponents.CodeModule.ProcCountLines
③ 返回过程fe中开始行数ProcBodyLine(和上面ProcCountLines的参数一样)
MsgBox ThisWorkbook.VBProject.VBComponents.CodeModule.ProcBodyLine
2、返回模块的内容
① 使用line属性返回代码。
Lines
Sub 返回过程fe中的所有代码 Dim 开始行数, 总行数 With ThisWorkbook.VBProject.VBComponents.CodeModule 开始行数 = .ProcBodyLine 总行数 = .ProcCountLines MsgBox .Lines End With End Sub
② 使用ProcOfLine属性返回代码所在过程名。(和ProcCountLines属性的参数一致。)
Sub 返回第7行所在的过程名 MsgBox ThisWorkbook.VBProject.VBComponents.CodeModule.ProcOfLine End Sub
③ 判断模块和过程是否存在:
使用 Is Nothing来判断,注意写上On Error Resume Next,不加上的话当没有找到模块会报错。
Sub 判断A模块是否存在On Error Resume NextIf ThisWorkbook.VBProject.VBComponents Is Nothing Then MsgBox "B模块没有存在"Else MsgBox "B模块存在"End IfEnd Sub
判断过程是否存在可以看能否提取行数,如果提取不了,程序会报错,错误代码是35,但报错的话,程序就无法运行了,所以要加上On Error Resume Next语句,让程序继续运行。
Sub 判断是否存在b过程On Error Resume NextDim 开始行数开始行数 = ThisWorkbook.VBProject.VBComponents.CodeModule.ProcBodyLineIf Err.Number = 35 Then '如果错误代码是35则不存在B过程,否则存在。 MsgBox "不存在B过程"Else MsgBox "存在B过程"End IfEnd Sub
三、操作模块
1、添加模块、过程、代码
① 添加模块
用Add方法添加,模块有三种:类模块、窗体、标准模块
vbext_ct_ClassModule 将一个类模块添加到集合
vbext_ct_MSForm 将窗体添加到集合
vbext_ct_StdModule 将标准模块添加到集合
Sub 添加新模块BWith ThisWorkbook.VBProject.VBComponents.Add .Name = "B" '新模块的名称是BEnd WithEnd Sub
② 在模块中添加代码AddFromString
Sub 添加新过程Dim sr, code'注意加换行符vbCrLf,否则代码无效sr = "Sub ABC" & vbCrLf & "Msgbox ""测试添加代码""" & vbCrLf & "End Sub" With ThisWorkbook.VBProject.VBComponents.CodeModule .AddFromString srEnd WithEnd Sub
③ 在模块中插入代码InsertLines
Sub 在B模块中的第3行插入一行代码With ThisWorkbook.VBProject.VBComponents.CodeModule .InsertLines 3, "sheets.Select"End WithEnd Sub
2、删除模块、过程、代码
① 删除模块Remove
Sub 删除B模块With ThisWorkbook.VBProject.VBComponents .Remove ThisWorkbook.VBProject.VBComponentsEnd WithEnd Sub
② 删除过程DeleteLines
需要找到开始行数和总行数,把范围内的代码删除。
Sub 删除B模块中的ABC过程Dim 开始行数, 总行数With ThisWorkbook.VBProject.VBComponents.CodeModule 开始行数 = .ProcBodyLine 总行数 = .ProcCountLines DeleteLines 开始行数, 总行数End WithEnd Sub
3、导入、导出和替换一个模块或代码
模块或代码是bas格式文件。
没有直接替换模块的语句,只能采用先导出模块再导入模块的方法。
Sub 导入导出模块'导出模块AThisWorkbook.VBProject.VBComponents.Export "D:/A.bas"'导入模块BThisWorkbook.VBProject.VBComponents.import "D:/B.bas"End Sub
替换指定行代码,可以用replaceline。注意用ProcBodyLine查找到的开始语句是sub语句,所以要替换第一行代码,应该写开始行数+1。
Sub 替换A模块的B程序第一行代码Dim 开始行数With ThisWorkbook.VBProject.VBComponents.CodeModule 开始行数 = .ProcBodyLine .ReplaceLine 开始行数 + 1, "MsgBox ""修改后""" End WithEnd Sub
4、模块的查找Find
Find
Sub 在B模块中查找With ThisWorkbook.VBProject.VBComponents.CodeModule MsgBox .FindEnd WithEnd Sub
返回结果是True和False。
四、添加引用
引用也是可以通过代码添加的~
- 添加引用
Sub 引用IDE ThisWorkbook.VBProject.References.AddFromFile "D:Program FilesVB98VB6EXT.OLB"End Sub
五、实例
1.给文件添加模块
Sub 给文件添加模块Dim wb As Workbook, ph As StringApplication.Displayalerts = Falseph = ThisWorkbook.Path & ""Set wb = Workbooks.Open '打开指定工作簿wbThisWorkbook.VBProject.VBComponents.Export ph & "A.bas" '从当前工作簿导出模块AWindows.Visible = Truewb.VBProject.VBComponents.import ph & "A.bas" '把模块A导入工作簿wbwb.Close TrueSet wb = NothingKill ph & "A.bas" '删除导出的模块A bas文件Application.Displayalerts = TrueEnd Sub
2. 删除指定文件模块
Sub 删除指定文件模块Dim wb As Workbook, ph As StringApplication.Displayalerts = Falseph = ThisWorkbook.Path & ""Set wb = Workbooks.Open '打开指定工作簿wbWindows.Visible = Truewb.VBProject.VBComponents.Remove wb.VBProject.VBComponents '从工作簿wb移除模块Awb.Close TrueSet wb = NothingApplication.Displayalerts = TrueEnd Sub