Что делает ReDim Preserve?

Я смотрю на кого-то еще код vba excel. они выполняют ReDim Preserve dataMatrix(7, i) в обеих циклах. Что это делает?

Кроме того, похоже, что второй цикл просто перезаписывает данные в первом цикле, верно ли это?

Dim dataMatrix() As String

    Worksheets.Item("ETS").Select
    Do While Trim(Cells(r, 1)) <> ""
       Debug.Print "The line: ", Trim(Cells(r, 1)), r
        r = r + 1
        dataMatrix(1, i) = Trim(Cells(r, 1))    ''file name
        dataMatrix(2, i) = Trim(Cells(r, 2))    ''sample type
        dataMatrix(3, i) = Trim(Cells(r, 3))    ''sample name
        dataMatrix(4, i) = "ETS"    ''
        dataMatrix(5, i) = Trim(Cells(r, 5))    ''Response
        dataMatrix(6, i) = Trim(Cells(r, 6))    ''ISTD Response
        dataMatrix(7, i) = Trim(Cells(r, 10))   ''Calculated Conc
        i = i + 1
        ReDim Preserve dataMatrix(7, i)
    Loop

    r = 5
    Worksheets.Item("ETG").Select
    Do While Trim(Cells(r, 1)) <> ""
       Debug.Print "The line: ", Trim(Cells(r, 1)), r
        r = r + 1
        dataMatrix(1, i) = Trim(Cells(r, 1))    ''file name
        dataMatrix(2, i) = Trim(Cells(r, 2))    ''sample type
        dataMatrix(3, i) = Trim(Cells(r, 3))    ''sample name
        dataMatrix(4, i) = "ETG"
        dataMatrix(5, i) = Trim(Cells(r, 5))    ''Response
        dataMatrix(6, i) = Trim(Cells(r, 6))    ''ISTD Response
        dataMatrix(7, i) = Trim(Cells(r, 10))   ''Calculated Conc
        i = i + 1
        ReDim Preserve dataMatrix(7, i)
    Loop

Ответы

Ответ 1

ReDim сохраняет данные в массиве при изменении его размера. Также он не должен перезаписывать данные becasuse i увеличивается на каждую итерацию цикла: первый цикл не останавливается, пока не встретится с пустой ячейкой, изменив длину массива на каждую итерацию на единицу, так что, когда длина равна 8 он добавляет 1 к i, а новая длина становится 9. Когда происходит вторая итерация, он записывает новый элемент в границу массива с индексом 9, снова изменяет его длину, чтобы он становился 1 элементом дольше и повторяется до тех пор, пока не встретит пустую строку.

Ответ 2

Redim Preserve позволяет изменять размеры массива, сохраняя содержимое массива.

Redim Preserve в конце каждого цикла добавляет еще одну строку в массив.

Я думаю, что второй цикл добавляется к массиву, потому что переменная i не изменяется между циклами.