Poductividad con Excel

Aprende Excel resolviendo problemas reales de ingeniería industrial. Cada artículo te guía desde cero con datos reales, fórmulas explicadas y ejercicios prácticos diseñados para que apliques lo que aprendes en clase.

Cómo generar gráficos automáticos a partir de datos de producción con VBA

Cómo generar gráficos automáticos a partir de datos de producción con VBA

En el entorno industrial moderno, la capacidad de transformar grandes volúmenes de datos brutos en información visual accionable es crítica. Este instructivo técnico detalla cómo automatizar la creación de gráficos de rendimiento directamente desde datos de producción utilizando Visual Basic for Applications (VBA) en Microsoft Excel.

Definición del problema

En una planta de manufactura de componentes electrónicos, el equipo de control de calidad genera diariamente registros detallados sobre la producción de diferentes modelos (P-101, P-205, etc.). Estos datos incluyen la cantidad producida, el tiempo de ciclo por unidad y el porcentaje de defectos por turno de trabajo. El reto operativo es que, al final de cada turno, el analista debe consolidar estos datos y generar un gráfico de tendencia de defectos por producto. Si este proceso se realiza manualmente, consume tiempo valioso, es propenso a errores de selección de rangos y retrasa la toma de decisiones gerenciales sobre la calidad del proceso.

El objetivo es crear una macro en VBA que, al ejecutarse, identifique automáticamente los datos de producción, procese la información necesaria (ej. calcular el promedio de defectos por producto) y genere un gráfico dinámico que se actualice instantáneamente con los nuevos registros.

Explicación técnica

Para lograr la automatización, combinaremos la manipulación de objetos de Excel (Worksheets, Ranges, Charts) con la lógica de programación de VBA. Los conceptos clave involucrados son:

  • Iteración y Búsqueda: Se utilizarán bucles (For Each o For Next) para recorrer las filas de los datos de producción y extraer los valores relevantes (Producto, Defectos, Cantidad).
  • Creación de Series de Datos: VBA permite interactuar directamente con el objeto ChartObject. Se debe especificar qué rangos de celdas servirán como etiquetas (eje X) y cuáles como valores (eje Y).
  • Actualización Dinámica: En lugar de crear el gráfico desde cero cada vez, la estrategia más eficiente es modificar las series de datos existentes o recrear el gráfico apuntando a los rangos de datos más recientes, asegurando que el gráfico refleje el estado actual de la hoja de cálculo sin intervención manual.

En este caso práctico, generaremos un gráfico de barras que muestre la Cantidad Total Producida por cada Tipo de Producto.

Guía paso a paso

Paso 1: Preparación de los Datos de Producción

Primero, debemos estructurar los datos en una hoja de cálculo de manera limpia y consistente. Crearemos una hoja llamada «DatosProduccion» y llenaremos con datos de ejemplo.

Acción: Abre Excel. Nombra la primera hoja como «DatosProduccion». Ingresa los encabezados en la fila 1 y rellena las filas subsiguientes con los datos de ejemplo.

Resultado: Una tabla estructurada lista para ser leída por el código VBA.

ABCD
1ProductoTurnoCantidad ProducidaDefectos
2P-101Mañana150015
3P-205Mañana220022
4P-101Tarde165018
5P-330Tarde9005
6P-205Noche250025

Paso 2: Abrir el Editor de VBA y Crear el Módulo

Necesitamos el entorno de programación. Esto se hace a través de la pestaña «Desarrollador».

Acción: Presiona Alt + F11 para abrir el Editor de Visual Basic. En el menú, ve a Insertar > Módulo. Pega el código VBA que se proporcionará a continuación.

Resultado: Un nuevo módulo vacío listo para albergar la macro.

Paso 3: Implementación del Código VBA (Lógica de Agregación y Gráfico)

El código debe realizar dos tareas principales: 1) Agrupar los datos por producto y sumar las cantidades; 2) Crear o modificar el gráfico basado en estos totales.

Acción: Pega el siguiente código en el módulo. Este código asume que los datos están en la hoja «DatosProduccion» y que el gráfico se creará en la hoja «Reporte».

Sub GenerarGraficoProduccion()

    Dim wsData As Worksheet
    Dim wsReport As Worksheet
    Dim lastRow As Long
    Dim dataRange As Range
    Dim productData As Object ' Usaremos un Dictionary para agrupar
    Dim product As Variant
    Dim chartObj As ChartObject
    
    ' 1. Configuración de hojas
    Set wsData = ThisWorkbook.Sheets("DatosProduccion")
    
    ' Crear hoja de reporte si no existe
    On Error Resume Next
    Set wsReport = ThisWorkbook.Sheets("Reporte")
    If wsReport Is Nothing Then
        Set wsReport = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        wsReport.Name = "Reporte"
    End If
    On Error GoTo 0
    
    ' Limpiar reportes anteriores
    wsReport.Cells.Clear
    
    ' 2. Agregación de datos (Producto vs. Cantidad Total)
    Set productData = CreateObject("Scripting.Dictionary")
    
    ' Determinar la última fila de datos (asumiendo que los datos empiezan en la fila 2)
    lastRow = wsData.Cells(Rows.Count, "A").End(xlUp).Row
    Set dataRange = wsData.Range("A2:D" & lastRow)
    
    ' Iterar sobre los datos
    For Each cell In wsData.Range("A2:A" & lastRow)
        Dim productName As String
        Dim quantity As Long
        
        productName = cell.Value
        ' Asumimos que la cantidad está en la columna C (índice 3)
        quantity = wsData.Cells(cell.Row, 3).Value 
        
        If Not productData.Exists(productName) Then
            productData.Add productName, quantity
        Else
            productData(productName) = productData(productName) + quantity
        End If
    Next cell
    
    ' 3. Escribir resultados agregados en la hoja de Reporte
    Dim outputRow As Long
    outputRow = 1
    wsReport.Cells(outputRow, 1).Value = "Producto"
    wsReport.Cells(outputRow, 2).Value = "Cantidad Total Producida"
    outputRow = outputRow + 1
    
    For Each product In productData.Keys
        wsReport.Cells(outputRow, 1).Value = product
        wsReport.Cells(outputRow, 2).Value = productData(product)
        outputRow = outputRow + 1
    Next product
    
    ' 4. Generación del Gráfico
    
    ' Eliminar gráfico anterior si existe
    For Each chartObj In wsReport.ChartObjects
        chartObj.Delete
    Next chartObj
    
    ' Crear el nuevo gráfico de columnas
    Set chartObj = wsReport.ChartObjects.Add(Left:=wsReport.Range("E2").Left, Top:=wsReport.Range("E2").Top, Width:=400, Height:=250)
    With chartObj.Chart
        .ChartType = xlColumnClustered ' Tipo de gráfico de barras/columnas
        .SetSourceData Source:=wsReport.Range("A1:B" & productData.Count + 1)
        .HasTitle = True
        .ChartTitle.Text = "Producción Total por Producto"
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Text = "Producto"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Text = "Unidades Producidas"
    End With

    MsgBox "Gráfico de producción generado exitosamente en la hoja 'Reporte'.", vbInformation

End Sub
        

Paso 4: Ejecución de la Macro

Una vez que el código está en el módulo, debemos ejecutarlo para ver el resultado.

Acción: Regresa a Excel. Ve a la pestaña «Desarrollador» > «Macros». Selecciona GenerarGraficoProduccion y haz clic en «Ejecutar».

Resultado: Se creará una nueva hoja llamada «Reporte». En esta hoja, se mostrarán las sumas totales (P-101: 3150, P-205: 4700, P-330: 900) y, junto a estos datos, aparecerá un gráfico de columnas que visualiza esta distribución.

Ejercicio propuesto

Para consolidar el aprendizaje, modifica el código VBA anterior para que, en lugar de graficar la Cantidad Producida, grafique el Porcentaje de Defectos por producto. Esto requerirá que modifiques la lógica de agregación para calcular el promedio de defectos (Total Defectos / Total Cantidad Producida) para cada producto antes de alimentar el gráfico.

Pista:

Errores habituales

La automatización con VBA es poderosa, pero requiere precisión. Aquí se detallan tres errores comunes:

  1. Error de Referencia de Hoja (Hardcoding): Si el código asume que la hoja de datos siempre se llamará «DatosProduccion», y el usuario la renombra, la macro fallará con un error de tiempo de ejecución (Runtime Error 9: Subscript out of range). Solución: Siempre utiliza la función ThisWorkbook.Sheets("Nombre") o, mejor aún, utiliza variables de objeto para referenciar la hoja de manera dinámica si el nombre puede cambiar.
  2. Error de Rango Dinámico: Intentar fijar el rango de datos (ej. A2:D100) cuando los datos pueden crecer. Si se añaden más filas, el gráfico no se actualizará. Solución: Utiliza siempre .Cells(Rows.Count, "A").End(xlUp).Row para encontrar la última fila utilizada, como se hizo en el Paso 3.
  3. Error de Tipo de Dato (Type Mismatch): Intentar sumar un texto (ej. «N/A») con un número. Si hay celdas vacías o texto en la columna de cantidades, VBA lanzará un error. Solución: Antes de realizar cualquier operación matemática, utiliza la función IsNumeric() para verificar que el valor extraído de la celda sea un número válido.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *