【发布时间】: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”。该搜索实际上返回了数百个结果,其中一些很可能正是您正在寻找的结果。