web-dev-qa-db-ja.com

文字列で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
13
CallMeMunchy

これを試して

Call proApplication.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

[〜#〜]フォローアップ[〜#〜]

コードがモジュール内ではなく、ユーザーフォームまたはシートコード領域にある場合、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
22
Siddharth Rout

接頭辞として、マクロがホストされているワークブック名​​を追加するだけです。セルで数式を実行するときのように:

Application.Run "WorkbookNameAsString.app_ext!MacroName"
2
Maiqui