分享好友 站长动态首页 网站导航

VBA学习笔记65: 代码操作代码

网友发布 2022-10-26 20:35 · 头闻号编程技术

学习资源:《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。


四、添加引用

引用也是可以通过代码添加的~

  1. 添加引用

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

免责声明:本平台仅供信息发布交流之途,请谨慎判断信息真伪。如遇虚假诈骗信息,请立即举报

举报
反对 0
打赏 0
更多相关文章

评论

0

收藏

点赞