Excel VBA - 将参数传递给子函数

jon*_*ris 3 excel vba

我有一个函数,它有一个参数,我想将其传递给 Excel VBA 中的子变量。该函数的参数是一个范围,例如 A1:B1,所以我希望将该范围传递给另一个子函数。有没有办法做到这一点?到目前为止,我在互联网上读到的所有内容都涉及在子程序之间传递函数或参数的结果,但不是将函数的参数传递给子程序的变量。

提前致谢!

编辑以获取更多详细信息:

我有一个函数 BuildpgSQL,其以下参数均为范围数据类型:FieldNames、Table、PageFilters 和 GroupBy。我还有一个子组件,它将使用相同的 PageFilters 范围作为变量。我不想将参数定义两次 - 一次为函数,再次为子程序,我只想将 PageFilters 参数从 BuildpgSQL 传递到子程序的变量。

Joh*_*man 5

正如@paxdiablo所说,让函数调用子函数并将其参数传递给子函数是没有问题的。但是,您似乎想绕过将参数从函数显式传递到子函数,而不将它们显式列为子函数的参数。你不能用子程序中的普通局部变量来做到这一点,但你可以用全局变量来做到这一点。

在 VBA 中,这些称为PublicModule Level变量,并在任何子函数或函数外部声明。例如:

Dim Table As Range
Dim FieldNames As Range 'module level variables

Function BuildpgSQL(tbl As Range, fldnames As Range)
    Set Table = tbl
    Set FieldNames = fldnames
    'do stuff
End Function

Sub AnotherSub()
    MsgBox "Table = " & Table.Address & ", & FieldNames =" & FieldNames.Address
End Sub

Sub test()
    BuildpgSQL Range("A1"), Range("A2:B2")
    AnotherSub     
End Sub
Run Code Online (Sandbox Code Playgroud)

testrun 和 invokes时AnotherSub,后一个 sub 能够正确报告已传递给函数的范围。

我在任何子或函数定义之外声明了这两个变量。然后——模块中的任何子/函数对这些变量所做的任何更改都可以由模块中的任何其他子/函数读取。这使得这些变量成为模块中的全局变量。这些在 VBA 中通常很有用,但应谨慎使用,因为它们往往会降低代码的模块化程度,从而更难以调试。

您还可以使用Public变量来获取另一种类型的全局变量。它们也可以在任何模块/子之外定义,但使用关键字Public而不是Dim。这将允许在项目中的任何地方访问变量,包括其他模块。是一篇讨论 VBA 范围的好文章。

最后,请注意,我在函数中使用了全局变量和类似命名的参数。这是为了更好地匹配您的具体问题。在实践中,摆脱中间人并消除那些函数参数会更有意义。无论代码调用该函数,都可以首先设置公共变量(如果尚未设置),然后调用该函数。