0

我试图确定何时在没有提供 ParamArray 参数的工作表上使用了使用 ParamArray 的用户定义函数 (UDF)。

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

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

  • 将数组的第一个元素与 Nothing 或 Not Nothing 进行比较会引发错误
  • IsEmpty 报告错误
  • IsArray 奇怪地报告 True
  • IsError 对两个测试和测试都报告 False (0)

测试参数 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 返回的内容。

在此处输入图像描述

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

4

2 回答 2

3

TL;DR - 使用 if IsMissing(tests) Then ...

NTL&WR:

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

来自:参数数组 (Visual Basic)
参数数组是自动可选的。它的默认值是参数数组元素类型的空一维数组。

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

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

由于它始终是一个变体类型参数,因此它也会使用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 将确定用户是否提供了参数数组。

在此处输入图像描述

于 2018-06-03T06:51:02.380 回答
1

数组分配的一个很好的解释是http://www.cpearson.com/Excel/IsArrayAllocated.aspx

精选:

下面的函数,IsArrayAllocated将准确返回 True 或 False 指示数组是否已分配。此函数适用于任意维数的静态和动态数组,并且适用于具有有效(不会导致错误)LBound值的未分配数组

和功能

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带有参数数组的 a 一起使用

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
于 2018-06-04T00:46:48.567 回答