Что делает ReDim Preserve? - PullRequest
18 голосов

Я смотрю на чужой код 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

Ответы [ 2 ]

17 голосов
/ 26 мая 2010

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

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

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

12 голосов
/ 26 мая 2010

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

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