Excel: Una macro para la combinación de correspondencia

Un problema interesante es el de generar copias de una planilla cambiando algunos datos, tomados de una lista en otra planilla. Algo parecido a la combinación de correspondencia de Word. Aunque no existe un comando equivalente en Excel, lo podemos simular mediante una macro.
JUE, 2 / JUL / 2015

Supongamos que tenemos dos planillas. La primera es la lista de gastos de un edificio. La segunda contiene la lista de vecinos de ese mismo edificio. Queremos imprimir copias de la primera planilla, para cada uno de los integrantes de la segunda. Los datos de cada vecino, deben aparecer en las primeras filas de cada copia.

Digamos, por simplicidad, que la lista de gastos está en una hoja llamada Gastos y tiene solamente dos columnas: rubro e importe. Esta lista ocupa el rango [A5:B15], con los títulos en la quinta fila y los datos propiamente dichos a partir de la siguiente. En las primeras filas de la hoja aparecerán los datos de cada vecino, acompañados de títulos adecuados:

En [A1] escribimos Titular.

En [A2] escribimos Departamento.

En [A3] escribimos Importe.

La lista de vecinos está en una hoja llamada Titulares y tiene tres columnas: piso y departamento, nombre y apellido, y porcentaje de los gastos que le toca pagar a cada uno. Esta lista ocupa el rango [A1:C15], con el importe total calculado en [C16], debajo del último importe.

La macro que generará e imprimirá las copias deberá recorrer la lista de vecinos y, para cada uno de ellos, hacer dos cosas:

Copiar los datos del titular en [B1:B3].

Imprimir la copia.

En principio, esta macro debería ser más o menos así:

Sub Expensas()

Sheets(“Gastos”).Select

ActiveSheet.PageSetup.PrintArea = “A1:D14”

For i = 2 To 15

depto = Sheets(“Titulares”).Cells(i, “A”)

nombre = Sheets(“Titulares”).Cells(i, “B”)

porcentaje = Sheets(“Titulares”).Cells(i, “C”)

[B1] = nombre

[B2] = depto

[B3] = porcentaje * [B14]

ActiveSheet.PrintOut

Next

End Sub

Expliquemos paso a paso esta macro. Antes de comenzar el recorrido de la lista de titulares, la macro hace dos cosas que tiene que hacer una sola vez al comenzar a trabajar: pararse en la hoja a imprimir (la lista de gastos) y establecer el rango de impresión:

Sheets(“Gastos”).Select

ActiveSheet.PageSetup.PrintArea = “A1:D14”

Luego comienza el recorrido de la lista de titulares con un ciclo “For… Next”. Como la lista de titulares ocupa siempre el mismo rango, sabemos que este recorrido debe hacerse desde las filas 2 a la 14, que es donde están los datos propiamente dichos de los titulares.

Para cada vuelta del ciclo, la macro toma nota de los datos del titular: número del departamento, nombre y apellido del titular y porcentaje de gastos. Como esto lo hace desde la otra hoja, la de gastos, la referencia a las celdas de la hoja Titulares tiene tres coordenadas. Por ejemplo, para el número de departamento:

depto = Sheets(“Titulares”).Cells(i, “A”)

El argumento de Sheets es el nombre de la hoja, escrito entre comillas. También podría ser el número de orden de la hoja en el libro. En este caso, Sheets(2). Separada por un punto, aparece la instrucción Cells cuyos dos argumentos son la fila y la columna de la celda. La columna puede indicarse con su letra, escrita entre comillas, o por un número: 1 para la A, 2 para la B y así sucesivamente. En la macro hay tres instrucciones de este tipo, una para cada titular.

Luego copia estos datos a la hoja de gastos. Como esta es la hoja actual, sus celdas pueden designarse de manera más simple: se escriben las coordenadas entre corchetes. Además, el importe a pagar se obtiene multiplicando el importe total tomado de la celda [B14] por el porcentaje tomado antes de los datos de los titulares:

[B1] = nombre

[B2] = depto

[B3] = porcentaje * [B14]

Finalmente, la macro procede a la impresión de la hoja con la instrucción:

ActiveSheet.PrintOut

Mientras estamos probando la macro, y para no desperdiciar papel, podemos reemplazar esta instrucción por la que hace la vista preliminar;

ActiveSheet.PrintPreview

Una vez impresa (o previsualizada) esta hoja, la instrucción Next pasa a la siguiente vuelta del ciclo, y la siguiente fila de la lista de vecinos. Así hasta imprimir todas las copias.

¡Comparte esta noticia!

Últimos lanzamientos Ver más