Visual Basic: ошибка времени выполнения "9": нижний индекс вне допустимого диапазона

Я пытаюсь сделать скрипт, который может удалять дубликаты в списке номеров. Единственная проблема, я продолжаю получать Subscript out of range (Error 9).

Sub remDupes()
Dim units() As Variant
For i = 2 To 37
    Dim var As String
    If ((Not Not units) = 0) Then
        For x = 0 To 36
            var = Cells(i, 22).Value
            If (units(x) = var) Then
                Range("V" & i, "AA" & i).Value = ""
            Else
                units(x) = var
            End If
        Next
    End If
Next
End Sub

Ошибки возникают при:

If (units(x) = var) Then

И я не уверен, почему


person Mathias Frandsen    schedule 07.03.2016    source источник
comment
Units - это массив переменного размера, вам нужно указать его размер, прежде чем сохранять в нем значение. Используйте 1_.   -  person Vincent G    schedule 07.03.2016
comment
Я не совсем уверен, что вы пытаетесь сделать, но лучше использовать либо метод RemoveDuplicates объекта Range, либо использование объекта Collection или Dictionary.   -  person Ron Rosenfeld    schedule 07.03.2016
comment
@RonRosenfeld Спасибо! Я оглядываюсь уже несколько часов, и вы первый, кто это предложил.   -  person Mathias Frandsen    schedule 07.03.2016
comment
@MathiasFrandsen Попробуйте один из этих методов и, если у вас возникнут проблемы, отредактируйте исходный вопрос, чтобы попросить о помощи; если нет, вы можете опубликовать свои результаты в качестве ответа на свой вопрос.   -  person Ron Rosenfeld    schedule 07.03.2016
comment
If ((Not Not units) = 0) Thenне имеет для меня никакого смысла. Для чего это используется ? Фактический код создает пустой массив размера 0. Попробуйте Ìf Len(Join(units))>0 then   -  person Patrick Lepelletier    schedule 08.03.2016


Ответы (1)


Вам нужно будет добавить следующую строку ниже перед строкой, вызвавшей ошибку.

ReDim Preserve units(0 To x)

Новый код будет выглядеть так.

Sub remDupes()
Dim units() As Variant
For i = 2 To 37
    Dim var As String
    If ((Not Not units) = 0) Then
        For x = 0 To 36
            var = Cells(i, 22).Value
            ReDim Preserve units(0 To x)
            If (units(x) = var) Then
                Range("V" & i, "AA" & i).Value = ""
            Else
                units(x) = var
            End If
        Next
    End If
Next
End Sub
person Catalin Pop    schedule 07.03.2016
comment
Я не очищаю свои дубликаты, но больше не сообщает об ошибке. - person Mathias Frandsen; 07.03.2016