代码之家  ›  专栏  ›  技术社区  ›  user4039065

自定义项中缺少paramarray

  •  0
  • user4039065  · 技术社区  · 6 年前

    我正在尝试确定在工作表中何时使用了使用paramarray的用户定义函数(udf),而没有提供paramarray参数。

    我试过iEmpty、iArray、iSerror,比较一下what,比较一下零长度的字符串,等等。

    我知道paramarray始终是byval,variant数组始终是基于零的,但是如果它不存在,那么它是如何成为数组的呢?

    • 将数组的第一个元素与nothing或nothing进行比较会引发错误
    • 虚报
    • 伊萨雷奇怪地说是真的
    • iSerror报告两个测试和测试均为False(0)

    测试参数自定义项:

    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返回的内容。

    enter image description here

    如何确定用户是否在需要参数的实际udf中未提供paramarray参数?我更喜欢一个简单的布尔检查,而不是测试某个东西是否为零。

    2 回复  |  直到 6 年前
        1
  •  1
  •   chris neilsen    6 年前

    关于数组分配的一个很好的解释是 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 带参数数组

    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
    
        2
  •  3
  •   user4039065    6 年前

    tl;dr-如果忽略(测试),则使用…

    非关税壁垒

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

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

    用户没有提供的paramarray将是一个已实例化但既没有填充也没有正维数的变量数组。

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

    既然是 always a variant type parameter ,它还将用 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将确定用户是否提供了paramarray。

    enter image description here

    推荐文章