2010-05-26 3 views
15

Sto guardando il codice Excel di qualcun altro. stanno facendo ReDim Preserve dataMatrix(7, i) in entrambi i loop. Cosa fa questo?Che cosa fa ReDim Preserve?

Inoltre, sembra che il secondo ciclo sovrascriva solo i dati nel primo ciclo, è corretto?

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 

risposta

11

ReDim conserva un dato in un array quando si modifica la sua dimensione. Inoltre, non dovrebbe sovrascrivere i dati perché lo i viene incrementato ogni iterazione del ciclo: il primo ciclo non si fermerà finché non incontra una cella vuota, modificando la lunghezza dell'array ogni iterazione di uno, in modo che quando la lunghezza sia 8, aggiunge 1 allo i e la nuova lunghezza diventa 9. Quando si verifica la seconda iterazione, scrive il nuovo elemento sul limite dell'array con l'indice 9, modifica nuovamente la sua lunghezza in modo che diventi più lungo l'elemento 1 e iterazioni fino a quando incontra una linea vuota.

+0

sembra che il secondo ciclo sovrascriva i dati nel primo ciclo, è corretto? –

+0

Il secondo ciclo non sovrascrive i dati nel primo ciclo, perché non viene ripristinato dopo il primo ciclo. Il secondo ciclo aggiunge elementi alla matrice di dati generata nel primo ciclo. –

16

Redim Preserve consente di variare le dimensioni di un array, mantenendo i contenuti della matrice.

Il Redim Preserve alla fine di ogni ciclo aggiunge un'altra riga all'array.

Penso che il secondo ciclo venga aggiunto all'array perché la variabile i non viene modificata tra i loop.

+0

Inoltre, sembra che il secondo ciclo sovrascriva i dati nel primo ciclo, è corretto? –

+0

No, il secondo ciclo si aggiunge all'array perché "i" non viene ripristinato tra i loop. – aphoria

+0

E il tuo punto è? Ho ottenuto un upvote un paio di giorni fa che ha attirato la mia attenzione. Ho aggiunto il commento 2 giorni fa, ma ho anche risposto nella mia risposta. – aphoria