Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Creación de informes automatizados | Automatización de Tablas e Informes
Excel VBA para Automatización Empresarial

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

  1. Escribe GenerateMonthlyReport exactamente 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.
  2. Cambia targetMonth a "January" y vuelve a ejecutar: confirma que el informe se actualiza para reflejar el nuevo mes.
  3. Agrega una línea al final del Sub, antes del MsgBox, que exporte la hoja Reports a PDF usando ExportAsFixedFormat como se muestra arriba.
Pistas
expand arrow

1. Ejecutar GenerateMonthlyReport tal cual

  • Asegúrate primero de que existan la hoja Pivot y la tabla dinámica ptProfitByRegion del ejercicio anterior; este Sub actualiza 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 Sub y 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 ExportAsFixedFormat que aparece antes en el capítulo; estás exportando la hoja ws, 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.Path con un nombre que incluya targetMonth, 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 MsgBox final que confirma la finalización; de lo contrario, el mensaje de confirmación aparecería antes de que el archivo realmente exista.
Solución
expand arrow
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.

Note
Nota

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.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 4. Capítulo 5

Pregunte a AI

expand

Pregunte a AI

ChatGPT

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

  1. Escribe GenerateMonthlyReport exactamente 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.
  2. Cambia targetMonth a "January" y vuelve a ejecutar: confirma que el informe se actualiza para reflejar el nuevo mes.
  3. Agrega una línea al final del Sub, antes del MsgBox, que exporte la hoja Reports a PDF usando ExportAsFixedFormat como se muestra arriba.
Pistas
expand arrow

1. Ejecutar GenerateMonthlyReport tal cual

  • Asegúrate primero de que existan la hoja Pivot y la tabla dinámica ptProfitByRegion del ejercicio anterior; este Sub actualiza 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 Sub y 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 ExportAsFixedFormat que aparece antes en el capítulo; estás exportando la hoja ws, 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.Path con un nombre que incluya targetMonth, 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 MsgBox final que confirma la finalización; de lo contrario, el mensaje de confirmación aparecería antes de que el archivo realmente exista.
Solución
expand arrow
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.

Note
Nota

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.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 4. Capítulo 5
some-alt