Automatización del cálculo de OEE con macros en Excel: Guía completa
Palabra clave principal: Automatización del cálculo de OEE con macros en Excel
El Overall Equipment Effectiveness (OEE) es el indicador clave de rendimiento (KPI) más importante en la manufactura moderna. Mide la eficiencia real de un equipo de producción al integrar tres factores: Disponibilidad, Rendimiento y Calidad. Calcularlo manualmente, especialmente cuando se manejan múltiples turnos, productos y fallos, es tedioso y propenso a errores. Esta guía te mostrará cómo transformar este proceso manual en un sistema automatizado utilizando las capacidades de VBA (Macros) de Excel.
Definición del problema
Contexto Industrial: Somos una planta de ensamblaje de componentes electrónicos. Cada día, múltiples líneas de producción (Línea A, Línea B) procesan diferentes modelos de placas (Modelo X, Modelo Y). Los datos brutos se registran manualmente al final de cada turno: tiempo de operación planificado, tiempo de parada por mantenimiento, tiempo de parada por avería, cantidad producida y cantidad rechazada.
El Reto Operativo: El analista de producción debe tomar estos datos dispersos (registrados en hojas de registro de turno) y calcular el OEE diario para cada línea y modelo. El cálculo requiere:
- Calcular la Disponibilidad: (Tiempo Operativo / Tiempo Planificado).
- Calcular el Rendimiento: (Producción Real / Tiempo Operativo) / Tiempo Ideal.
- Calcular la Calidad: (Piezas Buenas / Producción Real).
- Calcular OEE: Disponibilidad × Rendimiento × Calidad.
Este proceso consume tiempo valioso y, si se cometen errores de transcripción o fórmula, la toma de decisiones gerenciales se basa en datos incorrectos.
Explicación técnica
Para automatizar esto, utilizaremos una combinación de herramientas de Excel, siendo la Macro (VBA) el motor principal. La lógica matemática subyacente es la siguiente:
- Disponibilidad (A):
- Rendimiento (R):
- Calidad (Q):
- OEE: $OEE = A times R times Q$
La macro VBA se encargará de:
- Leer los datos de las hojas de registro (Input).
- Aplicar las fórmulas de cálculo de manera iterativa para cada registro.
- Escribir los resultados finales (OEE, A, R, Q) en una hoja de resumen (Output).
Aunque las fórmulas de Excel son suficientes para el cálculo, la macro es necesaria para la automatización del flujo de trabajo: hacer clic en un botón y que todo el proceso se ejecute sin intervención manual.
Guía paso a paso
Paso 1: Configuración de la Hoja de Datos de Entrada (Input)
Debemos crear una hoja donde se ingresen los datos brutos de cada turno. Crearemos una hoja llamada «Registros».
Acción: En la hoja «Registros», configura los siguientes encabezados en la Fila 1:
- A1: Fecha
- B1: Línea de Producción
- C1: Modelo
- D1: Tiempo Planificado (Horas)
- E1: Tiempo de Parada (Minutos)
- F1: Producción Total (Unidades)
- G1: Piezas Rechazadas (Unidades)
Por qué: Esto estandariza la entrada de datos, permitiendo que la macro sepa exactamente dónde buscar cada variable.
Resultado: Una tabla lista para recibir datos brutos.
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Fecha | Línea | Modelo | Planificado (h) | Paradas (min) | Producción Total | Rechazados |
| 2 | 01/05/2024 | A | X | 8 | 30 | 480 | 24 |
| 3 | 01/05/2024 | B | Y | 8 | 60 | 350 | 10 |
Paso 2: Creación de la Hoja de Resultados (Output)
Creamos una hoja llamada «ResumenOEE». Aquí se mostrarán los KPIs calculados.
Acción: Configura los encabezados en la Fila 1 de «ResumenOEE»:
- A1: Fecha
- B1: Línea
- C1: Modelo
- D1: Disponibilidad (%)
- E1: Rendimiento (%)
- F1: Calidad (%)
- G1: OEE (%)
Por qué: Separa los datos crudos de los resultados analíticos, manteniendo la integridad del reporte.
Paso 3: Implementación de la Macro (VBA)
Este es el núcleo de la automatización. Necesitamos que la macro itere sobre cada fila de «Registros» y calcule los valores.
Acción:
- Presiona
ALT + F11para abrir el Editor de VBA. - En el menú, ve a Insertar > Módulo.
- Pega el siguiente código (simplificado para el ejemplo):
Sub CalcularOEE()
Dim wsInput As Worksheet
Dim wsOutput As Worksheet
Dim ultimaFila As Long
Dim i As Long
Set wsInput = ThisWorkbook.Sheets("Registros")
Set wsOutput = ThisWorkbook.Sheets("ResumenOEE")
' Encontrar la última fila con datos en la hoja de entrada
ultimaFila = wsInput.Cells(Rows.Count, "A").End(xlUp).Row
' Limpiar resultados anteriores
wsOutput.UsedRange.ClearContents
' Iterar desde la fila 2 (asumiendo que la fila 1 son encabezados)
For i = 2 To ultimaFila
' --- 1. Cálculos ---
Dim tiempoPlanificadoHoras As Double
Dim tiempoParadaMinutos As Double
Dim produccionTotal As Long
Dim piezasRechazadas As Long
tiempoPlanificadoHoras = wsInput.Cells(i, 4).Value ' Columna D
tiempoParadaMinutos = wsInput.Cells(i, 5).Value ' Columna E
produccionTotal = wsInput.Cells(i, 6).Value ' Columna F
piezasRechazadas = wsInput.Cells(i, 7).Value ' Columna G
' Tiempo Operativo (en horas) = (Planificado * 60 - Paradas) / 60
Dim tiempoOperativoHoras As Double
tiempoOperativoHoras = ((tiempoPlanificadoHoras * 60) - tiempoParadaMinutos) / 60
' Disponibilidad (A)
Dim disponibilidad As Double
disponibilidad = tiempoOperativoHoras / tiempoPlanificadoHoras
' Calidad (Q)
Dim calidad As Double
Dim piezasBuenas As Long
piezasBuenas = produccionTotal - piezasRechazadas
calidad = piezasBuenas / produccionTotal
' Rendimiento (R) - Simplificado: (Producción Real / Tiempo Operativo) / Tasa Ideal
' Asumimos una Tasa Ideal de 10 unidades/hora para este ejemplo
Dim tasaIdeal As Double
tasaIdeal = 10
Dim rendimiento As Double
rendimiento = (produccionTotal / tiempoOperativoHoras) / tasaIdeal
' OEE
Dim oee As Double
oee = disponibilidad * rendimiento * calidad
' --- 2. Escritura en la Hoja de Resumen ---
wsOutput.Cells(i - 1, 1).Value = wsInput.Cells(i, 1).Value ' Fecha
wsOutput.Cells(i - 1, 2).Value = wsInput.Cells(i, 2).Value ' Línea
wsOutput.Cells(i - 1, 3).Value = wsInput.Cells(i, 3).Value ' Modelo
wsOutput.Cells(i - 1, 4).Value = disponibilidad
wsOutput.Cells(i - 1, 5).Value = rendimiento
wsOutput.Cells(i - 1, 6).Value = calidad
wsOutput.Cells(i - 1, 7).Value = oee
Next i
MsgBox "Cálculo de OEE completado exitosamente.", vbInformation
End Sub
Por qué: El bucle For i = 2 To ultimaFila asegura que cada registro de entrada sea procesado individualmente. Las variables temporales almacenan los resultados intermedios (A, R, Q) antes de calcular el OEE final.
Resultado: La hoja «ResumenOEE» se llenará automáticamente con los valores calculados, listos para ser graficados.
Paso 4: Creación del Botón de Ejecución
Para que el proceso sea verdaderamente automatizado, no queremos ejecutar el código desde el editor de VBA. Necesitamos un disparador visual.
Acción:
- Ve a la pestaña «Desarrollador» (si no la tienes, actívala en Opciones > Personalizar cinta de opciones).
- En el grupo «Controles», haz clic en «Insertar» y selecciona un «Botón de Formulario».
- Dibuja el botón en la hoja «Registros».
- Cuando aparezca la ventana «Asignar macro», selecciona
CalcularOEEy haz clic en Aceptar. - Cambia el texto del botón a «Calcular OEE».
Por qué: Esto encapsula la lógica compleja en una acción simple y repetible para el usuario final.
Resultado: Un botón funcional que, al ser presionado, ejecuta toda la lógica de cálculo y actualiza la hoja «ResumenOEE».
Ejercicio propuesto
Una vez que domines el cálculo básico, extiende el modelo para manejar la variación de la Tasa Ideal. En el código VBA, actualmente asumimos una tasaIdeal = 10. Modifica la macro para que la Tasa Ideal sea un parámetro que se ingrese en una celda específica de la hoja «Registros» (ej. Celda H1). Además, agrega una columna en la hoja «ResumenOEE» para mostrar la Pérdida de Rendimiento (Producción Ideal – Producción Real).
Esto te obligará a refactorizar la macro para leer un valor dinámico en lugar de un valor codificado.
Errores habituales
Al trabajar con macros y cálculos de eficiencia, es común caer en trampas lógicas o de implementación. Aquí te presentamos tres errores frecuentes:
- Error: División por Cero (Tiempo Operativo = 0). Si un turno tiene 0 tiempo planificado o si el tiempo de parada es igual al tiempo planificado, la macro intentará dividir por cero, deteniéndose con un error de tiempo de ejecución.
Solución: Implementa una verificación condicional (If tiempoOperativoHoras = 0 Then ...) antes de realizar cualquier división. Si es cero, asigna OEE = 0 y continúa al siguiente registro. - Error: Referencias Absolutas Incorrectas. Al copiar y pegar código, es fácil olvidar fijar rangos (usar
$A$1en lugar deA1) cuando se trabaja con bucles. Si no fijas las celdas de encabezado, la macro podría empezar a leer datos de la fila 1 en lugar de los encabezados.
Solución: Asegúrate de que todas las referencias a encabezados o constantes (como la Tasa Ideal) utilicen referencias absolutas ($). - Error: No Limpiar Resultados Previos. Si ejecutas la macro varias veces sin borrar el contenido de la hoja «ResumenOEE», los nuevos cálculos se añadirán debajo de los antiguos, creando un reporte confuso y duplicado.
Solución: Incluye siempre una línea al inicio de la macro, comowsOutput.UsedRange.ClearContents, para asegurar que el reporte comience siempre limpio.

Deja una respuesta