Попытка вызвать Sub с помощью String - VBA

У меня есть следующий код.

Я не могу для жизни понять это.

Я хочу вызвать другой sub в зависимости от значения i.

Например, если i = 1 он должен вызывать sale_call1, а если i = 2, он должен вызвать sale_call2.

Private Sub test_Click()
    Dim i As String
    Dim pro As String

    i = Me.tb1.Value
    pro = "sale_call" + i

    If i = "1" Then
        Call pro
    Else
        Call pro
    End If
End Sub

Sub sale_call1()
    MsgBox "Hello"
End Sub

Sub sale_call2()
    MsgBox "goodbye"
End Sub

Ответ 1

Попробуйте это

Замените Call pro на Application.Run pro

Пример

Private Sub test_Click()
    Dim i As String
    Dim pro As String

    i = 1
    pro = "sale_call" + i

    '~~> This will run sale_call1
    Application.Run pro

    i = 2
    pro = "sale_call" + i

    '~~> This will run sale_call2
    Application.Run pro
End Sub

Sub sale_call1()
    MsgBox "Hello"
End Sub

Sub sale_call2()
    MsgBox "goodbye"
End Sub

Followup

Если ваш код отсутствует в модуле, но в области Userform или Sheet Code, то Application.Run не будет работать до тех пор, пока время sale_call1 или sale_call2 не будет помещено в модуль. Если вы не хотите переместить их в модуль, вам придется использовать CallByName. Проверьте встроенную справку Excel для этой функции. Вот пример, который предполагает, что код находится в Userform1

Private Sub CommandButton1_Click()
    Dim i As String
    Dim pro As String

    i = 1
    pro = "sale_call" + i

    '~~> This will run sale_call1
    CallByName UserForm1, pro, VbMethod

    i = 2
    pro = "sale_call" + i

    '~~> This will run sale_call2
    CallByName UserForm1, pro, VbMethod
End Sub

Sub sale_call1()
    MsgBox "Hello"
End Sub

Sub sale_call2()
    MsgBox "goodbye"
End Sub

Ответ 2

Просто добавьте в качестве префикса имя рабочей книги, где размещен макрос. Как и при создании формулы в ячейке:

Application.Run "WorkbookNameAsString.app_ext!MacroName"