VBA: не зацикливаться, когда массив пуст - PullRequest
1 голос
/ 26 марта 2012

У меня есть цикл, который может выглядеть так:

For Each article In artAll
Next

или как это:

For i = 0 To Ubound(artAll)
Next

Когда длина массива равна 0, я получаю сообщение об ошибке. Что такое хороший способ пропустить цикл, когда массив пуст? Я подозреваю, что я должен использовать

On Error Goto

но мне нужна помощь для завершения решения.

Ответы [ 5 ]

11 голосов
/ 26 марта 2012
If Len(Join(artAll, "")) = 0 Then
     'your for loops here

Должно работать

7 голосов
/ 26 марта 2012

Я использую эту функцию для проверки пустых массивов:

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 голосов
/ 02 июля 2014

Это старый вопрос, но я нашел решение этой проблемы, и оно могло бы помочь другим:

If (Not myArray) = True Then

    'Undimensionalized array. Respond as needed.

Else

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

End If

Это помогло мне в недавнем проекте, и оказалось, что это очень удобно.

2 голосов
/ 26 марта 2012

Мне нравится решение, данное @Dan, но я решил показать, как я обычно буду обрабатывать одномерный массив:

Dim lngUboundTest As Long

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

If lngUboundTest >= 0 Then
    'Your loop...
0 голосов
/ 11 сентября 2017

Я обнаружил, что этот поток ищет решение проблемы, при которой циклическое выполнение многомерного массива завершится ошибкой, если размерный элемент будет пустым.Я создал массив, просматривая источник, который может иметь до 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...