Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-将参数传递给子对象_Vba_Excel - Fatal编程技术网

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

Excel VBA-将参数传递给子对象,vba,excel,Vba,Excel,我有一个函数,它有一个参数,我想传递给Excel VBA中sub的变量。函数的参数是一个范围,比如A1:B1,所以我希望将该范围传递给另一个子函数。有什么方法可以做到这一点吗?到目前为止,我在互联网上读到的所有内容都是关于在sub之间传递函数的结果或参数,而不是函数的参数传递给sub的变量 提前谢谢 编辑以获取更多详细信息: 我有一个函数BuildpgSQL,它包含以下参数,这些参数都是范围数据类型:FieldNames、Table、PageFilters和GroupBy。我还有一个sub,它将

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

提前谢谢

编辑以获取更多详细信息:


我有一个函数BuildpgSQL,它包含以下参数,这些参数都是范围数据类型:FieldNames、Table、PageFilters和GroupBy。我还有一个sub,它将使用相同的PageFilters范围作为变量。与其两次定义参数(一次用于函数,另一次用于子函数),我只想将PageFilters参数从BuildpgSQL传递到子函数的变量。

将发送到函数的参数传递到子例程或其他函数没有问题。以下代码显示了正在运行的:

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


这对于复杂对象(如范围)和简单对象一样有效。

将发送给函数的参数传递给子例程或其他函数没有问题。以下代码显示了正在运行的:

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


这对于复杂对象(如范围)和简单对象一样有效。

正如@paxdiablo所说,让函数调用sub并将其参数传递给sub没有问题。但是,您似乎希望绕过将参数从函数传递到子函数的显式过程,而不将它们显式地列为子函数的参数。子函数中的普通局部变量无法做到这一点,但可以使用

在VBA中,这些变量称为公共或模块级变量,并在任何子变量或函数之外声明。例如:

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
当测试运行并调用另一个子集时,后一个子集能够正确报告已传递给函数的范围

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

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


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

正如@paxdiablo所说,让函数调用sub并将其参数传递给sub没有问题。但是,您似乎希望绕过将参数从函数传递到子函数的显式过程,而不将它们显式地列为子函数的参数。子函数中的普通局部变量无法做到这一点,但可以使用

在VBA中,这些变量称为公共或模块级变量,并在任何子变量或函数之外声明。例如:

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
当测试运行并调用另一个子集时,后一个子集能够正确报告已传递给函数的范围

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

还可以使用公共变量获取另一种类型的全局变量。它们也将在任何模块/子模块之外定义,但使用关键字Public而不是Dim。这将允许在项目中的任何地方访问变量,包括其他模块。这是一篇很好的文章 讨论VBA中的作用域


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

将函数参数传递给subs变量是什么意思?函数可以毫无问题地调用sub,调用可以涉及将函数的参数传递给sub的参数-但是您的意思是希望函数中的值在不调用sub的情况下移动到sub吗?也许您可以更详细地描述您的问题。更新了更多详细信息。谢谢将函数参数传递给subs变量是什么意思?函数可以毫无问题地调用sub,调用可以涉及将函数的参数传递给sub的参数-但是您的意思是希望函数中的值在不调用sub的情况下移动到sub吗?也许您可以更详细地描述您的问题。更新了更多详细信息。谢谢