индекс вне диапазона в цикле VBA - PullRequest
0 голосов
/ 03 октября 2018

Не могли бы вы помочь мне разобраться с этой проблемой? Если на листе Excel есть значение даты, то всякий раз, когда я хочу вызвать Ubound или Lbound массива, который я определил, возникает ошибка «Подстрочный индекс вне диапазона».Конкретный код, который я написал в VBA, выглядит следующим образом:

Sub conditiondate()
    Dim i As Integer
    Dim WS As Worksheet
    Dim WB As Workbook

    Dim Proinv As Workbook
    Dim ProinvPath As String
    Dim Proinvtemp As Workbook
    Dim arrFlight() As Variant

    Dim NewArray2 As Variant
    Dim lngIndex2 As Integer
    Dim lngNItems2 As Integer

    Dim n As Integer
    'Dim newarr As Variant
    Dim j As Integer

    Set WB = Application.ActiveWorkbook


    startingdate = Worksheets(1).Range("C3")     'From
    endingdate = Worksheets(1).Range("C4")       'To


    For Each WS In Worksheets
        i = 1
        j = 0
        Do
            i = i + 1
            j = j + 1
            If WS.Cells(i + 10, 3) >= startingdate And WS.Cells(i + 10, 3) <= endingdate Then

                WS.Cells(i + 10, 3).Font.Color = vbRed

                WS.Cells(i + 10, 3).Offset(0, 13) = "issued"

                ReDim Preserve arrFlight(j)

                arrFlight(j) = WS.Cells(i + 10, 3).Value
            Else

                WS.Cells(i + 10, 3).Font.Color = vbBlue

            End If

        Loop Until i = 200

        MsgBox UBound(arrFlight)                 ' <<---SCRIPT OUT OF RANGE EMERGED HERE**
    Next WS

end Sub

спасибо за вашу помощь

1 Ответ

0 голосов
/ 03 октября 2018

Для предотвращения ошибки времени выполнения 9 вы можете проверить, был ли выделен массив, и показать MsgBox, если это так

If IsArrayAllocated(arrFlight) Then
    MsgBox UBound(arrFlight)    ' <<---SCRIPT OUT OF RANGE EMERGED HERE**
End If

Я использовал функцию IsArrayAllocated found здесь

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

Обновление Цитата по приведенной выше ссылке для объяснения alloacted

Существует два типа массивов: статические массивы, в которыхРазмеры массива задаются в операторе Dim и динамических массивах, в которых массив выделяется и измеряется с помощью оператора ReDim.Говорят, что массив выделяется, если он потребляет память, имеет допустимые нижние и верхние границы и содержит данные (даже если эти данные являются значениями по умолчанию для типа данных массива, например пустые строки массива переменных типа String).Статический массив по определению всегда выделяется.Вы никогда не сможете изменить размер, перераспределить, освободить или освободить память, занятую статическим массивом.Однако с помощью динамического массива вы можете изменять размер, перераспределять, освобождать и освобождать память массива.(Переменная типа Varaint, которая содержит массив, всегда содержит динамический массив.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...