certmundo.
es‑mx

7 min de lectura

¿Cómo automatizar reportes y exportar datos con VBA?

Automatizar reportes con VBA significa escribir código que extrae, organiza y exporta datos sin intervención manual.

En empresas como FEMSA o Liverpool, los equipos de ventas generan reportes mensuales con cientos de filas. Hacerlo a mano toma horas y genera errores. Con VBA puedes completar ese proceso en segundos.


Estructura general de un reporte automatizado

Un reporte automatizado en VBA sigue siempre la misma secuencia:

  1. Limpiar el área de destino.
  2. Filtrar los datos fuente.
  3. Copiar o escribir los resultados en una hoja de reporte.
  4. Aplicar formato (títulos, colores, bordes).
  5. Exportar a PDF o CSV.

Conocer esta secuencia te permite construir cualquier reporte, sin importar el tamaño de la base de datos.


Caso práctico: reporte mensual de ventas

Imagina que trabajas en el área de análisis de Bimbo. Tienes una hoja llamada Datos con columnas: Fecha, Vendedor, Producto, Región y Monto. Necesitas generar cada mes un reporte con las ventas de la región "Centro".

Paso 1 — Limpiar la hoja de reporte

Antes de escribir datos nuevos, borra el contenido anterior.

Sub LimpiarReporte()
    Dim wsReporte As Worksheet
    Set wsReporte = ThisWorkbook.Sheets("Reporte")
    wsReporte.Cells.Clear
End Sub

Cells.Clear elimina valores, formatos y comentarios. Usa ClearContents si solo quieres borrar valores y conservar el formato.

Paso 2 — Copiar encabezados

Siempre copia los encabezados primero para que el reporte sea legible.

Sub CopiarEncabezados()
    Dim wsDatos As Worksheet
    Dim wsReporte As Worksheet
    Set wsDatos = ThisWorkbook.Sheets("Datos")
    Set wsReporte = ThisWorkbook.Sheets("Reporte")

    wsDatos.Rows(1).Copy Destination:=wsReporte.Rows(1)
End Sub

Paso 3 — Filtrar y copiar datos con AutoFilter

Usa AutoFilter para aislar las filas de la región "Centro" y luego copia solo las celdas visibles.

Sub FiltrarRegionCentro()
    Dim wsDatos As Worksheet
    Dim wsReporte As Worksheet
    Dim rngDatos As Range
    Dim rngVisible As Range

    Set wsDatos = ThisWorkbook.Sheets("Datos")
    Set wsReporte = ThisWorkbook.Sheets("Reporte")

    ' Quitar filtros previos
    If wsDatos.AutoFilterMode Then wsDatos.AutoFilterMode = False

    ' Definir rango con datos
    Set rngDatos = wsDatos.Range("A1").CurrentRegion

    ' Aplicar filtro en columna 4 (Región)
    rngDatos.AutoFilter Field:=4, Criteria1:="Centro"

    ' Copiar filas visibles (sin encabezado)
    Set rngVisible = rngDatos.Offset(1, 0).Resize(rngDatos.Rows.Count - 1)
    rngVisible.SpecialCells(xlCellTypeVisible).Copy _
        Destination:=wsReporte.Range("A2")

    ' Quitar filtro
    wsDatos.AutoFilterMode = False
End Sub

SpecialCells(xlCellTypeVisible) es la clave. Copia únicamente las filas que el filtro dejó visibles, ignorando las ocultas.

Paso 4 — Agregar un total de ventas

Después de copiar los datos, calcula el total de la columna Monto (columna E) y escríbelo al final.

Sub AgregarTotal()
    Dim wsReporte As Worksheet
    Dim ultimaFila As Long
    Dim total As Double

    Set wsReporte = ThisWorkbook.Sheets("Reporte")
    ultimaFila = wsReporte.Cells(wsReporte.Rows.Count, 1).End(xlUp).Row

    total = Application.WorksheetFunction.Sum( _
        wsReporte.Range("E2:E" & ultimaFila))

    wsReporte.Cells(ultimaFila + 1, 4).Value = "Total:"
    wsReporte.Cells(ultimaFila + 1, 5).Value = total
    wsReporte.Cells(ultimaFila + 1, 5).NumberFormat = "$#,##0"
End Sub

Esto genera una celda con el total formateado, por ejemplo $18,500, sin decimales flotantes.


Exportar el reporte a PDF

Exportar a PDF es la forma más profesional de entregar un reporte. VBA usa el método ExportAsFixedFormat para hacerlo directamente desde Excel.

Sub ExportarPDF()
    Dim wsReporte As Worksheet
    Dim rutaArchivo As String

    Set wsReporte = ThisWorkbook.Sheets("Reporte")

    rutaArchivo = ThisWorkbook.Path & "\ReporteVentas_Centro.pdf"

    wsReporte.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=rutaArchivo, _
        Quality:=xlQualityStandard, _
        OpenAfterPublish:=False

    MsgBox "PDF guardado en: " & rutaArchivo
End Sub

ThisWorkbook.Path devuelve la carpeta donde está guardado el archivo Excel. Así el PDF siempre se guarda junto al libro, sin rutas codificadas que rompan en otra computadora.

Cambia OpenAfterPublish:=True si quieres que el PDF se abra automáticamente al terminar.


Exportar el reporte a CSV

Algunos sistemas del SAT o del IMSS requieren archivos CSV para importar datos. Exportar a CSV con VBA requiere guardar una copia del libro en ese formato.

Sub ExportarCSV()
    Dim wsReporte As Worksheet
    Dim rutaCSV As String
    Dim wbNuevo As Workbook

    Set wsReporte = ThisWorkbook.Sheets("Reporte")
    rutaCSV = ThisWorkbook.Path & "\ReporteVentas_Centro.csv"

    ' Copiar la hoja a un libro nuevo
    wsReporte.Copy
    Set wbNuevo = ActiveWorkbook

    ' Guardar como CSV
    Application.DisplayAlerts = False
    wbNuevo.SaveAs Filename:=rutaCSV, FileFormat:=xlCSV
    wbNuevo.Close SaveChanges:=False
    Application.DisplayAlerts = True

    MsgBox "CSV guardado en: " & rutaCSV
End Sub

Application.DisplayAlerts = False suprime el mensaje de advertencia que Excel muestra al guardar en formato CSV. Siempre vuelve a activarlo con True al terminar.


Macro principal: ensamblar todo el flujo

Una buena práctica es tener una sola macro que llame a todas las demás en orden. Así ejecutas el reporte completo con un solo clic.

Sub GenerarReporteMensual()
    Call LimpiarReporte
    Call CopiarEncabezados
    Call FiltrarRegionCentro
    Call AgregarTotal
    Call ExportarPDF
    MsgBox "Reporte mensual generado correctamente."
End Sub

Asigna esta macro a un botón en la hoja principal. Cualquier usuario del equipo de Bimbo puede ejecutarla sin abrir el Editor de VBA.


Agregar la fecha al nombre del archivo

Cuando generas reportes cada mes, necesitas que el nombre del archivo incluya la fecha para no sobrescribir versiones anteriores.

Sub ExportarPDFConFecha()
    Dim wsReporte As Worksheet
    Dim rutaArchivo As String
    Dim fechaHoy As String

    Set wsReporte = ThisWorkbook.Sheets("Reporte")
    fechaHoy = Format(Now(), "YYYY-MM")

    rutaArchivo = ThisWorkbook.Path & "\ReporteVentas_" & fechaHoy & ".pdf"

    wsReporte.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=rutaArchivo, _
        Quality:=xlQualityStandard, _
        OpenAfterPublish:=False

    MsgBox "PDF guardado: ReporteVentas_" & fechaHoy & ".pdf"
End Sub

Format(Now(), "YYYY-MM") produce un texto como 2025-07. El archivo resultante se llamaría ReporteVentas_2025-07.pdf.


Errores comunes

Error 1 — No limpiar la hoja antes de copiar datos. Si no usas Clear al inicio, los datos nuevos se mezclan con los del mes anterior. Siempre limpia primero.

Error 2 — Copiar el rango completo en lugar de las celdas visibles. Si omites SpecialCells(xlCellTypeVisible), copias todas las filas, incluyendo las que el filtro ocultó. El reporte contendrá datos incorrectos.

Error 3 — Usar rutas absolutas en SaveAs o ExportAsFixedFormat. Escribir una ruta fija como "C:\Users\Juan\Documentos\reporte.pdf" rompe el código en cualquier otra computadora. Siempre usa ThisWorkbook.Path como base.

Error 4 — No restaurar DisplayAlerts después de suprimirlo. Si tu macro falla en medio del proceso con DisplayAlerts = False, Excel quedará sin mostrar alertas durante toda la sesión. Usa bloques On Error GoTo para garantizar que siempre se restaure.

Error 5 — Olvidar quitar el AutoFilter después de filtrar. Dejar el filtro activo en la hoja Datos puede confundir a otros usuarios o hacer que macros posteriores trabajen sobre un rango filtrado sin saberlo.


Tabla de referencia rápida

Acción Método o propiedad VBA
Limpiar hoja completa wsReporte.Cells.Clear
Aplicar filtro rng.AutoFilter Field:=N, Criteria1:=X
Copiar solo visibles rng.SpecialCells(xlCellTypeVisible).Copy
Exportar a PDF ws.ExportAsFixedFormat Type:=xlTypePDF
Exportar a CSV wb.SaveAs FileFormat:=xlCSV
Suprimir alertas Application.DisplayAlerts = False
Fecha formateada Format(Now(), "YYYY-MM")

Puntos clave

  • Usa SpecialCells(xlCellTypeVisible) después de aplicar AutoFilter para copiar únicamente las filas filtradas.
  • Exporta a PDF con ExportAsFixedFormat y a CSV con SaveAs FileFormat:=xlCSV desde una copia temporal del libro.
  • Usa ThisWorkbook.Path en todas las rutas de archivo para que el código funcione en cualquier equipo.
  • Incluye Format(Now(), "YYYY-MM") en el nombre del archivo para versionar reportes mensuales automáticamente.
  • Ensambla todas las subrutinas en una macro principal (GenerarReporteMensual) y asígnala a un botón para que cualquier usuario la ejecute con un clic.

Puntos clave

  • Usa `SpecialCells(xlCellTypeVisible)` después de aplicar `AutoFilter` para copiar únicamente las filas que cumplen el criterio de filtro, sin incluir filas ocultas.
  • Exporta el reporte a PDF con el método `ExportAsFixedFormat Type:=xlTypePDF` directamente sobre la hoja; para CSV, copia la hoja a un libro nuevo y usa `SaveAs FileFormat:=xlCSV`.
  • Usa siempre `ThisWorkbook.Path` como base de la ruta de destino para que el archivo se guarde en la misma carpeta del libro y el código funcione en cualquier computadora.
  • Incluye `Format(Now(), "YYYY-MM")` en el nombre del archivo exportado para versionar los reportes mensuales sin sobrescribir archivos anteriores.
  • Organiza el flujo completo en una macro principal que llame a subrutinas individuales (limpiar, filtrar, totalizar, exportar) y asígnala a un botón en la hoja para que cualquier usuario la ejecute sin abrir el Editor de VBA.

Comparte esta lección: