是否可以在Excel VBA中将函数或sub作为参数传递?

时间:2019-06-25 16:58:20

标签: excel vba

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

这是我正在处理的代码的基本概述。包括我使用Variant的失败尝试。

如您所见,我正在尝试让BBG每次检查不同的范围,然后每次调用不同的子程序。这就是为什么我希望能够指定在等待BBG完成后要调用哪个子程序。

更新:我使用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

2 个答案:

答案 0 :(得分: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 & "'"

反映变化。

答案 1 :(得分:-1)

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