上下文:我试图通过 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 optional对Application.Run在该行MethodDynamically的方法。
后市展望:我的愿望是,运行Test方法会触发MethodToBeCalled与This doesnt和work作为参数传递。结果将This doesnt work在立即窗口中。
这个问题在这里已经有了答案,但值得考虑一个允许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)
| 归档时间: |
|
| 查看次数: |
7467 次 |
| 最近记录: |