我有一个函数,它有一个参数我想传递给Excel VBA中的子变量。函数的参数是一个范围,比如A1:B1,所以我希望将该范围传递给另一个子范围。有没有办法做到这一点?到目前为止,我在互联网上阅读的所有内容都涉及在subs之间传递函数或参数的结果,而不是传递给子变量的函数参数。
提前致谢!
修改了更多详细信息:
我有一个函数BuildpgSQL,其中包含以下所有范围数据类型的参数:FieldNames,Table,PageFilters和GroupBy。我还有一个sub将使用相同的PageFilters范围作为变量。而不是两次定义参数 - 一次为函数而另一次为sub,我只想将BuildFSQL中的PageFilters参数传递给子变量。
答案 0 :(得分:2)
正如@paxdiablo所说,使用函数调用sub并没有问题,这样就可以将其参数传递给sub。但是,您似乎想要绕过明确地将参数从函数传递给sub而不将它们明确地列为sub的参数。您不能使用sub中的普通局部变量执行此操作,但可以使用global variables执行此操作。
在VBA中,这些变量称为Public
或Module 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
)。
这对于复杂对象(例如范围)也适用于简单对象。