问题 Excel VBA中的动态函数调用


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

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'。宏可能在此工作簿中不可用,或者可能禁用所有宏。


12098
2017-11-07 20:24


起源



答案:


你想要的 运行方法

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

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

这是因为FOO1也可以是细胞参考。第一个arg   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

14
2017-11-07 20:32



谢谢!我去试了一下,得到了一个错误。请看edit1: - sbanders
我知道,我也遇到过。我只是在研究原因 foo1 不起作用。有关工作示例,请参阅我的编辑。 - AndASM
Wwweeeeiiiiirrrrddddd ... Excel字面上只是不喜欢“foo”大声笑。再次感谢! - sbanders
Foo 没关系, Fooo1 没关系,但是 Foo1 不是。资本化并不重要。我不知道为什么。 - AndASM
这是因为FOO1也可以是细胞参考。 Application.Run的第一个arg可以是一个Range对象,因此它会评估FOO1,认为它是一个单元格,并且由于该单元格为空,因此不知道该怎么做。 - Dick Kusleika


答案:


你想要的 运行方法

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

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

这是因为FOO1也可以是细胞参考。第一个arg   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

14
2017-11-07 20:32



谢谢!我去试了一下,得到了一个错误。请看edit1: - sbanders
我知道,我也遇到过。我只是在研究原因 foo1 不起作用。有关工作示例,请参阅我的编辑。 - AndASM
Wwweeeeiiiiirrrrddddd ... Excel字面上只是不喜欢“foo”大声笑。再次感谢! - sbanders
Foo 没关系, Fooo1 没关系,但是 Foo1 不是。资本化并不重要。我不知道为什么。 - AndASM
这是因为FOO1也可以是细胞参考。 Application.Run的第一个arg可以是一个Range对象,因此它会评估FOO1,认为它是一个单元格,并且由于该单元格为空,因此不知道该怎么做。 - Dick Kusleika