VBA:当数组为空时不要进入循环

时间:2012-03-26 14:32:08

标签: vba

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

For Each article In artAll
Next

或者像这样:

For i = 0 To Ubound(artAll)
Next

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

On Error Goto

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

5 个答案:

答案 0 :(得分:11)

If Len(Join(artAll, "")) = 0 Then
     'your for loops here

应该工作

答案 1 :(得分:7)

我使用此函数来测试空数组:

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

答案 2 :(得分:2)

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

Dim lngUboundTest As Long

lngUboundTest = -1
On Error Resume Next
lngUboundTest = UBound(artAll)
On Error GoTo 0

If lngUboundTest >= 0 Then
    'Your loop...

答案 3 :(得分:2)

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

If (Not myArray) = True Then

    'Undimensionalized array. Respond as needed.

Else

    'Array isn't empty, you can run your loop.

End If

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

答案 4 :(得分:0)

我发现这个线程正在寻找解决问题的方法,如果尺寸元素为空,循环遍历多维数组会失败。我通过循环遍历最多可包含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