使用 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

在 python 中的 byref 向量参数上使用 ctypes 进行 DLL 转换

VBA 中 Byref 和Byvel 怎么用呢

excel 宏:ByRef 参数类型不匹配