Call a Sub with a String
Solution 1:
Try this
Replace Call pro
with Application.Run pro
Example
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
If your code is not in a module but in a Userform or Sheet Code area then Application.Run
will not work till the time sale_call1
or sale_call2
is not placed in a module. If you do not wish to move them to a module then you will have to use CallByName
. Check Excel's inbuilt help on this function. Here is an example which assumes that the code is in 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
Solution 2:
Just add as prefix the workbook name where the macro is hosted. Like when doing a formula in a cell:
Application.Run "WorkbookNameAsString.app_ext!MacroName"