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

VBA GetSaveAsFilename en Excel — pregunte dónde guardar sin guardar

|

VBA GetSaveAsFilename en Excel — pregunte dónde guardar sin guardar

TL;DR — Application.GetSaveAsFilename muestra 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 a SaveAs. Al cancelar, devuelve el valor booleano False, así que declare la variable As Variant y compruebe If path = False Then Exit Sub. Y el formato real del archivo proviene del FileFormat que pasa a SaveAs, 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, GetOpenFilename y FileDialog
  • Por qué devuelve una ruta, no un archivo guardado, y la línea de SaveAs que aún le queda por escribir
  • La trampa de la cancelación otra vez: devuelve False, así que la variable debe ser As 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