TL;DR —
Application.GetSaveAsFilenamemuestra el cuadro de diálogo Guardar como y devuelve la ruta que el usuario eligió como cadena de texto; no guarda nada. Para escribir el archivo de verdad sigue teniendo que llamar aSaveAs. Al cancelar, devuelve el valor booleanoFalse, así que declare la variableAs Varianty compruebeIf path = False Then Exit Sub. Y el formato real del archivo proviene delFileFormatque pasa aSaveAs, no de la extensión del cuadro de diálogo.
Sub AskThenSave()
Dim path As Variant ' Variant, para que la cancelacion pueda devolver False
path = Application.GetSaveAsFilename( _
InitialFileName:="Report " & Format(Date, "yyyy-mm-dd"), _
FileFilter:="Excel Workbook (*.xlsx), *.xlsx")
If path = False Then Exit Sub ' el usuario cancelo
ActiveWorkbook.SaveAs Filename:=path, FileFormat:=xlOpenXMLWorkbook ' USTED guarda
End Sub
GetSaveAsFilename es el espejo exacto de GetOpenFilename: una pregunta
qué archivo abrir y esta pregunta dónde guardar. Y comparte la misma sorpresa de portada —devuelve una
ruta, no guarda un archivo— más un truco propio sobre los formatos de archivo que produce archivos con
aspecto de corruptos si se le escapa. Si ha leído la guía de GetOpenFilename, gran parte de esto le resultará
familiar; las dos últimas secciones son donde viven las diferencias.
Lo que aprenderá
- El modelo mental que conecta
GetSaveAsFilename,GetOpenFilenameyFileDialog - Por qué devuelve una ruta, no un archivo guardado, y la línea de
SaveAsque aún le queda por escribir - La trampa de la cancelación otra vez: devuelve
False, así que la variable debe serAs Variant - Cómo sugerir un nombre y una carpeta predeterminados con
InitialFileName - La trampa del formato: la extensión que ve el usuario no es lo que decide el tipo de archivo
- Cuándo usarla frente al tipo SaveAs de
FileDialog
El modelo mental: una nota adhesiva que dice «¿guardar dónde?»
Como su hermana, GetSaveAsFilename le entrega al usuario una nota adhesiva; esta pregunta «¿dónde guardar
y con qué nombre?». El usuario navega, escribe un nombre, hace clic en Guardar y usted recupera la ruta que
eligió. No se escribe nada en el disco:
path = Application.GetSaveAsFilename(...) ' devuelve una cadena de RUTA
ActiveWorkbook.SaveAs Filename:=path ' USTED escribe el archivo
El informe de «GetSaveAsFilename no creó un archivo» es el mismo malentendido que el de su hermana, pero al
revés: la función solo recoge el destino. El guardado en sí —ActiveWorkbook.SaveAs,
Workbook.SaveCopyAs o escribir texto con un FileSystemObject— es la
siguiente línea que usted escribe. Preguntar dónde guardar y guardar son dos pasos.
La trampa de la cancelación, una vez más: Dim As Variant
La cancelación se comporta exactamente igual que en GetOpenFilename: la
función devuelve el booleano False, por lo que la variable debe poder contener o bien una ruta o bien un
booleano:
Dim path As Variant ' CORRECTO: una ruta String O el booleano False
' Dim path As String ' INCORRECTO: False se convierte en el texto "False", asi que SaveAs escribe un archivo llamado False
Con As String, el False de la cancelación se convierte al texto "False", If path = False nunca se
dispara y SaveAs escribe alegremente un libro literalmente llamado False en el directorio actual.
Declarar path As Variant y comprobar If path = False Then Exit Sub es toda la solución.
Sugerir un nombre predeterminado con InitialFileName
Los mejores cuadros de diálogo de guardado se abren con un nombre razonable ya escrito. Ese es el argumento
InitialFileName, que también puede llevar una carpeta, para que el cuadro de diálogo se abra donde usted
quiera:
' Rellenar previamente un nombre con fecha en una carpeta concreta
path = Application.GetSaveAsFilename( _
InitialFileName:="C:\Reports\Sales " & Format(Date, "yyyy-mm-dd") & ".xlsx", _
FileFilter:="Excel Workbook (*.xlsx), *.xlsx")
Usar argumentos con nombre (InitialFileName:=, FileFilter:=) mantiene la llamada legible, porque
GetSaveAsFilename tiene varios parámetros opcionales y las comas por posición se vuelven difíciles de
contar. Un nombre con fecha ya rellenado es un pequeño detalle que hace que una macro parezca terminada.
La trampa del formato: la extensión no es el formato
Este es el truco propio del guardado, y pilla a quienes suponen que la extensión del cuadro de diálogo
controla el tipo de archivo. No lo hace. GetSaveAsFilename devuelve una cadena; el formato real del
archivo lo decide el argumento FileFormat que pasa a SaveAs:
' DISCREPANCIA: la ruta termina en .xlsx pero le dice a SaveAs que escriba el antiguo formato binario
ActiveWorkbook.SaveAs Filename:="Book.xlsx", FileFormat:=xlExcel8 ' -> un archivo que no se abrira correctamente
' COINCIDENCIA: la extension y FileFormat concuerdan
ActiveWorkbook.SaveAs Filename:="Book.xlsx", FileFormat:=xlOpenXMLWorkbook ' .xlsx
ActiveWorkbook.SaveAs Filename:="Book.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled ' .xlsm
Si la extensión de la ruta y la constante FileFormat no concuerdan, Excel escribe los bytes en un formato
bajo un nombre que dice ser otro, y el archivo lanza un error cuando alguien hace doble clic en él. Así que
decida el formato en su código y pase el FileFormat que corresponda; no dé por hecho que el .xlsx que el
usuario vio en el cuadro de diálogo hiciera nada. Si ofrece varios filtros, lea cuál eligió el usuario (a
través del FilterIndex en el que deja el cuadro de diálogo) y elija el FileFormat que coincida.
¿GetSaveAsFilename o el SaveAs de FileDialog? Elija según el control
Para «preguntar dónde guardar y darme la ruta», GetSaveAsFilename es la herramienta directa de una sola
línea. Recurra a FileDialog con msoFileDialogSaveAs cuando quiera el objeto
de diálogo: por su método .Execute, o para mantener el mismo estilo de lectura de .SelectedItems que usa
en otros sitios. Para preguntar qué abrir en lugar de dónde guardar, el espejo es
GetOpenFilename. Las tres devuelven una ruta y le dejan a usted la acción.
Cómo ayuda ExcelMaster
Los errores aquí son de los que solo aparecen más tarde: un libro llamado False por una cancelación sin
controlar, y un archivo que no se abre porque la extensión y FileFormat no concordaban. Ninguno lanza un
error cuando se ejecuta la macro: salen a la luz cuando alguien intenta usar el archivo.
ExcelMaster le permite
describir el resultado —«déjame elegir dónde guardar esta hoja como un CSV con fecha»— y escribe la llamada a
GetSaveAsFilename con la protección de cancelación con Variant, un nombre predeterminado razonable y un
SaveAs cuyo FileFormat coincide con la extensión. Usted se queda con el libro y con el código.
Preguntas frecuentes
¿Cómo uso GetSaveAsFilename en Excel VBA?
Llame a path = Application.GetSaveAsFilename(InitialFileName, FileFilter, FilterIndex, Title). Declare
path As Variant, compruebe If path = False Then Exit Sub para captar una cancelación y luego guarde con
ActiveWorkbook.SaveAs Filename:=path, FileFormat:=.... La función solo devuelve la ruta elegida; no guarda
el archivo por sí misma.
¿Por qué GetSaveAsFilename no guarda el archivo?
Porque solo está pensada para recoger la ruta de destino, no para escribir nada. Muestra el cuadro de diálogo
Guardar como y devuelve la ruta que el usuario eligió. El guardado real lo hace usted en la línea siguiente:
ActiveWorkbook.SaveAs Filename:=path para un libro, o un
FileSystemObject para texto. Preguntar dónde guardar y guardar son pasos
distintos.
¿Cómo establezco un nombre de archivo predeterminado en el cuadro de diálogo Guardar como?
Pase el argumento InitialFileName: Application.GetSaveAsFilename(InitialFileName:="Report.xlsx"). Puede
incluir una carpeta además de un nombre, así que "C:\Reports\Report " & Format(Date, "yyyy-mm-dd") & ".xlsx" abre el cuadro de diálogo en esa carpeta con un nombre con fecha ya rellenado y listo para aceptar o
editar.
¿Cómo detecto la cancelación en GetSaveAsFilename?
Declare la variable As Variant y compruebe If path = False Then Exit Sub. Al cancelar, la función
devuelve el booleano False; si tiene éxito, devuelve una cadena de ruta. Con una variable As String, el
False se convierte al texto "False", la comprobación nunca se dispara y SaveAs escribe un archivo
literalmente llamado False.
¿Por qué mi archivo guardado no se abre después de usar GetSaveAsFilename?
Casi siempre porque la extensión de la ruta y el FileFormat que pasó a SaveAs no concuerdan; por ejemplo,
un nombre .xlsx guardado con FileFormat:=xlExcel8. Excel escribe un formato bajo un nombre que dice ser
otro, y el archivo da error al abrirse. Decida el formato en el código y pase la constante FileFormat que
corresponda (xlOpenXMLWorkbook para .xlsx, xlOpenXMLWorkbookMacroEnabled para .xlsm).
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 26/09/2026.
Guías relacionadas: VBA GetOpenFilename · VBA FileDialog · VBA Save Workbook · VBA InputBox · VBA FileSystemObject · VBA Workbook
