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

时间:2016-04-15 02:49:20

标签: excel vba excel-vba

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

提前致谢!

修改了更多详细信息:

我有一个函数BuildpgSQL,其中包含以下所有范围数据类型的参数:FieldNames,Table,PageFilters和GroupBy。我还有一个sub将使用相同的PageFilters范围作为变量。而不是两次定义参数 - 一次为函数而另一次为sub,我只想将BuildFSQL中的PageFilters参数传递给子变量。

2 个答案:

答案 0 :(得分:2)

正如@paxdiablo所说,使用函数调用sub并没有问题,这样就可以将其参数传递给sub。但是,您似乎想要绕过明确地将参数从函数传递给sub而不将它们明确地列为sub的参数。您不能使用sub中的普通局部变量执行此操作,但可以使用global variables执行此操作。

在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

运行test并调用AnotherSub时,后一个子能够正确报告已传递给函数的范围。

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

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

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

答案 1 :(得分:1)

将发送到函数的参数传递给子例程(或其他函数)没有问题。以下代码显示了实际操作:

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

在上面的代码中,您可以看到主宏调用该函数,并且该函数将该函数传递给子例程。消息框在整个过程中的不同点输出变量(当然所有输出都为12)。

这对于复杂对象(例如范围)也适用于简单对象。