如何动态调用另一个Sub的Sub

时间:2016-07-28 16:06:39

标签: excel vba excel-vba macros

到目前为止,我从未遇到过这个想法,但是可以将另一个宏设置为当前宏中的变量,以便从VBA代码中调用它吗?我已经尝试在我有限的知识中这样做而且它没有用。

我所拥有的是一个包含组合框的用户表单,该组合框是一个报表列表。然后我从该组合框中选择的值与特定的Sub(按标题)匹配。每个报告都有自己的宏,用于每月更新。

我编写了第一个宏的VBA(基于用户表单上的“运行”按钮),将变量(iVal)设置为等于包含匹配的子标题的工作表单元格中的值。我希望我可以使用该变量根据该值调用相应的Sub标题。它不喜欢变量。

在此处查看错误的屏幕截图:https://i.imgsafe.org/a2a199edb8.png

否则,我认为我最好的选择是使用数组循环。我希望避免这种情况,因为这个组合框中可能选择的列表几乎有50种不同的可能性,可能会随着时间的推移而扩大或缩小。显然,当报告列表和匹配的宏发生变化时,这将是一项耗时且难以管理的问题。

我甚至不知道这是否可行。这是我以前从未解决过的一个新的VBA挑战,所以它属于“我不知道我不知道的”领域。提前感谢任何建设性的反馈。

    Private Sub Run_Click()
    'Runs the Analysis

    Dim ProjectWB As Workbook
    Set ProjectWB = ActiveWorkbook
    Dim iWS As Worksheet
    Dim sName As String
    Dim tName As String
    Dim iName As String

    Set iWS = Worksheets("Streetwise Ideas")

    'Error handling for empty file fields

    Application.ScreenUpdating = False
    Unload Me

        If TextBox1.Value = "" Then
            MsgBox "Please select a Source file.", vbCritical, "Error No Source file"
            If vbOK Then
            UserForm1.Show
            End If
        Else
        If TextBox2.Value = "" Then
            MsgBox "Please select a Target file.", vbCritical, "Error No Target file"
            If vbOK Then
            UserForm1.Show
            End If
        Else
        End If
        End If

        'place value of the selection from the combobox in cell D2 on "Streetwise Ideas" sheet for referencing later in the macro
        iWS.Activate
        Range("D2").Select
        Selection.Value = cbSWIdeas

    sName = TextBox1.Value

    tName = TextBox2.Value

    'Opens Source workbook file and sets it to variable sWB
    Dim sWB As Workbook
    Set sWB = Workbooks.Open(sName)

    'Opens Target workbook file and sets it to variable tWB
    Dim tWB As Workbook
    Set tWB = Workbooks.Open(tName)

    'Calls the correct macro for the combobox selection

    Dim iVal As String
    iVal = iWS.Range("E2").Value

        If iVal <> "" Then
            Call iVal
        Else
            'do nothing
            MsgBox ("No Idea Selected.")
        Exit Sub

        End If

    Application.ScreenUpdating = True

    End Sub

1 个答案:

答案 0 :(得分:3)

您可以使用Application.Run按名称调用宏

Sub Example()

    Dim MacroName As String
    MacroName = "HelloWorld"
    Application.Run MacroName

End Sub

Sub HelloWorld()

    MsgBox "Hello World!"

End Sub