Excel VBA中的动态函数调用

sba*_*ers 11 excel vba dynamic excel-vba

我只是好奇是否有办法动态调用函数.例如.

Sub foo1()
   Debug.Print "in foo1"
End Sub

Sub foo2()
   Debug.Print "in foo2"
End Sub
Run Code Online (Sandbox Code Playgroud)

有没有办法让我可以这样做:

Sub callSomeFoo(i as Integer)
   Call foo&i
End Sub
Run Code Online (Sandbox Code Playgroud)

或者是这样的必要:

Sub callSomeFoo(i as Integer)
   Select Case i
      Case 1 
         Call foo1
      Case Else
         Call foo2
   End Select
End Sub
Run Code Online (Sandbox Code Playgroud)

不是紧迫的事情......只是好奇.任何其他创造性的事情要做功能调用也是受欢迎的.

谢谢!

edit1:这是我的代码和下面列出的错误:

Sub foo1()
   Debug.Print "in foo1"
End Sub


Sub foo2()
   Debug.Print "in foo2"
End Sub


Sub callSomeFoo()
   Dim i%
   'using a cell on the worksheet to determine the function. Happens to be "1"
   i = Sheets("Sheet1").Range("A1").Value
   'Line below works
   Call foo1
   'Line below gives me an error
   Application.Run "foo"&i
End Sub
Run Code Online (Sandbox Code Playgroud)

错误是:

运行时错误'1004'无法运行宏'foo1'.宏可能在此工作簿中不可用,或者可能禁用所有宏.

And*_*ASM 16

你想要运行方法!

Sub callSomeFoo(i as Integer)
   Application.Run "foo" & i
End Sub
Run Code Online (Sandbox Code Playgroud)

但那不起作用,VBA不喜欢这个名字foo1,所以它不会起作用.

这是因为FOO1也可以是细胞参考.Application.Run的第一个arg可以是一个Range对象,因此它会评估FOO1,认为它是一个单元格,并且因为该单元格为空,所以不知道该怎么做. - 迪克库斯莱卡

通过选择更长的更好的方法名称可以轻松解决这个问题.

经过测试的工作示例

Option Explicit

Public Sub TestDynamic1()
  Debug.Print "TestDynamic 1"
End Sub

Sub TestDynamic2()
  Debug.Print "TestDynamic 2"
End Sub

Private Sub TestDynamic3()
  Debug.Print "TestDynamic 3"
End Sub

Sub callTestDynamic(i As Integer)
  On Error GoTo DynamicCallError
  Application.Run "TestDynamic" & i
  Exit Sub
DynamicCallError:
  Debug.Print "Failed dynamic call: " & Err.Description
End Sub

Public Sub TestMe()
  callTestDynamic 1
  callTestDynamic 2
  callTestDynamic 3
  callTestDynamic 4
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 这是因为FOO1也可以是细胞参考.Application.Run的第一个arg可以是一个Range对象,因此它会评估FOO1,认为它是一个单元格,并且因为该单元格为空,所以不知道该怎么做. (6认同)