【问题标题】:Get a list of the macros of a module in excel, and then call all those macros在excel中获取一个模块的宏列表,然后调用所有这些宏
【发布时间】:2015-01-25 01:32:41
【问题描述】:

请帮助解决以下问题:

1) 设置“Module3”的所有宏列表的代码,并将此列表放在“Sheet5”中,从下面的单元格“E14”开始。

2) 然后,代码应该运行所有列出的宏

我尝试使用引用 VBComponent 的代码,但出现错误。

【问题讨论】:

  • 你试试这个代码? stackoverflow.com/questions/3922772/return-a-list-of-all-macros WD2000:返回宏和过程名称的示例宏?
  • 谢谢@JuanRuizdeCastilla,我试过了,但出现了错误。我已经设置了 excel 设置,插入了一个新模块,并在其中添加了函数和子。但是,出现:“编译错误:未定义用户定义类型”,并且“Dim pj As VBProject”在VBA窗口中以蓝色突出显示。
  • 你看到我的答案了吗?,我会编辑,因为你需要添加参考,请稍后检查我的答案。
  • 好的,检查新的另外两张图片。
  • 感谢@JuanRuizdeCastilla。那个具体问题已经解决了,但是现在有两个问题:1)这段代码正在调用所有的宏,我只需要调用Module3的宏,2)我需要在“Sheet5”中获取Module3的宏列表,开始在下面的单元格“E14”中。谢谢!

标签: excel vba call vbe


【解决方案1】:

根据我的谷歌搜索,我找到了我评论过你的答案,但他们忘记了重要的事情,那就是检查和允许你运行宏的选项。

首先列出excel中所有宏的函数,并返回和字符串用空格分隔:

Function ListAllMacroNames() As String

Dim pj As VBProject
Dim vbcomp As VBComponent
Dim curMacro As String, newMacro As String
Dim x As String
Dim y As String
Dim macros As String

On Error Resume Next
curMacro = ""
Documents.Add

For Each pj In Application.VBE.VBProjects

     For Each vbcomp In pj.VBComponents
            If Not vbcomp Is Nothing Then
                If vbcomp.CodeModule = "Module_name" Then
                    For i = 1 To vbcomp.CodeModule.CountOfLines
                       newMacro = vbcomp.CodeModule.ProcOfLine(Line:=i, _
                          prockind:=vbext_pk_Proc)

                       If curMacro <> newMacro Then
                          curMacro = newMacro

                            If curMacro <> "" And curMacro <> "app_NewDocument" Then
                                macros = curMacro + " " + macros
                            End If

                       End If
                    Next
                End If
            End If
     Next

Next

ListAllMacroNames = macros

End Function

下一步,可能是第一步,您需要更改办公室(Excel)信任中心的一些配置,检查以下图像:

第 1 步:

第 2 步:

Step 3 (Final) 勾选“依赖访问数据模型项目vba”选项:

然后您需要将此引用添加到您的 Excel:

如果您有另一个版本的 Microsoft Visual Basic for Applications Extensibility,请不要担心,在本例中是 5.3。检查然后接受。不要忘记您需要找到该引用,列表顶部没有。

最后你可以调用 ListAllMacroNames ( ) 函数 使用另一个名为 execute () 的宏,看看我已经验证了它不会调用相同的宏(execute , ListAllMacroNames )或者可能会产生无限循环。

Public Sub execute()
Dim AppArray() As String

AppArray() = Split(ListAllMacroNames, " ")

For i = 0 To UBound(AppArray)

temp = AppArray(i)

If temp <> "" Then

    If temp <> "execute" And temp <> "ListAllMacroNames" Then

    Application.Run (AppArray(i))


    Sheet5.Range("E" & i + 14).Value = temp

    End If

End If

Next i

End Sub

编辑 2 将第一种方法中的“Module_name”更改为您想要的模块,并在执行方法中设置正确的工作表名称(在本例中为工作表 5)。

【讨论】:

  • Visual Basic 7 仍然抛出 VBComponent 错误
  • @adi,这是 vba 的答案,不确定 vb 7 是否相同或具有相同的 vba 行为...,也许如果您发布一个新问题并且所有 SO 社区都可以提供帮助你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
相关资源
最近更新 更多