【问题标题】:VBA: Don't go into loop when array is emptyVBA:当数组为空时不要进入循环
【发布时间】:2012-03-26 14:32:08
【问题描述】:

我有一个看起来像这样的循环:

For Each article In artAll
Next

或者像这样:

For i = 0 To Ubound(artAll)
Next

当数组长度为 0 时,我收到一条错误消息。当数组为空时跳过循环的好方法是什么?我怀疑我应该使用

On Error Goto

但我需要帮助来确定解决方案。

【问题讨论】:

  • 你检查了 for 循环内的 ubound(artAll) = 0 条件吗?
  • 你的意思是数组没有被维度化?如果是这种情况,那么处理Ubound()(或LBound())错误的唯一方法是使用错误处理程序。
  • 使用错误处理程序处理这个问题的好方法是什么?我应该捕获一个特定的异常并在循环后使用 if err.number 吗?还是去标签更好?
  • 你可以使用If IsArray() Then

标签: vba


【解决方案1】:
If Len(Join(artAll, "")) = 0 Then
     'your for loops here

应该有效

【讨论】:

  • 这对于大型数组是不可取的。
  • 是的,“If IsArray() Then”的建议更有意义。
【解决方案2】:

我使用这个函数来测试空数组:

Public Function isArrayEmpty(parArray As Variant) As Boolean
'Returns false if not an array or dynamic array that has not been initialised (ReDim) or has been erased (Erase)

    If IsArray(parArray) = False Then isArrayEmpty = True
    On Error Resume Next
    If UBound(parArray) < LBound(parArray) Then isArrayEmpty = True: Exit Function Else: isArrayEmpty = False

End Function

然后在你的主代码中:

If isArrayEmpty(yourArray) Then
   'do something - typically:
   MsgBox "Empty Array"
   Exit Function
End If

For i = LBound(yourArray,1) To UBound(yourArray,1)
   'do something
Next i

【讨论】:

    【解决方案3】:

    我喜欢@Dan 给出的解决方案,但我想我会抛出我通常如何处理无量纲数组:

    Dim lngUboundTest As Long
    
    lngUboundTest = -1
    On Error Resume Next
    lngUboundTest = UBound(artAll)
    On Error GoTo 0
    
    If lngUboundTest >= 0 Then
        'Your loop...
    

    【讨论】:

      【解决方案4】:

      这是一个老问题,但我找到了这个问题的解决方案,它可能对其他人有帮助:

      If (Not myArray) = True Then
      
          'Undimensionalized array. Respond as needed.
      
      Else
      
          'Array isn't empty, you can run your loop.
      
      End If
      

      它在最近的一个项目中帮助了我,并且发现它非常方便。

      【讨论】:

      • 非常好!有趣的是 If (myArray) Then 不起作用?哦,好吧... IsEmpty() 在我的情况下不起作用,因为我正在处理一组用户定义类型...但是这个解决方案成功了!
      • 一开始看起来不错,但对我没有用,因为我可能遇到了@assylias函数isArrayEmpty(parArray as Variant)解决的问题:stackoverflow.com/a/9875956/1915920
      【解决方案5】:

      我发现此线程正在寻找一个问题的解决方案,即如果维度元素为空,则循环通过多维数组将失败。我通过循环一个最多可以有 6 个数据集的源来创建数组。然后在处理后我会再重复 19 次。

      Dim varDeskData As Variant
      Dim varDesk As Variant
      ReDim varDesk(1 To 6)
      
      For y = 1 To 6
          ReDim varDeskData(1 To 4)
          varDeskData(1) = "nifty integer from source(y)"
          varDeskData(2) = "nifty string from source(y)"
          varDeskData(3) = "another nifty string from source(y)"
          varDeskData(4) = "another nifty string from source(y)"
          varDesk(y) = varDeskData
      Next y
      

      当我运行以下命令时,我会处理前三个,但第四个会失败,因为我只将三个加载到父数组中:

      For y = 1 To 6
          If varDesk(y)(1) > 0 Then
      
              ... do nifty stuff ...
      
          End If
      End If
      

      在父数组的顶级元素上使用 IsEmpty 过程修复了这个问题:

      For y = 1 To 6
          If IsEmpty(varDesk(y)) = False Then
              If varDesk(y)(1) > 0 Then
      
              ... do nifty stuff ...
      
              End If
          End If
      End If
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        • 2016-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-24
        • 2013-04-01
        相关资源
        最近更新 更多