Excel VBA - 将参数参数传递给 Sub
Posted
技术标签:
【中文标题】Excel VBA - 将参数参数传递给 Sub【英文标题】:Excel VBA - Passing Argument Parameter to Sub 【发布时间】:2016-04-15 02:49:20 【问题描述】:我有一个函数,该函数有一个参数,我想将其传递给 Excel VBA 中的子变量。该函数的参数是一个范围,比如 A1:B1,所以我希望将该范围传递给另一个子。有没有办法做到这一点?到目前为止,我在互联网上阅读的所有内容都涉及在 subs 之间传递函数或参数的结果,而不是传递给 sub 变量的函数参数。
提前致谢!
已编辑以获取更多详细信息:
我有一个函数 BuildpgSQL,它具有以下所有范围数据类型的参数:FieldNames、Table、PageFilters 和 GroupBy。我还有一个 sub 将使用相同的 PageFilters 范围作为变量。我不想将参数定义两次——一次用于函数,一次用于子程序,我只想将 PageFilters 参数从 BuildpgSQL 传递给子程序的变量。
【问题讨论】:
“将函数参数传递给 subs 变量”是什么意思?函数可以毫无问题地调用 subs,并且调用可能涉及将函数的参数传递给sub 的参数-但是您的意思是您希望函数中的值在某种程度上移动到sub 而没有子甚至被调用?也许您可以更详细地描述您的问题。 更新了更多细节。谢谢! 【参考方案1】:正如@paxdiablo 所说,让函数调用 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
变量来获取另一种类型的全局变量。它们也可以在任何模块/子之外定义,但使用关键字Public
而不是Dim
。这将允许在项目的任何地方访问变量,包括其他模块。 Here 是一篇讨论 VBA 范围的好文章。
最后,请注意,我在函数中使用了全局变量和类似命名的参数参数。这是为了更好地匹配您的具体问题。在实践中,摆脱中间人并消除那些函数参数会更有意义。无论代码调用函数,都可以先设置公共变量(如果尚未设置),然后调用函数。
【讨论】:
【参考方案2】:将发送给函数的参数传递给子例程(或其他函数)没有问题。以下代码显示了这一点:
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
)。
这对于复杂对象(例如范围)和简单对象一样有效。
【讨论】:
以上是关于Excel VBA - 将参数参数传递给 Sub的主要内容,如果未能解决你的问题,请参考以下文章