2010-05-26 4 views
15

Ich schaue auf jemand anderen vba Excel-Code. Sie machen ReDim Preserve dataMatrix(7, i) in beiden Schleifen. Was macht das?Was macht ReDim Preserve?

Auch scheint es, dass die zweite Schleife nur die Daten in der ersten Schleife überschreibt, ist das korrekt?

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 

Antwort

11

ReDim speichert Daten in einem Array, wenn Sie ihre Größe ändern. Außerdem sollte es die Daten nicht überschreiben, da i bei jeder Iteration der Schleife inkrementiert wird: Die erste Schleife stoppt nicht, bis sie auf eine leere Zelle trifft, wobei sie die Array-Länge bei jeder Iteration um eins ändert, sodass die Länge 81 ist zu der i und die neue Länge wird 9. Wenn die zweite Iteration auftritt, schreibt sie das neue Element an die Grenze des Arrays mit dem Index 9, modifiziert ihre Länge erneut, so dass sie länger wird und iteriert, bis sie auf eine leere Zeile trifft.

+0

Es scheint, als ob die zweite Schleife nur die Daten in der ersten Schleife überschreibt, ist das korrekt? –

+0

Die zweite Schleife überschreibt nicht die Daten in der ersten Schleife, weil ich nach der ersten Schleife nicht zurückgesetzt werde. Die zweite Schleife hängt Daten an die in der ersten Schleife erzeugte Datenmatrix an. –

16

Redim Preserve können Sie die Dimensionen eines Arrays ändern, während der Inhalt des Arrays zu halten.

Die Redim Preserve am Ende jeder Schleife fügt dem Array eine weitere Zeile hinzu.

Ich denke, die zweite Schleife hängt an das Array, weil die i Variable nicht zwischen den Schleifen geändert wird.

+0

auch scheint es wie die zweite Schleife überschreibt nur die Daten in der ersten, Schleife, ist das korrekt? –

+0

Nein, die zweite Schleife hängt an das Array an, weil 'i' nicht zwischen den Schleifen zurückgesetzt wird. – aphoria

+0

Und dein Punkt ist? Ich habe vor ein paar Tagen eine Verbesserung bekommen, die meine Aufmerksamkeit erregt hat. Ich habe den Kommentar vor 2 Tagen hinzugefügt, aber ich habe ihn auch in meiner Antwort beantwortet. – aphoria