2010-05-26 11 views
15

Estoy buscando el código vba excel de otra persona. están haciendo ReDim Preserve dataMatrix(7, i) en ambos bucles. ¿Qué hace esto?¿Qué hace ReDim Preserve?

Además, parece que el segundo bucle simplemente sobrescribe los datos en el primer bucle, ¿es correcto?

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 

Respuesta

11

ReDim conserva los datos en una matriz cuando modifica su tamaño. Tampoco debe sobrescribir los datos porque i se incrementa cada iteración del ciclo: el primer ciclo no se detendrá hasta que encuentre una celda vacía, cambiando la longitud de la matriz cada iteración por uno, de modo que cuando la longitud sea 8, se sumará 1 al i y la nueva longitud se convierte en 9. Cuando se produce la segunda iteración, escribe el nuevo elemento en el límite de la matriz con el índice 9, modifica su longitud de nuevo para que se convierta en elemento 1 más largo y se repite hasta que encuentra una línea vacía.

+0

parece que el segundo ciclo simplemente sobrescribe los datos en el primer ciclo, ¿es correcto? –

+0

El segundo ciclo no sobrescribe los datos en el primer ciclo porque no se restablece después del primer ciclo. El segundo ciclo agrega cosas a la matriz de datos generada en el primer ciclo. –

16

Redim Preserve le permite cambiar las dimensiones de una matriz, manteniendo el contenido de la matriz.

El Redim Preserve al final de cada ciclo agrega otra fila a la matriz.

Creo que el segundo bucle se agrega a la matriz porque la variable i no se cambia entre los bucles.

+0

también, parece que el segundo bucle simplemente sobrescribe los datos en el primer bucle, ¿es correcto? –

+0

No, el segundo bucle se agrega a la matriz porque 'i' no se restablece entre los bucles. – aphoria

+0

¿Y su punto es? Recibí un voto positivo hace un par de días que me llamó la atención. Agregué el comentario hace 2 días, pero también lo respondí en mi respuesta. – aphoria