Los datos a imprimir están en una base de datos de cuatro columnas: Nombre y apellido, Dirección, Localidad y Provincia. La tarea de la macro será acomodar estos datos en una segunda hoja de manera cada registro ocupe cuatro celdas (una por dato) y que haya tres columnas de datos a lo largo de la hoja.
Para eso la macro empleará tres variables auxiliares. Una servirá para recorrer la base de datos original; la segunda para identificar la fila de la segunda hoja donde se está armando la etiqueta actual; y la tercera para identificar la columna donde se está armando la etiqueta.
Estas variables irán variando, valga la redundancia, durante la ejecución de la macro. Algo más o menos así:
f1 = 2
f2 = 1
Do While Not IsEmpty(Cells(f1, “A”) )
For c1 = 1 To 3
…
Next
f1 = f1 + 3
f2 = f2 + 5
Loop
La variable f1 es la que recorre la lista de datos de la base. Comienza con el valor 2 porque la primera fila está ocupada por los títulos. La condición que controla este recorrido es que la columna [A] no esté vacía. La variable avanza de tres en tres porque, como hay tres columnas de etiquetas en la base, en cada vuelta de este ciclo se arman tres etiquetas juntas. La variable f2 es la que recorre la hoja donde se arman las etiquetas. Comienza en 1, porque la primera etiqueta se arma arriba de todo en la hoja y avanza de cinco en cinco porque la etiqueta tiene cuatro renglones, más una fila de separación. Finalmente, la variable c1 es la que recorre las tres columnas de etiquetas. Por eso varía de uno a tres.
Los puntos suspensivos representan las instrucciones que arman la etiqueta en cada vuelta. Estas instrucciones consisten en asignar los datos de la base (de la primera hoja) a la hoja de etiquetas. Se debe tener en cuenta que cada columna de la hoja de etiquetas (controlada por la variable c1) corresponde a una fila de datos de la primera hoja. Las instrucciones a copiar dentro del ciclo “For… Next” son las siguientes:
Sheets(2).Cells(f2, c1) = Sheets(1).Cells(f1 + c1 – 1, “A”)
Sheets(2).Cells(f2 + 1, c1) = Sheets(1).Cells(f1 + c1 – 1, “B”)
Sheets(2).Cells(f2 + 2, c1) = Sheets(1).Cells(f1 + c1 – 1, “C”)
Sheets(2).Cells(f2 + 3, c1) = Sheets(1).Cells(f1 + c1- 1, “D”)
Algunas aclaraciones. Por lo pronto, en estas instrucciones se ve que los datos de la primera hoja (Sheets(1)) se asignan a la segunda (Sheets(2)). Dentro de la hoja de etiquetas, el índice de fila es f2, f2+1, f2+2 y f2+3, para que cada dato se imprima en una fila distinta. El índice de columna está dado por la variable c1, que varía de uno a tres, para cada una de las tres columnas de la hoja.
Dentro de la hoja de datos (a la derecha del signo =) el índice de fila es igual a la fila que ocupa el dato en la hoja de etiquetas, al cual se le suma el número de columna y se le resta una unidad para recorrer tres filas de datos en otras tantas etiquetas.
La macro quedaría así:
Sub etiquetas()
f1 = 2
2 = 1
Do While Not IsEmpty(Cells(f1, “A”))
For c1 = 1 To 3
Sheets(2).Cells(f2, c1) = Sheets(1).Cells(f1 + c1 – 1, “A”)
Sheets(2).Cells(f2 + 1, c1) = Sheets(1).Cells(f1 + c1 – 1, “B”)
Sheets(2).Cells(f2 + 2, c1) = Sheets(1).Cells(f1 + c1 – 1, “C”)
Sheets(2).Cells(f2 + 3, c1) = Sheets(1).Cells(f1 + c1 – 1, “D”)
Next
f1 = f1 + 3
f2 = f2 + 5
Loop
End Sub
Esta macro arma la hoja de etiquetas con los datos de la base convenientemente acomodados. En algún momento hay que proceder a la impresión de las etiquetas. Esto se hace cuando se completa una hoja de etiquetas de un tamaño determinado (por ejemplo, 50 filas) o cuando se acaban las etiquetas. Entonces, antes del Loop (antes de “pegar la vuelta”) preguntamos si se da alguna de estas dos condiciones:
If f2 > 50 Or IsEmpty(Sheets(1).Cells(f1, “A”)) Then
Sheets(2).PrintOut
Sheets(2).Cells.Clear
f2 = 1
End If
Luego de proceder con la impresión, la macro borra los datos de la hoja de etiquetas y la variable f2 toma el valor 1 para comenzar la siguiente tanda de etiquetas en la primera fila de la hoja.
Una última mejora consiste en dejar como variables la cantidad de filas y de columnas de la hoja de etiquetas. Con esta mejora, la macro quedará así:
Sub etiquetas()
f1 = 2
f2 = 1
columnas = 3
largo = 50
Do While Not IsEmpty(Cells(f1, “A”))
For c1 = 1 To columnas
Sheets(2).Cells(f2, c1) = Sheets(1).Cells(f1 + c1 – 1, “A”)
Sheets(2).Cells(f2 + 1, c1) = Sheets(1).Cells(f1 + c1 – 1, “B”)
Sheets(2).Cells(f2 + 2, c1) = Sheets(1).Cells(f1 + c1 – 1, “C”)
Sheets(2).Cells(f2 + 3, c1) = Sheets(1).Cells(f1 + c1 – 1, “D”)
Next
f1 = f1 + columnas
f2 = f2 + 5
If f2 > largo Or IsEmpty(Sheets(1).Cells(f1, “A”)) Then
Sheets(2).PrintOut
Sheets(2).Cells.Clear
f2 = 1
End If
Loop
End Sub
Como en el primer ejemplo, conviene reemplazar la instrucción de impresión por la de vista preliminar (PrintPreview) para no derrochar papel durante las pruebas.