TL;DR —
.Savesobrescribe el archivo que ya tienes..SaveAsescribe un archivo o un tipo nuevo, y tienes que darle el número deFileFormatcorrecto o le arrancas las macros al libro. Un.xlsmcon macros habilitadas necesitaxlOpenXMLWorkbookMacroEnabled(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 —
Saveconfirma en el sitio;SaveAsescribe un archivo nuevo y necesita unFileFormat - La trampa que se come tus macros — guardar un
.xlsmcon el número de formato de.xlsxarranca todo el VBA - Por qué
.Savesobre un libro nunca guardado abre el cuadro Guardar como y cuelga una macro desatendida - Cómo
DisplayAlertsconvierte 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
SaveCopyAsyExportAsFixedFormaten su lugar
El modelo mental: Save confirma, SaveAs crea
Dos verbos, dos trabajos:
.Savesobrescribe el archivo existente del libro, en el sitio, en silencio. Sin cuadro de diálogo, sin nombre nuevo. EsCtrl+S. Solo funciona si el libro ya tiene un archivo en el disco..SaveAsescribe el libro en una ruta nueva o un tipo de archivo nuevo. EsArchivo > 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 sobre un libro nunca guardado abre un cuadro de diálogo
.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:
SaveCopyAsescribe 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 intactoPDF 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 unFileFormatexplícito, y haz que coincida con la extensión:52para.xlsm,51para.xlsx,6para.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
