【问题标题】:VBA Variant - IsNull and IsEmpty both false for empty arrayVBA Variant - IsNull 和 IsEmpty 对于空数组均为 false
【发布时间】:2016-05-10 23:36:53
【问题描述】:

我有一个包含许多变体的 VBA 类。这些变体用于保存 Y x Z 大小的数组,但它们是可选输入(因此变体通常永远不会被使用或初始化)。

同一类中的函数调用这些变体中的每一个来执行计算。但是,我需要它来跳过空白的变体。当我尝试使用 IsNull(xyz) 和 IsEmpty(xyz) 时,两者都返回 false。看xyz上的手表,有:

Expression: xyz
Value:
Type: Variant/Variant()
Context: className

价值下完全空白。

如果这些东西是空的,有什么想法可以测试/返回布尔值吗?或者甚至是布尔值,如果它们已满,那也可以。

谢谢

编辑:我应该补充一点,IsMissing 完全崩溃了 excel...

【问题讨论】:

  • 您可以声明没有维度的数组,也可以显式检查每个元素。
  • 我从不声明变量。您是否建议我将其声明为 Variant()? [多维数组包含多种数据类型]
  • 我从不声明变量。我个人认为这不是一个好习惯,它可以在编写时节省一些时间,但代码可能更难调试。跨度>
  • 我将其声明为 Variant()。但我没有给数组等指定大小
  • @keynesiancross 在这种情况下,您可以在LBOUND(variable) 上测试“超出范围”错误,或者,也许,结合ISARRAYLBOUND 寻找TrueError 9

标签: vba excel


【解决方案1】:

非常肮脏的解决方法,但这样的事情可能会奏效:

Function IsEmptyArray(testArr As Variant) As Boolean

Dim test As Long
Dim ret As Boolean

ret = False

    On Error Resume Next
    test = UBound(testArr)

    If Err.Number = 9 Then
        ret = True
    End If

    Err.Clear
    On Error GoTo 0

    IsEmptyArray = ret

End Function

【讨论】:

    【解决方案2】:

    我过去使用的一种方法是使用辅助函数来测试数组是否被填充。我使用空字符串分隔符加入数组并测试长度是否大于零。它在我的情况下有效,但我不确定逻辑是否存在任何缺陷。

    如果数组为空,则以下代码返回 true,否则返回 false:

    Function TestIfArrayIsEmpty(vArray As Variant) As Boolean
        TestIfArrayIsEmpty = (Len(Join(vArray, "")) = 0)
    End Function
    

    【讨论】:

    • 哦 - 发现错误...当我在非空数组上运行测试时遇到无效的过程调用或参数错误
    • @keynesiancross 刚刚查看过。如果您传入多维数组,它将不起作用,我刚刚读到的是您正在做的事情。让我看看我是否可以修改
    • 酷 - 谢谢啊。我现在正在搞砸它,并考虑采用添加错误处理程序的懒惰路线。
    • 似乎错误处理是最好的方法,尽管我不想这样做。我们只是在 VBA 中对数组没有那么多支持。
    • @keynesiancross 您可以尝试对数组进行双重转置以使其成为一维,然后然后使用此函数(假设它是二维数组?)
    【解决方案3】:

    你可以使用 vartype(variable_name. 你可以检查 vartype(varriable_name) = vbArray 或 VbEmpty 或 VbNull 然后检查每个维度的 LBound 和 UBound 例如

    LBound(variable, 1) 和 UBound(variable_name, 1) 检查数组的低位和高位索引。

    【讨论】:

    • 这不起作用,因为我的非空和空变体数组都返回 vartype = 8204
    • 不知道为什么它被否决但是的,这正是它应该如何工作的。变体的类型是数组。时期。您应该检查数组类型是否为 vbArray。一旦你有了数组,你需要检查它是否真的是空的。
    猜你喜欢
    • 2021-11-22
    • 2013-08-07
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2021-11-25
    • 2015-11-02
    • 2010-10-16
    相关资源
    最近更新 更多