Excel VBA – 将参数parameter passing给Sub

我有一个函数有一个参数,我想传递给Excel VBA中的子variables。 函数的参数是一个范围,比如A1:B1,所以我想把这个范围传递给另一个子集。 有没有办法做到这一点? 到目前为止,我在互联网上读过的所有东西都是在subs之间传递一个函数或参数的结果,而不是传递给一个subvariables的函数参数。

提前致谢!

编辑更多的细节:

我有一个函数,BuildpgSQL,以下参数都是范围数据types:FieldNames,Table,PageFilters和GroupBy。 我也有一个将使用相同的PageFilters范围作为variables的子。 而不是定义参数两次 – 一次为函数,再次为子,我想只传递从BuildpgSQL的PageFilters参数到子的variables。

正如@paxdiablo所说,有一个函数调用一个子没有问题,并在这样做传递给它的参数。 但是,你似乎想绕过将函数的parameter passing给子的明确性,而不必将它们明确地作为参数列入子。 你不能用sub中的普通局部variables来做到这一点,但你可以用全局variables来做到这一点。

在VBA中,这些被称为PublicModule Levelvariables,并在任何子或函数之外声明。 例如:

 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 

当运行test并调用AnotherSub ,后者可以正确地报告已经传递给函数的范围。

我声明了任何子或函数定义之外的两个variables。 然后 – 模块中的任何子/function对这些variables的任何改变都可以被模块中的任何其他子/function读取。 这使得这些variables在模块中成为全局variables。 这些在VBA中通常很有用,但应该谨慎使用,因为它们往往会使代码更less模块化,因此更难以debugging。

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

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

将parameter passing给一个子程序(或另一个function)的函数没有问题。 以下代码显示了在行动中:

 Option Explicit Sub sub2(z As Integer) MsgBox (CStr(z)) End Sub Function fn1(y As Integer) As Integer MsgBox (CStr(y)) sub2 (y) fn1 = y End Function Sub Macro1() Dim x as Integer x = fn1(12) End Sub 

在上面的代码中,你可以看到主macros调用该函数,函数将该函数传递给子例程。 消息框通过过程在不同的点输出variables(当然,所有的输出都是12 )。

对于复杂对象(如范围),这同样适用于简单对象。