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
Vba 为什么可以';我是否将数组(在数组中)作为参数传递?_Vba_Excel_Arguments - Fatal编程技术网

Vba 为什么可以';我是否将数组(在数组中)作为参数传递?

Vba 为什么可以';我是否将数组(在数组中)作为参数传递?,vba,excel,arguments,Vba,Excel,Arguments,我有一个数组arraggratedarrays(1到8) 我可以这样叫潜艇: call sub(ArrNewClient) 但如果我尝试以下方法,就会出现编译错误:“类型不匹配”: call sub(arrAggregatedArrays(1)) 为什么??有办法解决吗 为什么它不能将arraggratedarray(1)识别为一个数组,即使它会像正常情况一样在其上执行UBound之类的功能 Public arrAggregatedArrays() As Variant '

我有一个数组
arraggratedarrays(1到8)

我可以这样叫潜艇:

call sub(ArrNewClient)
但如果我尝试以下方法,就会出现编译错误:“类型不匹配”:

call sub(arrAggregatedArrays(1))
为什么??有办法解决吗

为什么它不能将
arraggratedarray(1)
识别为一个数组,即使它会像正常情况一样在其上执行
UBound
之类的功能

Public arrAggregatedArrays()     As Variant      '/ Holds all the sheet-Data Arrays  
“/在单独的模块中声明

      ReDim arrAggregatedArrays(1 To 8)
            arrAggregatedArrays(1) = arrNewClient
            arrAggregatedArrays(2) = arrExistingClient
            arrAggregatedArrays(3) = arrGroupSchemes
            arrAggregatedArrays(4) = arrOther
            arrAggregatedArrays(5) = arrMcOngoing
            arrAggregatedArrays(6) = arrJhOngoing
            arrAggregatedArrays(7) = arrAegonQuilterArc
            arrAggregatedArrays(8) = arrAscentric

      Call FilterSheetArrayForColumns(arrAggregatedArrays(1))

Public Sub FilterSheetArrayForColumns(ByRef arrCurrentArray() As Variant)
和屏幕截图:


如评论中所述,您需要更多地展示您正在使用的实现。这对我有用

Sub arr_test()
    Dim arr As Variant

    arr = Array(Array(1, 2, 3), Array(2, 3, 4), _
                Array(3, 4, 5), Array(4, 5, 6))

    Debug.Print LBound(arr, 1) & ":" & UBound(arr, 1)
    Debug.Print LBound(arr(1), 1) & ":" & UBound(arr(1), 1)

    Call arr_sub(arr)
    Call arr_sub(arr(1))

End Sub

Sub arr_sub(tarr As Variant)
    Debug.Print "arr_sub - "; LBound(tarr, 1) & ":" & UBound(tarr, 1)
End Sub
即时窗口中的结果:

arr_test
0:3
0:2
arr_sub - 0:3
arr_sub - 0:2

您可以通过以下两种方式之一创建
变体
数组:

Dim v1() As Variant
Dim v2: v2 = Array()
对于前者,您可以使用
v1()
符号作为子例程参数接收数组,就像VBA中的任何其他数据类型数组一样。对于后者,您需要将其作为普通变量接收,而不使用数组表示法


变体是特殊的,因为它们可以包含许多类型,包括数组类型,这就是
v=array()
语法起作用的原因。当这样做时,它们应该像对待任何其他变量一样,以这种方式传入和传出子例程。

您需要向我们展示您的声明以及该变量是如何初始化的。抱歉,添加了详细信息。@Zak-现在我们只需要查看
filterseetarrayforcolumns()的函数声明。
。我猜您将它作为
a()变量
而不是
a变量
接收。变种是特殊的。变量本身可以用来表示数组。那么将数组作为
array
传递和作为
array()
传递有什么区别呢?@Zak-我添加了一个答案来解释这一区别。抱歉,添加了详细信息。谢谢。你能解释一下为什么/如何
array
array()
在程序对它们的感知/操作方面是不同的吗?我想了解其中涉及的基本概念。如果我不能将
array
传递给一个期望
array()
的函数,这是否意味着我也不能传递
array()
对于一个需要
数组的函数来说
?除了它们的传递方式之外,两者之间没有太大区别。
变量
变量可用于存储任何类型的数组。例如,您可以
将s(0)设置为字符串,然后将其分配给
变量,如下所示:
将v设置为变量:v=s
。因此,从概念上来说,它可能有助于将其视为一种通用的东西,而不仅仅是一种内在价值。我相信您也看到过将对象分配给变量的示例。变量的
Dim v1()和变量的
Dim v2:v2=Array()
之间有一个细微的区别。后者可以对其边界进行安全测试(
LBound=0
UBound=-1
),如果您需要根据其当前大小动态调整其大小,这将非常有用:例如,
ReDim v2(UBound(v2)+1)
。使用前一种方法是不可能的。