使用ParamArray

时间:2019-07-22 08:37:08

标签: excel vba

我正在尝试构建一个仅在VBA编辑器中使用的函数,该函数接收一个二维数组并根据传递的列号和条件对其进行过滤,例如Excel的SUMIFS函数。我的方法是编写另一个仅根据一个列和一个条件进行过滤的函数,然后构建一个采用ParamArray的较大函数,然后遍历每个列/条件对并调用较小的函数进行过滤。问题是当我将ParamArray传递到更大的函数时,它始终显示“ ByRef参数类型不匹配”。

更大的函数接受以下参数:(数据数组,column1,criteria1,columnnum2,criteria2等)

这是较小的函数,仅使用一个条件进行过滤。

Function HFILTER(arr As Variant, column As Long, name As Variant)
Dim res_arr() As Variant
Dim i As Long, j As Long
Dim coll As Collection

Set coll = New Collection

For i = 1 To UBound(arr, 1)
    If arr(i, column) = name Then
        coll.Add i
    End If
Next i

ReDim res_arr(1 To coll.count, 1 To UBound(arr, 2))

For i = 1 To coll.count
    For j = 1 To UBound(arr, 2)
        res_arr(i, j) = arr(coll(i), j)
    Next j
Next i

HFILTER = res_arr

End Function

更大的函数接受以下参数:(数据数组,column1,criteria1,columnnum2,criteria2等)

Function HFILTERS(arr As Variant, ParamArray args()) As Variant
Dim i As Long, res_arr() As Variant

res_arr = arr

For i = 0 To UBound(args, 1) - 1 Step 2
  res_arr = HFILTER(res_arr, args(i), args(i + 1))
Next i

HFILTERS = res_arr
End Function

但是,当我尝试将参数传递给更大的函数时,出现错误ByRef参数类型不匹配。

数据:

Here's a picture of the data

Sub Test()
Dim data() As Variant

data = Range("A2", "B16").Value

data = HFILTERS(data, 1, "A", 2, False)
End Sub

任何输入都将不胜感激。我想我缺少了一些非常简单的东西,但无法分辨出它是什么。

1 个答案:

答案 0 :(得分:0)

没关系,我想通了。由于ParamArray必须处于Variant模式,因此任何使用传递参数的参数也必须声明为Variant模式。在我的HFILTER函数(上面较小的一个函数)中,colunm定义为Long,将其更改为Variant,现在一切正常。

相关问题