为什么我不能将数组(在数组中)作为参数传递?

时间:2015-08-23 00:14:00

标签: excel vba excel-vba arguments

我有一组数组arrAggregatedArrays(1 to 8)

我可以像这样调用一个子:

call sub(ArrNewClient)

但是我收到了一个编译错误:“如果我尝试这个,请输入”Mismatch“:

call sub(arrAggregatedArrays(1))

为什么呢?它有办法吗?

为什么它不会将arrAggregatedArrays(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)

和截图:

Compile Error

2 个答案:

答案 0 :(得分:6)

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

Dim v1() As Variant
Dim v2: v2 = Array()

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

变量是特殊的,因为它们可以包含许多类型,包括数组类型,这就是v = Array()语法有效的原因。当这样做时,它们应该被视为任何其他变量,并以这种方式进出子例程。

答案 1 :(得分:1)

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

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