TL;DR —
Application.Calculation = xlCalculationManualle 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.Calculatecuando un paso posterior necesita un resultado - Restaurar el estado guardado, no fijar
xlCalculationAutomatica lo bruto - El
error 1004con 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
