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

VBA Guardar Libro en Excel — Save frente a SaveAs, la trampa de FileFormat y por qué desaparecen tus macros

|

VBA Guardar Libro en Excel — Save frente a SaveAs, la trampa de FileFormat y por qué desaparecen tus macros

TL;DR.Save sobrescribe el archivo que ya tienes. .SaveAs escribe un archivo o un tipo nuevo, y tienes que darle el número de FileFormat correcto o le arrancas las macros al libro. Un .xlsm con macros habilitadas necesita xlOpenXMLWorkbookMacroEnabled (52), no el formato .xlsx (51):

Sub SaveAsMacroWorkbook()
    Application.DisplayAlerts = False               ' preaprueba el aviso de sobrescritura
    ThisWorkbook.SaveAs _
        Filename:="C:\Reports\Q1.xlsm", _
        FileFormat:=xlOpenXMLWorkbookMacroEnabled   ' 52 = .xlsm, conserva el VBA
    Application.DisplayAlerts = True                ' restaura de inmediato
End Sub

Guardar parece lo más simple que puede hacer una macro, y esconde la trampa de pérdida de datos más afilada de todo el modelo de objetos del libro: el FileFormat equivocado borra tu código sin una sola palabra de advertencia. Esta guía se construye sobre la única distinción que lo evita — Save conserva el archivo que tienes, SaveAs crea uno nuevo, y el nuevo solo es correcto si el formato coincide con la extensión.

Lo que aprenderás

  • El modelo mental — Save confirma en el sitio; SaveAs escribe un archivo nuevo y necesita un FileFormat
  • La trampa que se come tus macros — guardar un .xlsm con el número de formato de .xlsx arranca todo el VBA
  • Por qué .Save sobre un libro nunca guardado abre el cuadro Guardar como y cuelga una macro desatendida
  • Cómo DisplayAlerts convierte el aviso de sobrescritura en una preaprobación, no en un botón de silencio
  • Qué hace de verdad wb.Saved = True (marcar como limpio) frente a lo que no hace (escribir el archivo)
  • Cuándo echar mano de SaveCopyAs y ExportAsFixedFormat en su lugar

El modelo mental: Save confirma, SaveAs crea

Dos verbos, dos trabajos:

  • .Save sobrescribe el archivo existente del libro, en el sitio, en silencio. Sin cuadro de diálogo, sin nombre nuevo. Es Ctrl+S. Solo funciona si el libro ya tiene un archivo en el disco.
  • .SaveAs escribe el libro en una ruta nueva o un tipo de archivo nuevo. Es Archivo > Guardar como. Como está creando un archivo, necesita conocer el formato — y ahí es donde vive la trampa.
ThisWorkbook.Save                                   ' sobrescribe el archivo actual
ThisWorkbook.SaveAs "C:\Reports\Copy.xlsx", xlOpenXMLWorkbook   ' escribe un .xlsx nuevo

Todo lo que sigue es consecuencia de esa única división.

La trampa que se come tus macros: FileFormat debe coincidir con la extensión

Este es el fallo que hace pensar a la gente que Excel «perdió» su código. Guardas un libro que contiene macros, pero con el número de formato de libro normal:

ThisWorkbook.SaveAs "C:\Reports\Q1.xlsm", xlOpenXMLWorkbook   ' 51 = .xlsx = SIN macros

xlOpenXMLWorkbook (51) es el formato .xlsx, y .xlsx no puede contener VBA. Excel escribe el archivo y descarta en silencio todos los módulos y macros — aunque hayas llamado al archivo .xlsm. Ahora la extensión dice «con macros habilitadas» y el contenido dice «sin macros», así que Excel avisa o se niega a abrirlo limpiamente, y tu código ya no está.

La regla es simple: el número de FileFormat debe concordar con la extensión. Los cuatro que de verdad usas:

' Constantes de FileFormat (y sus valores numericos):
'   xlOpenXMLWorkbook               = 51   .xlsx   (sin macros)
'   xlOpenXMLWorkbookMacroEnabled   = 52   .xlsm   (conserva las macros)
'   xlExcel8                        = 56   .xls    (antiguo 97-2003)
'   xlCSV                           =  6   .csv    (una hoja, solo valores)

Si el libro tiene código, tiene que ser .xlsm con 52. En caso de duda, usa la constante con nombre, no el número crudo — xlOpenXMLWorkbookMacroEnabled no se puede teclear mal como sí puede 52.

.Save sobrescribe el archivo existente — pero un libro creado con Workbooks.Add todavía no tiene archivo. Llamar a .Save sobre él no puede saber dónde escribir, así que Excel recurre al cuadro Guardar como — que cuelga cualquier macro que corra desatendida. La primera vez que escribes un libro nuevo, usa siempre .SaveAs con una ruta y un formato explícitos:

Dim wb As Workbook
Set wb = Workbooks.Add
' wb.Save                                            ' MAL en un libro nuevo - abre el cuadro Guardar como
wb.SaveAs "C:\Reports\New.xlsx", xlOpenXMLWorkbook   ' bien - dale una ruta la primera vez
wb.Save                                              ' ahora .Save funciona - el archivo existe

El aviso de sobrescritura es una preaprobación, no un botón de silencio

SaveAs sobre una ruta que ya existe lanza el aviso modal «Ya existe un archivo — ¿reemplazarlo?». Para correr desatendida lo suprimes:

Application.DisplayAlerts = False
wb.SaveAs "C:\Reports\Q1.xlsm", xlOpenXMLWorkbookMacroEnabled
Application.DisplayAlerts = True

Léelo con honestidad: poner DisplayAlerts = False no silencia la pregunta, la responde con el valor por defecto — sí, reemplazar. Has preaprobado sobrescribir lo que hubiera ya en esa ruta. Ese es exactamente el punto que se plantea en VBA DisplayAlerts: no estás ocultando una advertencia, estás aceptando por adelantado el valor por defecto destructivo. Restaura DisplayAlerts = True en la línea siguiente para que el próximo aviso no se auto-confirme también en silencio.

Saved = True marca como limpio; no guarda

wb.Saved es el indicador de «sucio» — False significa «hay cambios sin guardar». Verás este truco para suprimir el aviso de cierre:

wb.Saved = True     ' dile a Excel "no hay cambios sin guardar" - NO escribe el archivo
wb.Close            ' cierra sin el aviso de "guardar cambios?"

Esto es útil, pero ten claro qué hace exactamente: le miente a Excel sobre el estado de 'sucio' para que el aviso de cierre no aparezca. No escribe nada en el disco. Si de verdad querías conservar los cambios, wb.Saved = True los tira a la basura. Marcar como limpio y guardar son operaciones distintas — no las confundas.

SaveCopyAs y PDF: los dos parecidos a SaveAs

Dos trabajos que se parecen a SaveAs pero no lo son:

  • SaveCopyAs escribe una copia de respaldo en el disco sin cambiar la propia ruta del libro ni su estado de sucio. Es la herramienta correcta para «haz una instantánea del archivo antes de mutarlo», porque el libro activo conserva su nombre original y sigue abierto:

    ThisWorkbook.SaveCopyAs "C:\Backups\before-run.xlsm"   ' copia fuera; original intacto
    
  • PDF no es un formato de SaveAs. No existe un «SaveAs PDF» — exportar a PDF es un método distinto, ExportAsFixedFormat:

    ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Reports\Q1.pdf"
    

El veredicto honesto: qué guardado usar

  • .Save — confirma los cambios en un libro que ya tiene archivo. El caso de cada día.
  • .SaveAs ruta, FileFormat — escribe un archivo nuevo o convierte el tipo. Pasa siempre un FileFormat explícito, y haz que coincida con la extensión: 52 para .xlsm, 51 para .xlsx, 6 para .csv.
  • .SaveCopyAs — una instantánea de respaldo que deja en paz al libro activo.
  • ExportAsFixedFormat — salida a PDF/XPS, no es un formato de guardado.

Lo innegociable: si el libro contiene código, es .xlsm con xlOpenXMLWorkbookMacroEnabled. Cada ticket de «¿dónde se fueron mis macros?» es ese número mal puesto. Y cualquier SaveAs en una ejecución automatizada necesita DisplayAlerts = False a su alrededor — con una restauración inmediata — para que el aviso de sobrescritura no cuelgue el trabajo o, peor, se responda en silencio también para el siguiente archivo.

Cómo ayuda ExcelMaster

El paso de guardar es donde una macro que funciona destruye trabajo en silencio: el FileFormat equivocado borra el VBA, .Save sobre un libro nuevo se cuelga en un cuadro de diálogo, un DisplayAlerts sin restaurar auto-confirma el siguiente aviso, y Saved = True tira los cambios que querías conservar. Cada uno es un pequeño detalle; cada uno pierde datos.

ExcelMaster acierta el guardado por construcción. Pídele «guarda la hoja de cada región como su propio libro con macros habilitadas» y escribe .SaveAs con xlOpenXMLWorkbookMacroEnabled, envuelve la sobrescritura en un par de DisplayAlerts apagado/encendido, usa SaveCopyAs cuando quieres un respaldo en vez de un renombrado, y .Save solo en libros que ya tienen ruta. Tú describes el archivo que quieres; él elige el formato que conserva tu código y tus datos.

Preguntas frecuentes

¿Cuál es la diferencia entre Save y SaveAs en VBA?

.Save sobrescribe el archivo existente del libro en el sitio, en silencio, sin cuadro de diálogo — el equivalente de Ctrl+S. .SaveAs escribe el libro en una ruta nueva o un tipo de archivo nuevo y requiere un argumento FileFormat. Usa .Save para confirmar cambios en un archivo que ya existe, y .SaveAs para crear un archivo nuevo o convertir el formato.

¿Por qué VBA borró mis macros al guardar el libro?

Guardaste un libro con macros con el número de formato de .xlsx, xlOpenXMLWorkbook (51). El formato .xlsx no puede almacenar VBA, así que Excel descarta en silencio todos los módulos aunque el archivo se llame .xlsm. Guarda los libros con macros habilitadas con xlOpenXMLWorkbookMacroEnabled (52) para que el código se conserve.

¿Cómo guardo un libro en VBA sin el aviso de sobrescritura?

Pon Application.DisplayAlerts = False antes del SaveAs, y luego restáuralo a True justo después. Esto responde el aviso de «ya existe el archivo, ¿reemplazar?» con su valor por defecto (sí, reemplazar), así que no aparece. Recuerda que has preaprobado sobrescribir el archivo existente, así que asegúrate de que es lo que quieres.

¿Qué hace wb.Saved = True en VBA?

Pone el indicador de sucio del libro en «no hay cambios sin guardar» para que Excel no muestre el aviso de «¿guardar cambios?» al cerrar. No escribe nada en el disco. Si de verdad había cambios sin guardar, poner Saved = True los descarta. Para conservar los cambios, llama a .Save o cierra con SaveChanges:=True.

¿Cómo guardo un libro como PDF en VBA?

PDF no es un formato de SaveAs. Usa ExportAsFixedFormat: ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Reports\Q1.pdf". Para escribir una copia de respaldo simple del propio libro sin cambiar su nombre, usa SaveCopyAs en su lugar.

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 Close Workbook · VBA DisplayAlerts · VBA Workbook_BeforeSave Event · VBA ScreenUpdating