🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Calculation en Excel — pon el cálculo en Manual para ganar velocidad (y la trampa silenciosa de dejarlo así)

|

VBA Calculation en Excel — pon el cálculo en Manual para ganar velocidad (y la trampa silenciosa de dejarlo así)

TL;DRApplication.Calculation = xlCalculationManual le dice a Excel que deje de recalcular tras cada escritura y aplace todo el recálculo a una sola pasada. En un libro cargado de fórmulas este es el interruptor que de verdad hace rápida una macro — mucho más que la actualización de pantalla. Pero es la palanca más peligrosa de VBA: déjalo en Manual por error y las fórmulas simplemente dejan de actualizarse, sin ninguna señal visible, así que el libro muestra números obsoletos y equivocados. Guarda el estado, restáuralo en un manejador de errores, y nunca lo dejes al azar:

Sub FastCalc()
    Dim savedCalc As XlCalculation
    savedCalc = Application.Calculation          ' recuerda lo que ERA
    Application.Calculation = xlCalculationManual ' deja de recalcular tras cada escritura
    On Error GoTo CleanExit
    ' ... miles de escrituras, sin recalculo entre medias ...
    Application.Calculate                         ' fuerza un recalculo cuando necesitas resultados
CleanExit:
    Application.Calculation = savedCalc           ' restaura el estado GUARDADO, no Automatic a ciegas
End Sub

Cada vez que tu macro escribe en una celda, Excel recalcula toda la cadena de dependencias que esa celda alimenta. En un libro con fórmulas pesadas, ese recálculo — no la pantalla — es el verdadero cuello de botella. El modo manual deja que primero caigan miles de escrituras y recalcula una sola vez. Esta guía se construye sobre una sola idea — Calculation es el interruptor que compra la velocidad, y el que nunca te puedes permitir dejar apagado, porque su fallo es invisible. Interioriza esa asimetría y lo tratarás con el respeto que necesita.

Lo que aprenderás

  • El modelo mental — cada escritura dispara un recálculo completo; Manual lo aplaza a una sola pasada
  • Por qué es la verdadera ganancia de velocidad en libros cargados de fórmulas (y ScreenUpdating no lo es)
  • La regla más importante — un estado Manual que se quedó activo muestra números obsoletos sin ningún aviso
  • Forzar un recálculo a mitad de macro con Application.Calculate cuando un paso posterior necesita un resultado
  • Restaurar el estado guardado, no fijar xlCalculationAutomatic a lo bruto
  • El error 1004 con el que te topas al fijar Calculation sin ningún libro abierto

El modelo mental: cada escritura dispara un recálculo

El valor por defecto de Excel es xlCalculationAutomatic: en cuanto cambia cualquier celda, Excel recalcula cada fórmula que depende de ella, de forma transitiva. De forma interactiva eso es justo lo que quieres — tecleas un número y los totales se actualizan. Pero dentro de una macro que escribe 10.000 celdas, Excel ejecuta el recálculo completo de dependencias hasta 10.000 veces, y en un modelo real cada pasada puede tocar miles de fórmulas.

Application.Calculation = xlCalculationManual rompe ese vínculo. Las escrituras caen en las celdas, pero Excel no recalcula hasta que se lo dices (o el usuario pulsa F9). Haces toda la escritura barata y luego disparas un solo recálculo al final.

Application.Calculation = xlCalculationManual
Range("A1:A10000").Value = someArray   ' 10.000 valores dentro, cero recalculos
Application.Calculate                    ' un recalculo, una sola vez

Los tres estados son xlCalculationAutomatic, xlCalculationManual y xlCalculationSemiautomatic (automático salvo para las tablas de datos). Para las macros te importan los dos primeros.

Por qué esta es la verdadera ganancia de velocidad

Hay una jerarquía de interruptores de velocidad para macros, y la gente echa mano de ellos en el orden equivocado. ScreenUpdating es el famoso, pero solo elimina los redibujados de pantalla. En un libro lleno de VLOOKUP, SUMIFS, o funciones volátiles como OFFSET e INDIRECT, el redibujado es trivial al lado del recálculo. Apaga solo ScreenUpdating y una macro limitada por el cálculo apenas acelera; apaga Calculation y puede pasar de minutos a segundos. Si solo vas a poner un interruptor en un libro cargado de fórmulas, pon este. Los dos juntos — más escribir arrays enteros en vez de recorrer celda a celda — son la receta estándar de macro rápida.

La regla más importante: un estado Manual que se quedó activo es silencioso

Aquí está el porqué de que Calculation sea el interruptor peligroso. Cuando ScreenUpdating se queda apagado, lo ves — la pantalla está congelada. Cuando Calculation se queda en Manual, no ves nada. El libro parece completamente normal. Pero cada fórmula está congelada en su último valor calculado. Alguien edita una entrada, el total no cambia, y o bien se da cuenta mucho después o — peor — no se da cuenta, y envía un informe construido sobre números obsoletos.

Este es el estado residual más dañino de todo VBA, precisamente porque no hay ningún síntoma hasta que alguien se fía de una cifra equivocada. Así que la disciplina es más estricta que con los interruptores cosméticos: restáuralo siempre, y restáuralo en un manejador de errores para que un fallo a mitad de macro no pueda dejar el libro colgado en Manual.

' FRAGIL - si el bucle falla, el calculo se queda colgado en Manual y cada
' formula del libro deja de actualizarse en silencio:
Application.Calculation = xlCalculationManual
DoRiskyWork
Application.Calculation = xlCalculationAutomatic   ' nunca se alcanza si hay error

El arreglo es el patrón CleanExit del TL;DR: On Error GoTo CleanExit, y restaurar en la etiqueta. Ve VBA On Error para el tratamiento completo.

Restaura el estado guardado, no un Automatic fijado a lo bruto

Casi todos los tutoriales terminan la macro con Application.Calculation = xlCalculationAutomatic. Eso es un bug disfrazado. El usuario puede haber puesto el libro en modo Manual a propósito — los modelos pesados se dejan a menudo en Manual para que no recalculen con cada pulsación de tecla. Tu macro corre, y ahora has cambiado su libro a Automatic en silencio, disparando justo los recálculos lentos que estaba evitando.

El patrón correcto es guardar lo que te encontraste y restaurar eso:

Dim savedCalc As XlCalculation
savedCalc = Application.Calculation       ' puede ser Manual o Automatic
Application.Calculation = xlCalculationManual
' ... trabajo ...
Application.Calculation = savedCalc       ' deja el libro como lo encontraste

Una macro debería dejar el entorno en el estado que tomó prestado, no en el que dio por hecho. Es el mismo hábito de «guardar y restaurar» que mantiene lejos el parpadeo de llamadas anidadas de ScreenUpdating.

Forzar un recálculo cuando un paso posterior necesita un resultado

El modo manual tiene una segunda trampa que no tiene nada que ver con restaurarlo. Si tu macro escribe fórmulas y luego lee los resultados que esas fórmulas producen, las lecturas estarán obsoletas — las fórmulas todavía no se han recalculado.

Application.Calculation = xlCalculationManual
Range("B1").Formula = "=SUM(A1:A100)"
Debug.Print Range("B1").Value    ' obsoleto - B1 aun no se ha recalculado
Application.Calculate            ' recalcula ahora
Debug.Print Range("B1").Value    ' correcto

Siempre que un paso posterior dependa de un valor que una escritura anterior debería haber calculado, llama primero a Application.Calculate (toda la aplicación), ActiveSheet.Calculate (una hoja) o Range.Calculate (un rango). En modo manual, los resultados están tan frescos como tu última llamada a Calculate.

El error 1004 sin ningún libro abierto

Una última trampa: Application.Calculation solo se puede fijar cuando hay un libro abierto. Fijarlo desde un complemento o una rutina de arranque mientras no existe ningún libro lanza el error 1004 en tiempo de ejecución. Si tu código corre pronto en el ciclo de vida de Excel, protégelo con If Workbooks.Count > 0 Then antes de tocar la propiedad.

Cómo ayuda ExcelMaster

Calculation da la mayor mejora de velocidad de los tres interruptores y acarrea el mayor riesgo. Usarlo bien significa guardar el estado previo, forzar un recálculo cuando un paso posterior lee el resultado de una fórmula, restaurar el estado guardado en un manejador de errores, y saber que puede lanzar 1004 sin ningún libro abierto. Falla cualquiera de esos y te llevas o un cuelgue o, peor, un libro lleno de números obsoletos en silencio.

ExcelMaster se encarga del patrón completo por ti. Describe el trabajo — «recalcula este modelo después de actualizar los supuestos» — y pone el modo Manual, hace las escrituras, llama a Application.Calculate justo donde hace falta un resultado, y restaura el estado de cálculo con el que empezaste dentro de un manejador CleanExit. El libro vuelve exactamente como el usuario lo dejó, solo que más rápido.

Preguntas frecuentes

¿Qué hace Application.Calculation = xlCalculationManual?

Impide que Excel recalcule las fórmulas automáticamente tras cada cambio. Las escrituras siguen cayendo en las celdas, pero ninguna fórmula recalcula hasta que llamas a Application.Calculate o el usuario pulsa F9. En un libro cargado de fórmulas esta es la mayor mejora de velocidad que tiene a mano una macro, porque sustituye miles de recálculos por uno solo.

¿Por qué mis fórmulas dejaron de actualizarse tras ejecutar una macro?

Casi con seguridad la macro puso Application.Calculation = xlCalculationManual y no lo restauró — a menudo porque falló antes de la línea de restauración. El libro está ahora en modo Manual, así que las fórmulas mantienen su último valor calculado sin ninguna señal visible. Pon Application.Calculation = xlCalculationAutomatic (o pulsa F9), y en tu código restaura el ajuste en un manejador de errores para que no pueda quedarse colgado otra vez.

¿Debo volver a poner Calculation en Automatic o en lo que estaba?

Restaura lo que estaba. Guarda primero el valor (savedCalc = Application.Calculation) y vuelve a ponerlo en savedCalc al final. Fijar xlCalculationAutomatic a lo bruto pisa en silencio a los usuarios que mantienen a propósito un modelo pesado en modo Manual, forzando los recálculos lentos que estaban evitando.

¿Cómo fuerzo un recálculo en VBA estando en modo Manual?

Llama a Application.Calculate para recalcular todo, ActiveSheet.Calculate para una hoja, o SomeRange.Calculate para un rango. Lo necesitas siempre que un paso posterior lea un valor que la escritura de una fórmula anterior debería haber producido — en modo Manual esas celdas siguen obsoletas hasta que calculas.

¿Por qué me sale el error 1004 al fijar Application.Calculation?

Porque Application.Calculation solo se puede fijar mientras hay un libro abierto. Si tu código corre en el arranque o desde un complemento antes de que exista ningún libro, la asignación lanza el error 1004 en tiempo de ejecución. Protégelo con If Workbooks.Count > 0 Then antes de fijar la propiedad.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 17/08/2026.

Guías relacionadas: VBA ScreenUpdating · VBA EnableEvents · VBA On Error · VBA Range · VBA WorksheetFunction