获取excel中某个模块的宏列表,然后调用所有这些宏
Get a list of the macros of a module in excel, and then call all those macros
请帮助解决以下问题:
1) 设置"Module3"所有宏列表的代码,并将此列表放在"Sheet5"中,从下面的单元格"E14"开始。
2) 然后,代码应该 运行 所有列出的宏
我尝试使用引用 VBComponent
的代码,但出现错误。
根据我的 google 搜索,我找到了我评论你的答案,但他们忘记了重要的事情,那就是允许你 运行 宏的检查和选项。
首先是列出excel和return中所有宏的函数和用白色分隔的字符串space:
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 步:
第 3 步(最终)勾选选项 "rely on access to the data model project vba":
然后您需要将此引用添加到您的 Excel:
如果您有另一个版本的 Microsoft Visual Basic for Applications Extensibility,请不要担心,在本例中是 5.3。检查然后 accept.Don不要忘记您需要找到该参考,列表顶部没有。
最后,您可以使用另一个名为 execute () 的宏调用 ListAllMacroNames ( ) 函数,看我是否已验证,它不会调用相同的宏(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" 更改为您想要的模块,并设置正确的 sheet 名称(在本例中为 Sheet 5) 在执行方法中。
请帮助解决以下问题:
1) 设置"Module3"所有宏列表的代码,并将此列表放在"Sheet5"中,从下面的单元格"E14"开始。
2) 然后,代码应该 运行 所有列出的宏
我尝试使用引用 VBComponent
的代码,但出现错误。
根据我的 google 搜索,我找到了我评论你的答案,但他们忘记了重要的事情,那就是允许你 运行 宏的检查和选项。
首先是列出excel和return中所有宏的函数和用白色分隔的字符串space:
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 步:
第 3 步(最终)勾选选项 "rely on access to the data model project vba":
然后您需要将此引用添加到您的 Excel:
如果您有另一个版本的 Microsoft Visual Basic for Applications Extensibility,请不要担心,在本例中是 5.3。检查然后 accept.Don不要忘记您需要找到该参考,列表顶部没有。
最后,您可以使用另一个名为 execute () 的宏调用 ListAllMacroNames ( ) 函数,看我是否已验证,它不会调用相同的宏(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" 更改为您想要的模块,并设置正确的 sheet 名称(在本例中为 Sheet 5) 在执行方法中。