在 VBA 中将动态参数传递给 Application.Run - 错误 449 参数不是可选错误

noo*_*r69 6 excel vba

上下文:我试图通过 VBA 的Application.Run函数动态调用一个方法,并动态地将参数传递给该方法。与其说是实际用例,不如说是概念证明。

代码:

Public Sub Test()
    Call MethodDynamically("MethodToBeCalled", "This doesnt, work")
End Sub

Public Sub MethodDynamically(MethodName As String, Params As String)
    Application.Run MethodName, Params
End Sub

Public Sub MethodToBeCalled(Param1 As String, Param2 As String)
    Debug.Print Param1 & " " & Param2
End Sub
Run Code Online (Sandbox Code Playgroud)

错误:运行Test我收到方法Run-time error '449': Argument not optionalApplication.Run在该行MethodDynamically的方法。

后市展望:我的愿望是,运行Test方法会触发MethodToBeCalledThis doesntwork作为参数传递。结果将This doesnt work在立即窗口中。

Rob*_*zie 6

这个问题在这里已经有了答案但值得考虑一个允许MethodDynamically使用任意数量的参数调用其他子例程的示例。

解决方案是使用ParamArray来处理未知数量的参数。例如:

Option Explicit

Public Sub Test()
    Call MethodDynamically("MethodToBeCalled1", "This", "works") '<-- 2 args
    Call MethodDynamically("MethodToBeCalled2", "This", "works", "too") '<-- 3 args
    Call MethodDynamically("MethodToBeCalled3", "This", "works", "too", "as well") '<-- 4 args
    Call MethodDynamically("MethodToBeCalled4", "Working", 10, 2, 35) '<-- 4 args; different types
End Sub

Public Sub MethodDynamically(MethodName As String, ParamArray Params() As Variant)
    Application.Run MethodName, Params
End Sub

Public Sub MethodToBeCalled1(Params As Variant)
    Debug.Print Params(0) & " " & Params(1)
End Sub

Public Sub MethodToBeCalled2(Params As Variant)
    Debug.Print Params(0) & " " & Params(1) & " " & Params(2)
End Sub

Public Sub MethodToBeCalled3(Params As Variant)
    Debug.Print Params(0) & " " & Params(1) & " " & Params(2) & " " & Params(3)
End Sub

Public Sub MethodToBeCalled4(Params As Variant)
    Debug.Print Params(0) & " " & CStr((Params(1) ^ Params(2)) + Params(3))
End Sub
Run Code Online (Sandbox Code Playgroud)

输出:

This works
This works too
This works too as well
Working 135
Run Code Online (Sandbox Code Playgroud)