2010-05-26 10 views
15

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

Aussi, il semble que la deuxième boucle écrase juste les données dans 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 

Répondre

11

ReDim conserve une donnée dans 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, elle 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 de nouveau sa longueur pour qu'il devienne 1 élément plus long et itère jusqu'à rencontrer une ligne vide.

+0

il semble que la deuxième boucle écrase juste les données dans la première boucle, est-ce correct? –

+0

La deuxième boucle n'écrase pas les données dans la première boucle, car je ne réinitialise pas après la première boucle. La deuxième boucle ajoute des éléments à la matrice de données générée dans la première boucle. –

16

Redim Preserve vous permet de modifier les dimensions d'un tableau tout en gardant 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 parce que la variable i n'est pas modifiée entre les boucles.

+0

aussi, il semble que la deuxième boucle vient réécrire les données dans la première boucle, est-ce correct? –

+0

Non, la deuxième boucle est ajoutée au tableau parce que «i» n'est pas réinitialisé entre les boucles. – aphoria

+0

Et votre point est? J'ai reçu un upvote il y a quelques jours qui a attiré mon attention. J'ai ajouté le commentaire il y a 2 jours, mais j'ai aussi répondu dans ma réponse. – aphoria