本帖最后由 AS850629754 于 2018-6-10 14:00 编辑
此文章已在知乎发表,在这里分享一下https://zhuanlan.zhihu.com/p/37867936
2018-06-08在某度知道看到一个提问
看到这个问题后,我想到了以前看过了某篇文章 但该文章内的返回过程名语句实际操作时报错
又找了一篇文章 利用这两篇文章,得到了【获取工作表内代码行数/指定行内容】的代码
思路: 遍历工作表,判断代码行数是否大于0 如果大于0,遍历每一行代码,用正则表达式判断是否为XXXX Sub 过程名()形式 如果是,取出过程名,调用该过程
因为需要获取VBA工程中的数据,必须在excel选项-信任中心-信任中心设置中勾选“信任对VBA工程对象模型的访问”
代码如下: - Sub 依次运行工作表中的宏()
- Dim subline As Integer
- Dim strline As String
- Dim subname As String
- For i = 1 To Sheets.Count
- subline = ThisWorkbook.VBProject.VBComponents(Sheets(i).Name).CodeModule.countoflines '获取工作表模块代码行数
- If subline > 0 Then '行数大于0时
- For L = 1 To subline '遍历代码行
- strline = ThisWorkbook.VBProject.VBComponents(Sheets(i).Name).CodeModule.Lines(L, 1) '获取每行代码
- With CreateObject("VBScript.RegExp") '使用正则表达式判断代码是否为*Sub *()形式,如果是则调用
- .Global = True
- .Pattern = ".*Sub\s(.*)\(\)"
- If .test(strline) Then
- subname = Sheets(i).Name & "." & .Replace(strline, "$1")
- Application.Run subname
- End If
- End With
- Next
- End If
- Next i
- End Sub
复制代码
后来那个提问者采纳了一个灌水答案,可以说那次答题体验非常不愉快
|