Vamos a considerar una planilla con tres columnas: Nombre, Artículo y Precio, con los títulos en la primera fila y los datos propiamente dichos a partir de la segunda. Los nombres de la columna [A] se repiten porque puede haber varias filas para la misma persona.
Queremos organizar esta tabla de modo que cada nombre aparezca una sola vez, encabezando el grupo de filas que le corresponde.
Necesitamos una macro que recorra la lista original; que comience tomando el primer nombre que aparezca, lo copie en la primera fila de una nueva hoja y que, debajo de este nombre, copie todas las filas correspondientes a ese nombre.
Cuando se terminan las filas para ese nombre, toma el segundo nombre y repite el procedimiento anterior. Así, hasta terminar de recorrer la lista.
Vemos, por lo pronto, que la macro tendrá dos ciclos para completar el recorrido de la lista: uno para recorrer toda la lista y otro para recorrer el grupo de filas correspondiente a cada nombre. Algo así:
i = 2
Do
nombre = Cells(i, “A”)
Do While Cells(i, “A”) = nombre
i = i + 1
Loop
Loop Until IsEmpty(Cells(i, “A”))
La primera instrucción establece que el recorrido comienza en la segunda fila. El primer ciclo Do continúa hasta que (en inglés, until) se encuentre con una celda vacía en la columna [A]. El otro ciclo continúa mientras (en inglés, while) el nombre de la columna [A] sea el mismo que se identificó al comenzar el recorrido. En cada vuelta se incrementa el valor de la variable i usada para identificar la fila.
Hasta aquí tenemos resuelto el recorrido de la lista. Ahora tenemos que insertar las instrucciones para copiar los datos de una hoja a la otra. Vamos a usar la siguiente sintaxis para hacer este copiado:
Sheets(2).Cells(j, “A”) = Cells(i, “B”)
Esta instrucción copia en la celda de la columna [A], fila [j] de la hoja 2 el valor de la celda de la columna [B], fila [i] de la hoja actual. Instrucciones de este tipo aparecerán en los ciclos comentados anteriormente:
i = 2
j = 1
Do
nombre = Cells(i, “A”)
Sheets(2).Cells(j, “A”) = nombre
j = j + 1
Do While Cells(i, “A”) = nombre
Sheets(2).Cells(j, “A”) = Cells(i, “B”)
Sheets(2).Cells(j, “B”) = Cells(i, “C”)
i = i + 1
j = j + 1
Loop
Loop Until IsEmpty(Cells(i, “A”))
Aquí tenemos definida una nueva variable, j, que servirá para copiar cada dato en una nueva fila de la lista que estamos creando. Esta variable comienza con su valor igual a uno, para que el primer nombre se copie en la primera fila de la nueva lista.
Una vez copiado este nombre como encabezamiento, se incrementa el valor de j para que los siguientes datos estén una fila más abajo.
Dentro del recorrido del grupo correspondiente al primer nombre, copiamos el artículo en la columna [A] y el precio en la columna [B]. Incrementamos el valor de la variable i para pasar a la siguiente fila de la lista original y el valor de j para copiar los datos de esa fila en una nueva fila de la lista reorganizada.
La macro continúa con todos los datos de ese nombre (ciclo interior) y luego pasa al siguiente nombre hasta completar el recorrido de la lista original (ciclo exterior).