8. Proyecto: Automatizar un Reporte
En este proyecto integrador:
- Construirás una macro que lee una tabla de ventas y genera un resumen por categoría.
- Usarás variables, bucles, condicionales, rangos y una función auxiliar.
- Aplicarás buenas prácticas:
ScreenUpdating, limpieza previa y estructura en Sub separadas.
Estructura del libro de trabajo
Crea un archivo .xlsm con dos hojas:
Vista tipo Excel: la primera fila muestra las letras de columna; la primera columna muestra los números de fila. En las celdas con fórmula (=...), cada referencia lleva un color distinto. Clic en la referencia: resalta solo esa celda. Clic en el resto de la celda (por ejemplo el = o los operadores): resalta todas las celdas citadas. Repetir el mismo gesto sobre lo ya resaltado lo oculta.
Estructura del libroResumen
Nombra las hojas exactamente 'Ventas' y 'Resumen' para que el código funcione sin modificaciones.
| A | B | |
|---|---|---|
| 1 | Nombre de la hoja | Contenido |
| 2 | Ventas | Tabla de datos fuente (columnas: Fecha | Producto | Categoría | Monto) |
| 3 | Resumen | Aquí la macro escribirá los totales por categoría |
Datos de ejemplo para la hoja Ventas (copia desde la fila 1):
Vista tipo Excel: la primera fila muestra las letras de columna; la primera columna muestra los números de fila. En las celdas con fórmula (=...), cada referencia lleva un color distinto. Clic en la referencia: resalta solo esa celda. Clic en el resto de la celda (por ejemplo el = o los operadores): resalta todas las celdas citadas. Repetir el mismo gesto sobre lo ya resaltado lo oculta.
Tabla fuente: hoja VentasCatálogo / datos maestros
La categoría está en la columna C (índice 3). La macro agrupará los montos por ese valor.
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Fecha | Producto | Categoría | Monto |
| 2 | 2024-01-05 | Laptop Pro | Electrónica | 1200.00 |
| 3 | 2024-01-07 | Teclado | Electrónica | 85.00 |
| 4 | 2024-01-08 | Silla ergonómica | Muebles | 340.00 |
| 5 | 2024-01-10 | Monitor 27" | Electrónica | 450.00 |
| 6 | 2024-01-12 | Escritorio | Muebles | 220.00 |
| 7 | 2024-01-14 | Mouse inalámbrico | Electrónica | 45.00 |
| 8 | 2024-01-15 | Lámpara LED | Muebles | 60.00 |
| 9 | 2024-01-18 | Audífonos | Electrónica | 130.00 |
| 10 | 2024-01-20 | Estante | Muebles | 95.00 |
| 11 | 2024-01-22 | Webcam HD | Electrónica | 75.00 |
Función auxiliar: SumarPorCategoria
Primero creamos una función que suma todos los montos de una categoría dada:
Sub principal: GenerarReporte
Application.ScreenUpdating = False oculta los cambios visuales mientras la macro corre, acelerando la ejecución. Siempre restáuralo a True al terminar.
Practica en Excel
Abre Excel (o copia los datos con el botón de la tabla), sigue los pasos y comprueba el resultado en tu hoja.
- Crea el archivo .xlsm con las hojas "Ventas" y "Resumen".
- Copia la tabla de datos de ejemplo en la hoja Ventas (desde A1).
- Abre el editor VBA (Alt+F11), inserta un módulo y pega ambos procedimientos.
- Ejecuta GenerarReporte() desde Alt+F8 → GenerarReporte.
- Verifica que la hoja Resumen muestra los totales de Electrónica y Muebles con encabezado verde.
- Agrega 3 filas más a Ventas con una nueva categoría "Papelería", añádela al array y al bucle.
- Vuelve a ejecutar y confirma que el resumen incluye Papelería.
Ejercicios prácticos
15 ejercicios para ampliar y personalizar el proyecto de automatización de reportes.
Básico
1. Ejecutar y verificar
Crea el libro con las hojas "Ventas" y "Resumen", copia los datos de ejemplo y ejecuta GenerarReporte. Verifica que Electrónica suma 1985 y Muebles suma 715.
Ver solución
Electrónica: 1200 + 85 + 450 + 45 + 130 + 75 = 1985
Muebles: 340 + 220 + 60 + 95 = 715
Si los números coinciden, la macro funciona correctamente.
2. Agregar categoría Papelería
Añade 3 filas con categoría "Papelería" (montos: 30, 55, 80) a la hoja Ventas. Modifica el array categorias y el bucle para incluir esta nueva categoría en el reporte.
Ver solución
3. Cambiar color del encabezado
Modifica el bloque With hResumen.Range("A1:B1") para que el encabezado tenga fondo azul marino (RGB(0, 32, 96)) con texto blanco.
Ver solución
4. Mostrar total general
Después de escribir los totales por categoría, agrega una fila de Total General que sume todos los montos de la columna B en la hoja Resumen.
Ver solución
5. Ancho de columnas automático
Al final de GenerarReporte, ajusta automáticamente el ancho de las columnas A y B de la hoja Resumen con AutoFit.
Ver solución
Intermedio
6. Categorías dinámicas
En lugar de declarar el array con categorías fijas, reescribe la lógica para que la macro detecte automáticamente todas las categorías únicas de la columna C y las use en el reporte.
Ver solución
7. Filtrar por mes
Agrega un parámetro mesFiltro As Integer a SumarPorCategoria para que solo sume ventas del mes indicado (usa Month(Cells(i,1).Value)).
Ver solución
8. Contar ventas por categoría
Agrega una columna C "Cantidad" al reporte que muestre cuántas ventas (filas) tiene cada categoría, no el monto total.
Ver solución
En GenerarReporte, agrega hResumen.Range("C1").Value = "Cantidad" y hResumen.Cells(i+1, 3).Value = ContarPorCategoria(categorias(i)).
9. Ordenar el reporte por total descendente
Después de escribir todos los datos en la hoja Resumen, ordena el rango de datos (sin encabezado) por la columna B de mayor a menor usando el método Sort.
Ver solución
10. Botón para ejecutar la macro
En la hoja Resumen, inserta una forma (rectángulo redondeado) con el texto "Generar Reporte" y asígnale la macro GenerarReporte. Indica los pasos en el editor VBA y en Excel.
Ver solución
Pasos:
- En la hoja Resumen, ve a Insertar → Formas → Rectángulo redondeado.
- Dibuja la forma y escribe el texto "Generar Reporte".
- Haz clic derecho sobre la forma → Asignar macro.
- Selecciona
GenerarReportey acepta.
También puedes hacer esto desde VBA:
Avanzado
11. Calcular ticket promedio
Agrega una columna D "Promedio" al reporte que muestre el monto promedio por venta de cada categoría (total / cantidad). Formatea las celdas con 2 decimales.
Ver solución
12. Exportar resumen a hoja nueva
Al final de GenerarReporte, copia el rango de la hoja Resumen a una hoja nueva llamada "Reporte_YYYYMMDD" (con la fecha de hoy en el nombre) para conservar un histórico.
Ver solución
13. Insertar gráfico de barras
Después de generar el resumen, crea un gráfico de barras (xlBarClustered) en la hoja Resumen que muestre las categorías y sus totales.
Ver solución
14. Progreso con barra de estado
Cuando la macro procese muchas categorías, muestra el progreso en la barra de estado de Excel (Application.StatusBar) con el formato "Procesando: Electrónica (1/5)…". Al terminar, restaura Application.StatusBar = False.
Ver solución
15. Reporte con evento automático
Combina todo: usa un evento Worksheet_Change en la hoja Ventas para que, cada vez que se agregue un valor en la columna D (Monto), se ejecute automáticamente GenerarReporteDinamico y actualice el resumen en tiempo real.
Ver solución
Nota: asegúrate de que GenerarReporteDinamico también tenga ScreenUpdating y EnableEvents desactivados internamente, o usa la versión simplificada sin esos controles para evitar conflictos.