【问题标题】:Dynamic Function Calls in Excel VBAExcel VBA 中的动态函数调用
【发布时间】:2013-11-19 16:32:02
【问题描述】:

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

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

不是一个紧迫的问题...只是好奇。也欢迎任何其他有创意的事情来做函数调用。

谢谢!

编辑1: 这是我的代码和下面列出的错误:

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”。该工作簿中的宏可能不可用,或者所有宏都可能被禁用。

【问题讨论】:

    标签: vba excel dynamic


    【解决方案1】:

    你想要run method

    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
    

    【讨论】:

    • 谢谢!我去试了一下,报错了。请参阅编辑1:
    • 我知道,我也遇到过。我只是在研究为什么foo1 不起作用。请参阅我的编辑以获取工作示例。
    • Wwweeeeiiiiirrrrddddd... Excel 字面上只是不喜欢“foo”哈哈。再次感谢!
    • Foo 可以,Fooo1 可以,但Foo1 不行。大小写无关紧要。我不知道为什么。
    • 这是因为 FOO1 也可以是单元格引用。 Application.Run 的第一个 arg 可以是 Range 对象,因此它评估 FOO1,认为它是一个单元格,并且由于该单元格是空的,所以不知道该怎么做。
    猜你喜欢
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多