如何直接从加载项调用Subs

时间:2015-09-25 17:36:43

标签: excel vba excel-vba

因此,通过VBA代码编写可以调用附加库中的子/函数的代码显然很容易,只需执行

call myFunctionOrSub

但是,有没有办法允许用户直接调用加载项中的公共子?例如,当用户转到工具 - >宏并拉出这个屏幕:

Macro Selection

我想在该框中的宏列表中添加所有包含在链接到该文件的加载项中的Subs。也就是说,我有一个由当前工作簿引用的库(library.xlam)。在这个library.xlam文件中,我有Subs(比如copyToResults)。我希望copyToResults在此列表中显示为可运行的宏。有没有办法做到这一点?

我能想出的唯一解决方案是在我的测试文件中为library.xlam中的每个Sub创建一个Sub。测试文件中的这个Sub不会通过调用库的子进行任何操作。然而,这对于拥有外部库并且可扩展性很差而言非常糟糕,所以我们绝对不想走这条路。

1 个答案:

答案 0 :(得分:0)

  1. 使用列表框在xlam中创建一个表单。
  2. 使用此帖子中的脚本填充表单。您将不得不更改一些Excel设置。 Get a list of the macros of a module in excel, and then call all those macros
  3. 以下是我表格中的代码:

    Private Sub btnCancel_Click()
        Unload Me
    End Sub
    
    Private Sub btnExecute_Click()
    
        Application.Run "macros.xlam!" & lstMacros.Value
        Unload Me
    End Sub
    
    
    Private Sub UserForm_Initialize()
    
    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 Not vbcomp.CodeModule = "Utilities" 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
                                    frmMacros.lstMacros.AddItem curMacro
                                End If
    
                           End If
                        Next
                    End If
                End If
         Next
    
    Next
    End Sub
    

    最后我看起来像这样: Macros Form