Creación de informes automatizados
Desliza para mostrar el menú
El patrón de informe mensual Cada informe automatizado en este curso sigue la misma estructura: limpiar el estado anterior, filtrar o resumir los datos, actualizar o reconstruir la salida visual, aplicar formato de presentación y confirmar la finalización al usuario.
Ejemplo práctico: Informe mensual con un solo clic
Option Explicit
Sub GenerateMonthlyReport()
Dim ws As Worksheet
Dim tbl As ListObject
Dim targetMonth As String
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
targetMonth = "March"
' 1. Start from a clean slate
If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
' 2. Filter to the month being reported on
tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
' 3. Refresh the summary PivotTable so it reflects current data
On Error Resume Next
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
On Error GoTo 0
' 4. Apply export-ready formatting
With ws.PageSetup
.Orientation = xlLandscape
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = tbl.Range.Address
End With
' 5. Confirm completion
MsgBox targetMonth & " report is ready — filtered, " & _
"refreshed, and print-formatted."
End Sub
Los cinco comentarios numerados no son solo etiquetas: representan literalmente el patrón de informe mencionado anteriormente en esta sección, un paso por etapa. Algunos detalles a destacar:
targetMonth As String, definido con un valor fijo cerca del inicio, es la única línea que la tarea te pide cambiar a "January"; como todos los pasos posteriores leen de esta sola variable en vez de repetir la palabra "March" en otras partes del Sub, cambiar el mes objetivo del informe nunca requiere modificar más de una línea;- El paso 3 envuelve RefreshTable en On Error Resume Next / On Error GoTo 0 por la misma razón que la macro de creación de la tabla dinámica en la sección 4.3: si la hoja Pivot aún no existe, esta línea lanzaría un error y detendría toda la macro del informe, en vez de simplemente omitir un paso que aún no está listo;
- El paso 4, PrintArea = tbl.Range.Address, vincula el área de impresión directamente a la dirección de la tabla, por lo que si luego se agregan filas mediante ListRows.Add, el área de impresión sigue coincidiendo exactamente con los datos, sin necesidad de mantenimiento adicional;
- El paso 5, MsgBox concatena targetMonth en el texto de confirmación, por lo que el mensaje siempre nombra el mes que realmente se procesó.
Actualización del panel de control
Si un libro contiene varias tablas dinámicas y gráficos que alimentan una hoja de panel, RefreshAll recalcula todas las conexiones de datos y PivotCache en una sola llamada: la versión de una línea de lo que GenerateMonthlyReport hace manualmente para una sola tabla dinámica: ThisWorkbook.RefreshAll
Esta línea realiza la misma función que el paso 3 en GenerateMonthlyReport, pero a escala de todo el libro en vez de una sola tabla dinámica nombrada; es útil cuando un panel incluye varias tablas dinámicas, conexiones de datos externas o consultas vinculadas que deben mantenerse sincronizadas.
Formato listo para exportar
Más allá de la configuración de página, un informe terminado a menudo necesita salir completamente de Excel. ExportAsFixedFormat genera un PDF directamente desde el código:
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
Quality:=xlQualityStandard
ThisWorkbook.Path devuelve la carpeta donde está guardado el libro actual, sin una barra invertida al final, por lo que el nombre del archivo se construye concatenando explícitamente "\March_Report.pdf". Si ThisWorkbook aún no se ha guardado, .Path devuelve una cadena vacía y esta línea intentaría guardar solo como "\March_Report.pdf" en la raíz de la unidad actual, por lo que conviene asegurarse de que el libro se haya guardado al menos una vez antes de depender de este patrón.
Tarea
- Escribe
GenerateMonthlyReportexactamente como se muestra (primero necesitas que exista la hoja Pivot de los capítulos anteriores) y ejecútalo. Confirma que la tabla se filtra a marzo y que la tabla dinámica se actualiza. - Cambia targetMonth a "January" y vuelve a ejecutar: confirma que el informe se actualiza para reflejar el nuevo mes.
- Agrega una línea al final del Sub, antes del MsgBox, que exporte la hoja Reports a PDF usando ExportAsFixedFormat como se muestra arriba.
1. Ejecutar GenerateMonthlyReport tal cual
- Asegúrate primero de que existan la hoja Pivot y la tabla dinámica
ptProfitByRegiondel ejercicio anterior; esteSubactualiza una tabla dinámica existente, no crea una desde cero. - Escribe el procedimiento exactamente como se muestra, ejecútalo y verifica dos cosas: la tabla Reports ahora debe estar filtrada para mostrar solo las filas de marzo, y los números de la hoja Pivot deben reflejarlo (aunque la tabla dinámica resume todos los meses independientemente del filtro de Reports, ya que PivotCaches lee todo el rango, no solo la vista filtrada).
2. Cambiar targetMonth a January
- Solo necesitas cambiar una línea: la asignación
targetMonth = "March"cerca del inicio. - Vuelve a ejecutar todo el
Suby confirma que la tabla Reports ahora se filtra a enero.
3. Agregar una línea de exportación a PDF
- Es exactamente la misma línea
ExportAsFixedFormatque aparece antes en el capítulo; estás exportando la hojaws, no todo el libro. - Construye el nombre del archivo de la misma manera que el ejemplo de generación de facturas del capítulo: combina
ThisWorkbook.Pathcon un nombre que incluyatargetMonth, para que cada ejecución genere un archivo con nombre distinto en vez de sobrescribir el mismo cada vez. - La ubicación es importante: debe ir después de los pasos de filtrado/actualización/formato, pero antes del
MsgBoxfinal que confirma la finalización; de lo contrario, el mensaje de confirmación aparecería antes de que el archivo realmente exista.
Option Explicit
Sub GenerateMonthlyReport()
Dim ws As Worksheet
Dim tbl As ListObject
Dim chtObj As ChartObject
Dim printRange As Range
Dim targetMonth As String
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
targetMonth = "January"
' 1. Start from a clean slate
If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
' 2. Filter to the month being reported on
tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
' 3. Refresh the summary PivotTable so it reflects current data
On Error Resume Next
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
On Error GoTo 0
' 4. Build a print area that covers the table AND the chart
On Error Resume Next
Set chtObj = ws.ChartObjects(1)
If Not chtObj Is Nothing Then
Set printRange = Union(tbl.Range, ws.Range(chtObj.TopLeftCell.Address, _
chtObj.BottomRightCell.Address))
Else
Set printRange = tbl.Range
End If
On Error GoTo 0
On Error Resume Next
With ws.PageSetup
.Orientation = xlLandscape
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = printRange.Address
End With
On Error GoTo 0
' 5. Export the filtered report to PDF
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & targetMonth & "_Report.pdf", _
Quality:=xlQualityStandard
' 6. Confirm completion
MsgBox targetMonth & " report is ready — filtered, refreshed, and exported."
End Sub
Ejecuta una vez con targetMonth = "March" y otra con "January"; deberías obtener dos archivos PDF separados (March_Report.pdf y January_Report.pdf) junto a tu libro, cada uno reflejando los datos filtrados correctamente al momento de la ejecución.
Si aparece un cuadro de diálogo solicitando que elijas una impresora (en lugar de que el código falle directamente), selecciona cualquier opción disponible — incluyendo "Microsoft Print to PDF", "Microsoft XPS Document Writer" o cualquier otra impresora listada, incluso un controlador de fax. La impresora específica elegida no importa en este caso; VBA solo necesita alguna impresora seleccionada para satisfacer el proceso de PageSetup/exportación, ya que Excel dirige estas operaciones a través del subsistema de impresión en segundo plano, sin importar cuál esté activa.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Creación de informes automatizados
El patrón de informe mensual Cada informe automatizado en este curso sigue la misma estructura: limpiar el estado anterior, filtrar o resumir los datos, actualizar o reconstruir la salida visual, aplicar formato de presentación y confirmar la finalización al usuario.
Ejemplo práctico: Informe mensual con un solo clic
Option Explicit
Sub GenerateMonthlyReport()
Dim ws As Worksheet
Dim tbl As ListObject
Dim targetMonth As String
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
targetMonth = "March"
' 1. Start from a clean slate
If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
' 2. Filter to the month being reported on
tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
' 3. Refresh the summary PivotTable so it reflects current data
On Error Resume Next
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
On Error GoTo 0
' 4. Apply export-ready formatting
With ws.PageSetup
.Orientation = xlLandscape
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = tbl.Range.Address
End With
' 5. Confirm completion
MsgBox targetMonth & " report is ready — filtered, " & _
"refreshed, and print-formatted."
End Sub
Los cinco comentarios numerados no son solo etiquetas: representan literalmente el patrón de informe mencionado anteriormente en esta sección, un paso por etapa. Algunos detalles a destacar:
targetMonth As String, definido con un valor fijo cerca del inicio, es la única línea que la tarea te pide cambiar a "January"; como todos los pasos posteriores leen de esta sola variable en vez de repetir la palabra "March" en otras partes del Sub, cambiar el mes objetivo del informe nunca requiere modificar más de una línea;- El paso 3 envuelve RefreshTable en On Error Resume Next / On Error GoTo 0 por la misma razón que la macro de creación de la tabla dinámica en la sección 4.3: si la hoja Pivot aún no existe, esta línea lanzaría un error y detendría toda la macro del informe, en vez de simplemente omitir un paso que aún no está listo;
- El paso 4, PrintArea = tbl.Range.Address, vincula el área de impresión directamente a la dirección de la tabla, por lo que si luego se agregan filas mediante ListRows.Add, el área de impresión sigue coincidiendo exactamente con los datos, sin necesidad de mantenimiento adicional;
- El paso 5, MsgBox concatena targetMonth en el texto de confirmación, por lo que el mensaje siempre nombra el mes que realmente se procesó.
Actualización del panel de control
Si un libro contiene varias tablas dinámicas y gráficos que alimentan una hoja de panel, RefreshAll recalcula todas las conexiones de datos y PivotCache en una sola llamada: la versión de una línea de lo que GenerateMonthlyReport hace manualmente para una sola tabla dinámica: ThisWorkbook.RefreshAll
Esta línea realiza la misma función que el paso 3 en GenerateMonthlyReport, pero a escala de todo el libro en vez de una sola tabla dinámica nombrada; es útil cuando un panel incluye varias tablas dinámicas, conexiones de datos externas o consultas vinculadas que deben mantenerse sincronizadas.
Formato listo para exportar
Más allá de la configuración de página, un informe terminado a menudo necesita salir completamente de Excel. ExportAsFixedFormat genera un PDF directamente desde el código:
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
Quality:=xlQualityStandard
ThisWorkbook.Path devuelve la carpeta donde está guardado el libro actual, sin una barra invertida al final, por lo que el nombre del archivo se construye concatenando explícitamente "\March_Report.pdf". Si ThisWorkbook aún no se ha guardado, .Path devuelve una cadena vacía y esta línea intentaría guardar solo como "\March_Report.pdf" en la raíz de la unidad actual, por lo que conviene asegurarse de que el libro se haya guardado al menos una vez antes de depender de este patrón.
Tarea
- Escribe
GenerateMonthlyReportexactamente como se muestra (primero necesitas que exista la hoja Pivot de los capítulos anteriores) y ejecútalo. Confirma que la tabla se filtra a marzo y que la tabla dinámica se actualiza. - Cambia targetMonth a "January" y vuelve a ejecutar: confirma que el informe se actualiza para reflejar el nuevo mes.
- Agrega una línea al final del Sub, antes del MsgBox, que exporte la hoja Reports a PDF usando ExportAsFixedFormat como se muestra arriba.
1. Ejecutar GenerateMonthlyReport tal cual
- Asegúrate primero de que existan la hoja Pivot y la tabla dinámica
ptProfitByRegiondel ejercicio anterior; esteSubactualiza una tabla dinámica existente, no crea una desde cero. - Escribe el procedimiento exactamente como se muestra, ejecútalo y verifica dos cosas: la tabla Reports ahora debe estar filtrada para mostrar solo las filas de marzo, y los números de la hoja Pivot deben reflejarlo (aunque la tabla dinámica resume todos los meses independientemente del filtro de Reports, ya que PivotCaches lee todo el rango, no solo la vista filtrada).
2. Cambiar targetMonth a January
- Solo necesitas cambiar una línea: la asignación
targetMonth = "March"cerca del inicio. - Vuelve a ejecutar todo el
Suby confirma que la tabla Reports ahora se filtra a enero.
3. Agregar una línea de exportación a PDF
- Es exactamente la misma línea
ExportAsFixedFormatque aparece antes en el capítulo; estás exportando la hojaws, no todo el libro. - Construye el nombre del archivo de la misma manera que el ejemplo de generación de facturas del capítulo: combina
ThisWorkbook.Pathcon un nombre que incluyatargetMonth, para que cada ejecución genere un archivo con nombre distinto en vez de sobrescribir el mismo cada vez. - La ubicación es importante: debe ir después de los pasos de filtrado/actualización/formato, pero antes del
MsgBoxfinal que confirma la finalización; de lo contrario, el mensaje de confirmación aparecería antes de que el archivo realmente exista.
Option Explicit
Sub GenerateMonthlyReport()
Dim ws As Worksheet
Dim tbl As ListObject
Dim chtObj As ChartObject
Dim printRange As Range
Dim targetMonth As String
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
targetMonth = "January"
' 1. Start from a clean slate
If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
' 2. Filter to the month being reported on
tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
' 3. Refresh the summary PivotTable so it reflects current data
On Error Resume Next
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
On Error GoTo 0
' 4. Build a print area that covers the table AND the chart
On Error Resume Next
Set chtObj = ws.ChartObjects(1)
If Not chtObj Is Nothing Then
Set printRange = Union(tbl.Range, ws.Range(chtObj.TopLeftCell.Address, _
chtObj.BottomRightCell.Address))
Else
Set printRange = tbl.Range
End If
On Error GoTo 0
On Error Resume Next
With ws.PageSetup
.Orientation = xlLandscape
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintArea = printRange.Address
End With
On Error GoTo 0
' 5. Export the filtered report to PDF
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & targetMonth & "_Report.pdf", _
Quality:=xlQualityStandard
' 6. Confirm completion
MsgBox targetMonth & " report is ready — filtered, refreshed, and exported."
End Sub
Ejecuta una vez con targetMonth = "March" y otra con "January"; deberías obtener dos archivos PDF separados (March_Report.pdf y January_Report.pdf) junto a tu libro, cada uno reflejando los datos filtrados correctamente al momento de la ejecución.
Si aparece un cuadro de diálogo solicitando que elijas una impresora (en lugar de que el código falle directamente), selecciona cualquier opción disponible — incluyendo "Microsoft Print to PDF", "Microsoft XPS Document Writer" o cualquier otra impresora listada, incluso un controlador de fax. La impresora específica elegida no importa en este caso; VBA solo necesita alguna impresora seleccionada para satisfacer el proceso de PageSetup/exportación, ya que Excel dirige estas operaciones a través del subsistema de impresión en segundo plano, sin importar cuál esté activa.
¡Gracias por tus comentarios!