【问题标题】:Is it possible to pass a function or sub as an argument in Excel VBA?是否可以在 Excel VBA 中将函数或子函数作为参数传递?
【发布时间】:2019-06-26 02:05:56
【问题描述】:

我想将函数/子名称作为参数传递,以便我可以在 Excel VBA 中的另一个函数/子中调用它。这可能吗?如果是这样,我将其设置为什么类型?我尝试设置为 Variant,但没有奏效。我不确定还能尝试什么。

这是我正在编写的代码的基本大纲。包括我使用 Variant 失败的尝试。

如您所见,我试图让 waitingBBG 每次检查不同的范围,然后每次调用不同的 sub。这就是为什么我希望能够在 waitBBG 完成后指定调用哪个 sub。

更新:我使用 Application.Run 而不是 Call 更新了代码

Sub part_1
    Dim calculation_rng as String
    calculation_rng = "A1"

    Call waitingBBG(calculation_rng, "part_2")
End Sub
Sub waitingBBG(calculation_rng As String, call_id As Variant)

    If Application.WorksheetFunction.CountIfs(Range(calculation_rng), "#N/A Requesting Data...") > 0 Then
        'Check every 1 second
        Application.OnTime Now + TimeValue("00:00:01"), "waitingBBG"
    Else
        'Call rest of code
        Application.Run "'my_addin.xlam'!" & call_id
    End If

End Sub
Sub part_2
    Dim calculation_rng as String
    calculation_rng = "B1"

    Call waitingBBG(calculation_rng, "part_3")

End Sub
Sub part_3
    Msgbox("Success")
End Sub

【问题讨论】:

  • 你不能这样做,当 VBA 评估参数是什么时,该过程被调用(即它试图将函数的 返回值 作为参数传递, Sub 不返回任何内容)。如果你想传递一个过程的name,那么你的参数需要是一个String,它包含你想要调用的过程的名字。然后Application.Run就可以运行了。
  • 另外,由于您要求waitingBBG 中的范围,因此您需要在两个子部分中使用Setcalculation_rng。
  • @MathieuGuindon 是的,我知道我上面的尝试在我输入之前就行不通了。这个例子只是为了说明我想要做什么。我忘了你可以在字符串上使用 Application.Run 。我会尝试并报告。谢谢!
  • @ScottCraner 感谢您指出这一点。我只是在快速输入一个示例——这不是我的实际代码。我的代码有效,但我只是想知道如何更改它以使用 waitingBBG 调用不同的函数
  • 我不确定您要做什么,但我建议您在页面顶部搜索“传递函数参数 vba”。该搜索实际上返回了数百个结果,其中一些很可能正是您正在寻找的结果。

标签: excel vba


【解决方案1】:

@MathieuGuindon 提供了正确的解决方案。谢谢!

基本上,我需要将函数名作为字符串传递并使用Application.Run 而不是Call

还有,

Application.OnTime Now + TimeValue("00:00:01"), "waitingBBG"

需要改成

Application.OnTime Now + TimeValue("00:00:01"), "'waitingBBG """ & calculation_rng & """,""" & call_id & "'"

反映变化。

【讨论】:

    【解决方案2】:
    Sub sub1()
    Dim a As String
    a = "hii"
    sub2 (a)
    End Sub
    Sub sub2(val As String)
    If val = "hi" Then
    
    MsgBox (val)
    Else
    MsgBox ("sub2 else")
    sub3 (val)
    End If
    End Sub
    
    Sub sub3(val1 As String)
    MsgBox (val1)
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2020-02-19
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多