14

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

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

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

有没有办法可以做类似的事情:

Sub callSomeFoo(i as Integer)
   Call foo&i
End Sub

或者是这样的必要:

Sub callSomeFoo(i as Integer)
   Select Case i
      Case 1 
         Call foo1
      Case Else
         Call foo2
   End Select
End Sub

不是什么紧迫的事情……只是好奇。也欢迎任何其他有创意的事情来做函数调用。

谢谢!

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

错误是:

运行时错误“1004”无法运行宏“foo1”。该工作簿中的宏可能不可用,或者所有宏都可能被禁用。

4

1 回答 1

18

你想要运行方法

Sub callSomeFoo(i as Integer)
   Application.Run "foo" & i
End Sub

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

这是因为 FOO1 也可以是单元格引用。Application.Run 的第一个参数可以是 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
于 2013-11-07T20:32:43.453 回答