Данные VBA Variant с нижним индексом вне диапазона

Я немного новичок в Excel VBA и после некоторых исследований я собрал воедино некоторый рабочий код (см. Внизу). Основываясь на этом коде и нескольких других вещах, которые я нашел, я создал этот беспорядок:

Sub TranslateNewBOM()


Dim NewFootPrint As Variant
Dim Translated As Variant
Dim temp As String
Dim n As Long
Dim MaxRow As Integer

Do
    MaxRow = n
    n = n + 1
Loop Until Cells(n, 3).Value = "stop"

Cells(3, 8).EntireColumn.Insert

NewFootPrint = Range(Cells(3, 7), Cells(MaxRow, 7)).CurrentRegion.Value
Translated = Range(Cells(3, 8), Cells(MaxRow, 8)).CurrentRegion.Value


For i = 3 To MaxRow
    temp = NewFootPrint(i, 7)  'THIS IS THE LINE THAT GIVES ME THE ERROR
    temp = Left(temp, 3)
    If temp = "" Then
        Cells(i, 5).Value = "void"
    End If
    If temp = "CAP" Then
        Translated(i, 8).Value = "SMC" & Right(NewFootPrint(i, 7).Text, _
        Len(NewFootPrint(i, 7).Text) - 3)
        Translated(i, 8) = Replace(Translated(i, 8).Text, " ", "-")
    End If
Next i

End Sub

Эта ошибка не имеет смысла для меня; скорее всего потому, что я не совсем понимаю варианты или массивы в VBA. Однако, когда я сравниваю его с другим кодом, который я сделал, синтаксис почти идентичен в отношении NewFootPrint. Разница лишь в том, что количество участвующих намного больше. Здесь рабочий код, он находится в стадии разработки из-за ужасного соглашения об именах. NewFootPrint ~= DataRangeNew в моем уме.

РЕДАКТИРОВАТЬ: Нижний код больше не работает. Я не помню, чтобы что-то менять, но теперь появляется та же ошибка вне диапазона. Я теряю волосы, когда мы говорим.

Sub GetandSortBOM()
' Data is imported through a template from a raw database.

' Variable declarations
Dim xnum As Integer
Dim MaxRows As Long
Dim Rng As Variant
Dim DataRangeNew As Variant
Dim DataRangeOld As Variant
Dim DataRangeNewFoot As Variant
Dim DataRangeNewTo As Variant
Dim DataRangeNewFootTo As Variant
Dim Irow As Long
Dim rows As Long
Dim MaxCols As Long
Dim MyVarOld As String
Dim MyVarNew As String
Dim temp() As String


DataRangeNew = Range(Cells(2, 12), Cells(1587, 12)).CurrentRegion.Value         ' These work together
DataRangeNewFoot = Range(Cells(2, 13), Cells(1587, 13)).CurrentRegion.Value     ' and store data in
DataRangeOld = Range(Cells(3, 3), Cells(MaxRows, 3)).CurrentRegion.Value        ' columns without cell
DataRangeNewTo = Range(Cells(3, 8), Cells(MaxRows, 8)).CurrentRegion.Value      ' manipulation. Too much
DataRangeNewFootTo = Range(Cells(3, 7), Cells(MaxRows, 7)).CurrentRegion.Value  ' data to go through without
Rng = Range(Cells(3, 7), Cells(MaxRows, 8)).CurrentRegion.Value
NumRows = Range(Cells(2, 12), Cells(1587, 12)).CurrentRegion.rows.Count


For rows = 3 To MaxRows
    MyVarOld = DataRangeOld(rows, 3)
    For Irow = 1 To NumRows
                                         ''''''''''''''''''''''''''''''''''''''''''''''
        MyVarNew = DataRangeNew(Irow, 12)' Why does this work, but not my other code? '
                                         ''''''''''''''''''''''''''''''''''''''''''''''
        If MyVarOld = MyVarNew Then
            DataRangeNewTo(rows, 8) = DataRangeOld(rows, 3)
            DataRangeNewFootTo(rows, 7) = DataRangeNewFoot(Irow, 13)
        End If
    Next Irow
Next rows

' Combines 2 columns of new data into a 2D array
ReDim temp(1 To MaxRows, 1 To 2)

' Puts the information into the 2D array
For i = 3 To MaxRows
    Rng(i, 7) = DataRangeNewFootTo(i, 7)
    Rng(i, 8) = DataRangeNewTo(i, 8)
Next i

' Puts 2D array in cells
Range(Cells(3, 7), Cells(MaxRows, 7)).CurrentRegion = Rng


End Sub

Это ошибка времени выполнения '9': нижний индекс выходит за пределы допустимого диапазона. Мне кажется, что это на самом деле в диапазоне; по крайней мере, если сравнить с моим старым кодом. Помогите?

2 ответа

Решение

В первом случае:

NewFootPrint = Range(Cells(3, 7), Cells(MaxRow, 7)).CurrentRegion.Value

не будет создавать массив с 7 столбцами, потому что это один столбец.:-) Итак, пытаюсь проиндексировать это как NewFootPrint(i, 7) не сработает Вы должны инициализировать ваш Variant как это:

NewFootPrint = Range(Cells(3, 7), Cells(MaxRow, 7)).Value

или даже лучше:

With Worksheets("whatever worksheet use")
    ' ...
    NewFootPrint = .Range(.Cells(3, 7), .Cells(MaxRow, 7)).Value
    ' ...
End With

и получить к нему доступ так:

NewFootPrint(i, 1)

Позднее редактирование: получение данных в диапазоне от (r1, c1) до (r2, c2), где r2 ≥ r1 и c2 ≥ c1, создаст массив (1 To r2-r1+1, 1 To c2-c1+1). Так что вы должны проверить все свои петли и все ваши индексы.

  • Так как вы используете CurrentRegion, NewFootPrint и Translated, вероятно, содержат одинаковые значения. Это твое намерение? В противном случае удалите это CurrentRegion
  • А вы уверены, что массив имеет 7 столбцов?
  • Также For rows = 3 To MaxRows должно быть For rows = 0 To MaxRows - 4
    так как такой массив основан на нуле.
  • Вы могли бы также Dim NewFootPrint as Range а потом
    Set NewFootPrint = Range(Cells(3, 7), Cells(MaxRow, 7))
Другие вопросы по тегам