使用 ParamArray 时 ByRef 参数类型不匹配
Posted
技术标签:
【中文标题】使用 ParamArray 时 ByRef 参数类型不匹配【英文标题】:ByRef Argument Type mismatch while using ParamArray 【发布时间】:2019-07-22 08:37:08 【问题描述】:我正在尝试构建一个仅在 VBA 编辑器中使用的函数,该函数接收一个二维数组并根据传递的列号和标准对其进行过滤,例如 Excel 的 SUMIFS 函数。我的方法是编写另一个仅基于一列和一个标准进行过滤的函数,然后构建较大的函数,该函数采用 ParamArray,然后循环遍历每个列/标准对并调用较小的函数进行过滤。问题是当我将 ParamArray 传递给更大的函数时,它一直显示“ByRef Argument Type Mismatch”。
更大的函数接受这些参数:(数据数组、columnnum1、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
更大的函数接受这些参数:(数据数组、columnnum1、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 Argument Type Mismatch。
数据:
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
非常感谢任何输入。我想我错过了一些非常简单但无法弄清楚它是什么的东西。
【问题讨论】:
请提供一个minimal reproducible example - 您所拥有的具体内容尚不清楚。您可以使用问题下方的edit 链接提供示例数据(我们没有您的工作簿!)以及所有复制问题所需的(最少)代码。它不必是整个函数 - 它可以是一个“存根”,足以触发错误。 @CindyMeister 你好。我添加了一个示例数据。重现错误所需的所有代码都已包含在内。 【参考方案1】:没关系,我想通了。由于 ParamArray 需要在 Variant 中,因此使用传递的参数的任何内容也必须声明为 Variant。在我的 HFILTER 函数(上面较小的那个)中,列定义为 Long,将其更改为 Variant,现在一切正常。
【讨论】:
以上是关于使用 ParamArray 时 ByRef 参数类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章
从被调用的函数调用函数时 VBA byref 参数类型不匹配
Visual Basic 6.0中ByVal和ByRef的区别和应用示例!optional和缺省时的区别和应用示例!
无法在此 ref ClassName (byRef) 方法上使用类功能 C# 7.2