web-dev-qa-db-fra.com

Que fait ReDim Preserve?

Je regarde le code Excel vba de quelqu'un d'autre. ils font ReDim Preserve dataMatrix(7, i) dans les deux boucles. Qu'est-ce que cela fait?

De plus, il semble que la deuxième boucle écrase simplement les données de la première boucle, est-ce correct?

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

ReDim préserve les données d'un tableau lorsque vous modifiez sa taille. De plus, il ne doit pas écraser les données car i est incrémenté à chaque itération de la boucle: la première boucle ne s'arrêtera pas jusqu'à ce qu'elle rencontre une cellule vide, changeant la longueur du tableau à chaque itération, de sorte que lorsque la longueur est 8 il ajoute 1 au i et la nouvelle longueur devient 9. Lorsque la deuxième itération se produit, il écrit le nouvel élément à la limite du tableau avec l'index 9, modifie à nouveau sa longueur pour qu'elle devienne 1 élément plus long et itère jusqu'à ce qu'il rencontre une ligne vide.

13
Yasir Arsanukaev

Redim Preserve vous permet de modifier les dimensions d'un tableau tout en conservant le contenu du tableau.

Le Redim Preserve à la fin de chaque boucle ajoute une autre ligne au tableau.

Je pense que la deuxième boucle s'ajoute au tableau car la variable i n'est pas modifiée entre les boucles.

18
aphoria