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 中,这些变量称为 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 变量来获取另一种类型的全局变量。它们也可以在任何模块/子之外定义,但使用关键字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的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给查询访问 VBA

VBA 将日期参数传递给 SQL Server 存储过程

Microsoft Access VBA 将参数传递给报表

如何使用 vba 将参数传递给 asp.net web api?

VBA ADO 将数组参数传递给存储过程

如何将参数传递给SQL(Excel)中的查询