TL;DR —
wb.Closesobre un libro con cambios sin guardar muestra el cuadro de diálogo modal «¿Quieres guardar los cambios?» — que congela una macro desatendida para siempre. Respóndelo desde el código con el argumentoSaveChanges:
Sub CloseWithoutPrompt()
Dim wb As Workbook
Set wb = Workbooks.Open("C:\Reports\March.xlsx")
' ... lee lo que necesites ...
wb.Close SaveChanges:=False ' responde el aviso en codigo - sin cuadro, sin cuelgue
Set wb = Nothing ' la referencia esta muerta despues de Close
End Sub
Cerrar es donde una macro por lotes que corrió perfecta toda la noche aparece a la mañana siguiente aún
atascada en un cuadro de diálogo, habiendo procesado uno de doscientos archivos. wb.Close no solo cierra
un libro — hace una pregunta, y si no la respondes desde el código, Excel se la hace al usuario, y el
usuario no está. Esta guía se construye sobre esa única idea: SaveChanges es tu respuesta, y cada bug de
cierre es una versión de olvidar dártela.
Lo que aprenderás
- El modelo mental —
Closepregunta «¿guardar cambios?»; el argumentoSaveChangeses tu respuesta desde el código - El cuelgue número uno — cerrar un libro sucio sin
SaveChangescongela una macro desatendida - El peligro espejo —
SaveChanges:=Falsedescarta en silencio, así que decídelo a propósito - Por qué la variable de objeto queda muerta en el instante en que cierras, y leerla da error
wb.Close(un libro) frente aApplication.Quit(todo Excel), y la trampa delEXCEL.EXEinvisible- Por qué cerrar guardando hereda todas las trampas de Save
El modelo mental: Close hace una pregunta — respóndela desde el código
Cuando un libro tiene cambios sin guardar, wb.Close no puede simplemente cerrarlo — Excel no sabe si
quieres conservar esos cambios. Así que hace lo que hace con un humano: abre el cuadro «¿Quieres guardar
los cambios?» y espera. Eso está bien cuando hay una persona sentada ahí. En una macro, tú eres quien
tiene que responder, y respondes con el argumento SaveChanges:
wb.Close SaveChanges:=False ' cierra y DESCARTA los cambios sin guardar
wb.Close SaveChanges:=True ' GUARDA primero, luego cierra
wb.Close ' sin respuesta - Excel le pregunta al USUARIO (el aviso)
Da la respuesta desde el código y el cuadro de diálogo nunca aparece. Omítela en un libro sucio y vuelves al aviso.
El cuelgue número uno: sin SaveChanges en un libro sucio
Este es el fallo detrás de «mi macro programada nunca terminó». La macro abre un archivo, cambia algo —
incluso un recálculo o un manejador Worksheet_Change marca el libro como sucio — y luego:
wb.Close ' libro sucio, sin SaveChanges -> cuadro de "guardar cambios?" -> se cuelga para siempre
No hay nadie en el teclado para pulsar Sí o No, así que la macro se queda sobre ese cuadro de diálogo modal
indefinidamente. Todo el lote se atasca detrás de él. El arreglo es pasar siempre SaveChanges en
cualquier Close que pueda correr desatendido:
wb.Close SaveChanges:=False ' procesamiento de solo lectura: descarta, nunca preguntes
Si recuerdas una sola línea de esta página, que sea wb.Close SaveChanges:=False para todo lo que solo
lees.
El peligro espejo: False descarta en silencio
SaveChanges:=False es la cura para el cuelgue, y también es su propia trampa. Tira los cambios sin
guardar sin deshacer y sin confirmación. Si la macro de verdad hizo un trabajo que querías conservar,
SaveChanges:=False lo borra en silencio. Así que decide a propósito:
- ¿Solo lees el archivo?
wb.Close SaveChanges:=False— no hay nada que conservar, nunca preguntes. - ¿Escribiste resultados que quieres conservar?
wb.Close SaveChanges:=True— owb.Saveprimero, luegowb.Close SaveChanges:=False, que es más claro porque el guardado y el cierre son pasos separados y visibles.
El aviso existe para evitar que un humano pierda trabajo. Cuando lo suprimes con un argumento, tú asumes esa responsabilidad.
La referencia queda muerta tras Close
Una vez que wb.Close se ejecuta, el libro desaparece de la memoria y la variable wb no apunta a nada.
Tocarla lanza un error:
wb.Close SaveChanges:=False
MsgBox wb.Name ' ERROR - wb ya no se refiere a un libro abierto
Así que lee todo lo que necesitas antes de cerrar, y pon la variable en Nothing después para dejar la
intención explícita:
Dim finalName As String
finalName = wb.Name ' captura ANTES de cerrar
wb.Close SaveChanges:=False
Set wb = Nothing ' la referencia esta muerta; dilo
MsgBox "Closed " & finalName
Cerrar un libro frente a salir de Excel — y el EXCEL.EXE invisible
wb.Close cierra un libro. Application.Quit cierra Excel entero. No son intercambiables, y muerden
dos casos límite:
ThisWorkbook.Closecierra el libro cuya macro está corriendo. Cualquier código posterior a esa línea puede no ejecutarse. Cierra otros libros desde una macro; cierra el tuyo el último, o no lo cierres.- Cerrar el último libro puede dejar un
EXCEL.EXEinvisible en marcha. Si tu código todavía retiene una referencia a un objetoApplicationoWorkbookcuando se cierra la última ventana, Excel no puede apagarse del todo y perdura como un proceso fantasma en el Administrador de tareas. Libera tus referencias (Set wb = Nothing,Set xlApp = Nothing) para que el proceso pueda salir. Este es el bug clásico detrás de «Excel se queda corriendo después de que mi macro termina».
Cerrar guardando hereda todas las trampas de Save
wb.Close SaveChanges:=True ejecuta un Save al salir — así que hereda todas las trampas de
VBA Save Workbook:
- En un libro nunca guardado, cerrar guardando no tiene ruta y recurre al cuadro Guardar como (se
cuelga). Dale una ruta con
SaveAsprimero, o cierra conSaveChanges:=Falsesi no necesitas conservarlo. - En un libro con macros guardado con el FileFormat equivocado, cerrar guardando puede volver a lanzar la
advertencia de que se arrancan las macros. Si el código importa, el archivo es
.xlsm.
En caso de duda, separa los pasos: wb.Save (o wb.SaveAs ruta, formato) en su propia línea, luego
wb.Close SaveChanges:=False. Dos operaciones visibles ganan a una que hace ambas en silencio.
El veredicto honesto: el patrón del bucle por lotes
Todo lo anterior se condensa en una sola forma fiable. En un bucle de carpeta, abre y cierra dentro del bucle para no acumular nunca libros abiertos reteniendo bloqueos de archivo:
Dim name As String
name = Dir("C:\Reports\*.xlsx")
Do While name <> ""
Dim wb As Workbook
Set wb = Workbooks.Open("C:\Reports\" & name)
' ... lee los totales ...
wb.Close SaveChanges:=False ' responde en codigo en cada iteracion
Set wb = Nothing
name = Dir ' siguiente archivo
Loop
SaveChanges:=False es el valor por defecto para el procesamiento de solo lectura; SaveChanges:=True
cuando escribiste resultados. Nunca te apoyes en el aviso, respóndelo siempre, lee antes de cerrar, y libera
la referencia. Haz eso y el paso de cerrar — el que atasca en silencio los trabajos desatendidos — se
convierte en el final aburrido y fiable de cada archivo que abres.
Cómo ayuda ExcelMaster
El paso de cerrar es engañosamente peligroso: olvida SaveChanges y una macro programada se cuelga en un
cuadro de diálogo; pasa False cuando querías True y el trabajo terminado se esfuma; retén una referencia
perdida y Excel perdura como un proceso fantasma. Estos son los bugs que solo aparecen a las 3 de la
madrugada cuando nadie mira.
ExcelMaster escribe el cierre como
lo haría un ingeniero de automatización cuidadoso. Describe el trabajo — «procesa todos los archivos de esta
carpeta y cierra cada uno sin guardar» — y abre con Set wb = Workbooks.Open(...), lee lo que necesita
antes de cerrar, pasa un SaveChanges explícito en cada wb.Close, libera la referencia con
Set wb = Nothing, y nunca deja un libro abierto ni un proceso de Excel fantasma. Sin cuelgues, sin pérdida
silenciosa de datos.
Preguntas frecuentes
¿Cómo cierro un libro sin guardar en VBA?
Pasa SaveChanges:=False: wb.Close SaveChanges:=False. Esto responde el aviso de «¿guardar cambios?»
desde el código con «no», así que el cuadro de diálogo nunca aparece y el libro se cierra descartando
cualquier cambio sin guardar. Es el cierre correcto para el procesamiento de solo lectura donde no hay nada
que conservar.
¿Por qué se cuelga mi macro al cerrar un libro?
Porque llamaste a wb.Close sobre un libro con cambios sin guardar sin un argumento SaveChanges. Excel
muestra el cuadro de diálogo modal «¿Quieres guardar los cambios?» y espera un clic que nunca llega en una
ejecución desatendida. Pasa siempre SaveChanges:=False o SaveChanges:=True en cualquier cierre que corra
sin una persona mirando.
¿Cuál es la diferencia entre wb.Close y Application.Quit?
wb.Close cierra un solo libro y deja Excel corriendo. Application.Quit cierra Excel por completo,
incluidos todos los libros abiertos. Usa Close para terminar con un archivo en un bucle; usa Quit solo
cuando tu código lanzó su propia instancia de Excel y necesita apagarla.
¿Por qué Excel se queda corriendo después de que mi macro de VBA cierra el libro?
Tu código todavía retiene una referencia a un objeto Workbook o Application, así que Excel no puede
apagarse del todo y perdura como un proceso EXCEL.EXE invisible. Libera las referencias —
Set wb = Nothing y Set xlApp = Nothing — después de cerrar, para que el proceso pueda salir limpiamente.
¿Puedo leer las propiedades de un libro después de cerrarlo en VBA?
No. Una vez que wb.Close se ejecuta, el libro está fuera de la memoria y la variable ya no se refiere a
nada; wb.Name o wb.Sheets darán error. Captura lo que necesites en variables antes de llamar a
Close, y luego Set wb = Nothing.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 20/08/2026.
Guías relacionadas: VBA Open Workbook · VBA Save Workbook · VBA Workbook_BeforeClose Event · VBA DisplayAlerts · VBA DoEvents
