ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 398|回复: 16

[分享] 研究了一下用代码获取VBA中的全部宏名称的方法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-8-28 17:13 | 显示全部楼层 |阅读模式
准备工作1:信任对VBA工程对象模型的访问
准备工作2:引用VBIDE库(Microsoft Visual Basic for Applications Extensibility 5.3)

代码如下:
  1. Sub ListProceduresInModule()
  2.     Dim vbProj As VBIDE.VBProject      '定义工程对象
  3.     Dim vbComp As VBIDE.VBComponent    '定义工程组件对象
  4.     Dim myCodeModule As Object         '定义代码模块对象,其CountOfLines属性可以获取代码总行数,
  5.                                        'lines函数可获取某一行或几行的代码文本
  6.     Dim lineCodeTxt$, lenOfLineCode%   '行代码文本、长度
  7.     Dim microName$                     '宏名称
  8.    
  9.     Set vbProj = ThisWorkbook.VBProject ' 获取当前工作簿的VB项目

  10.     For Each vbComp In vbProj.VBComponents         '遍历所有组件
  11.         If vbComp.Type = vbext_ct_StdModule Then   '检查组件是否是标准模块
  12.             Set myCodeModule = vbComp.codeModule   '获取代码模块

  13.             For i = 1 To myCodeModule.CountOfLines              '扫描所有代码行
  14.                 lineCodeTxt = myCodeModule.Lines(i, 1)          '获取一行代码文本
  15.                 lenOfLineCode = Len(lineCodeTxt)                '获取一行代码长度
  16.                 If Left(lineCodeTxt, 3) = "Sub" Then            '检查是不是Sub开头
  17.                     microName = Mid(lineCodeTxt, 5, InStr(1, lineCodeTxt, "(") - 5)  '获取宏名称
  18.                     Debug.Print microName
  19.                 End If
  20.             Next i
  21.         End If
  22.     Next vbComp
  23. End Sub
复制代码



信任对VBA工程对象模型的访问.png
引用VBIDE库.png

获取宏名称.zip

14.55 KB, 下载次数: 18

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-28 20:34 | 显示全部楼层
本帖最后由 jaxxcyh 于 2024-8-28 20:44 编辑

修改了一下程序,可以实现以下功能:
1.列出所有宏或函数的名称 - listMicro
2.删除指定宏 - delMicro("宏名称")
3.判断指定宏是否存在 - isExistMicro("宏名称")

获取宏名称-删除指定宏-判断指定宏是否存在.zip

18.05 KB, 下载次数: 21

TA的精华主题

TA的得分主题

发表于 2024-8-28 19:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-8-28 20:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
jaxxcyh 发表于 2024-8-28 20:34
修改了一下程序,可以实现以下功能:
1.列出所有宏或函数的名称 - listMicro
2.删除指定宏 - delMicor( ...

挺不错的。
顶一个!

TA的精华主题

TA的得分主题

发表于 2024-8-28 21:42 | 显示全部楼层
检查是不是sub开头不够准确,新手可能这样写,标准的代码,可不一定是sub开头的。

标准的写法,是会写  public 或者private 进行指定,甚至有时候还会用 static。

另外,函数function也会是独立的一个过程

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-28 23:15 | 显示全部楼层
micch 发表于 2024-8-28 21:42
检查是不是sub开头不够准确,新手可能这样写,标准的代码,可不一定是sub开头的。

标准的写法,是会写   ...

有道理,这么说的话得检查好几种开头的情况了。有没有什么省事点的办法?

TA的精华主题

TA的得分主题

发表于 2024-8-29 07:51 | 显示全部楼层
jaxxcyh 发表于 2024-8-28 23:15
有道理,这么说的话得检查好几种开头的情况了。有没有什么省事点的办法?

是不是可以把可能用到的  public sub 或者private sub 等等写入数组?

TA的精华主题

TA的得分主题

发表于 2024-8-29 09:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
可根据包含sub,且后面包含()来判断,因为end sub和exit sub后面没有括号,function大同小异

TA的精华主题

TA的得分主题

发表于 2024-8-29 09:55 | 显示全部楼层
但是还有一种情况,变量名中包含sub也会误判,所以要加个条件,sub前后不能有空格以外的其他字符。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-29 15:28 | 显示全部楼层
大灰狼1976 发表于 2024-8-29 09:55
但是还有一种情况,变量名中包含sub也会误判,所以要加个条件,sub前后不能有空格以外的其他字符。

能否用正则表达式来匹配出定义宏或函数的代码句子?
Ai提供了一个正则模式:
Regex.Pattern = "^\s*(Public|Private|Friend)?\s*(Sub|Function)\s+\w+\s*$$[^$$]*$$(\s+As\s+[^\s]+)?"
真的像看天书一样。然后它又说这也不是万能的,参数列表里如何出现更复杂的修饰词,这模式也对付不了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-21 11:23 , Processed in 0.036312 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表