UDF 中缺少 ParamArray

Missing ParamArray in a UDF

我正在尝试确定何时在未提供 ParamArray 参数的情况下在工作表上使用了使用 ParamArray 的用户定义函数 (UDF)。

我已经尝试过 IsEmpty、IsArray、IsError、与无比较、与零长度字符串比较等

我知道 paramarray 总是 byVal 并且变体数组总是从零开始,但如果它不存在,它怎么是一个数组?

测试参数 UDF:

Public Function testParams(ByRef ndx As Long, ParamArray tests())
    Select Case ndx
        Case 1
            testParams = CBool(tests(LBound(tests)) Is Nothing)
        Case 2
            testParams = IsEmpty(tests)
        Case 3
            testParams = IsArray(tests)
        Case 4
            testParams = IsError(tests)
        Case 5
            testParams = CBool(tests(LBound(tests)) = vbNullString)
    End Select
End Function

在下面的示例中,我只是返回工作表尝试访问 ParamArray returns。

如何确定用户是否没有在需要它们的真实 UDF 中提供 ParamArray 参数?我更喜欢简单的布尔检查而不是测试是否有东西是什么。

长话短说 - 使用 if IsMissing(tests) Then ...

NTL&WR:

即使 ParamArray 不能与任何声明的 Optional 参数(包括 ParamArray 本身)一起使用,如果省略它也不会引发错误。可以很容易地说明 ParamArray 始终是可选的,尽管它不能这样标记。

From: Parameter Arrays (Visual Basic)
The parameter array is automatically optional. Its default value is an empty one-dimensional array of the parameter array's element type.

用户未提供的 ParamArray 将是一个已实例化但既未填充也未确定尺寸的变体数组。

它将被定义为 LBound of 0 (zero) and a UBound -1(减一)。这与声明但未标注尺寸的任何其他变体数组相同。

因为也是always a variant type parameter, it will also correctly report its presence or absence with IsMissing

Public Function testParams(ByRef ndx As Long, ParamArray tests())
    Select Case ndx
        Case 1
            testParams = CBool(tests(LBound(tests)) Is Nothing)
        Case 2
            testParams = IsEmpty(tests)
        Case 3
            testParams = IsArray(tests)
        Case 4
            testParams = IsError(tests)
        Case 5
            testParams = CBool(tests(LBound(tests)) = vbNullString)
        Case 6
            testParams = CBool(UBound(tests) = -1)
        Case 7
            testParams = IsMissing(tests)
    End Select
End Function

测试 IsMissing 或 UBound 值 -1 将确定用户是否提供了参数数组。

http://www.cpearson.com/Excel/IsArrayAllocated.aspx

对数组分配有很好的解释

摘录:

The function below, IsArrayAllocated will accurately return True or False indicating whether the array is allocated. This function will work for both static and dynamic arrays of any number of dimensions, and will correctly work for unallocated arrays with valid (non-error-causing) LBound values

和函数

Function IsArrayAllocated(Arr() As Variant) As Boolean
    On Error Resume Next
    IsArrayAllocated = IsArray(Arr) And _
        Not IsError(LBound(Arr, 1)) And _
        LBound(Arr, 1) <= UBound(Arr, 1)
End Function

将其与 Function 参数数组

一起使用
Function MyFunc(ParamArray pa()) As Variant
    Dim v()
    v = pa
    If IsArrayAllocated(v) Then
        'Do stuff with the parameters
    Else
        'There are no parameters...
    End If
End Function