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

VBA Cerrar Libro en Excel — SaveChanges, el aviso que cuelga tu macro y cómo cerrar sin guardar

|

VBA Cerrar Libro en Excel — SaveChanges, el aviso que cuelga tu macro y cómo cerrar sin guardar

TL;DRwb.Close sobre 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 argumento SaveChanges:

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 — Close pregunta «¿guardar cambios?»; el argumento SaveChanges es tu respuesta desde el código
  • El cuelgue número uno — cerrar un libro sucio sin SaveChanges congela una macro desatendida
  • El peligro espejo — SaveChanges:=False descarta 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 a Application.Quit (todo Excel), y la trampa del EXCEL.EXE invisible
  • 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, 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 — o wb.Save primero, luego wb.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, 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.Close cierra 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.EXE invisible en marcha. Si tu código todavía retiene una referencia a un objeto Application o Workbook cuando 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 SaveAs primero, o cierra con SaveChanges:=False si 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