VBA: Consultar la ruta de memoria antes de guardar

VBA - Visual Basic for Application

VBA puede ser de gran ayuda en el mundo de Microsoft Office para automatizar tareas cotidianas, por ejemplo guardar automáticamente archivos adjuntos de correos electrónicos de Outlook o leer el contenido de un PDF e insertarlo en un archivo de Excel. Para este tipo de automatismos, puede ser útil consultar previamente la ruta de almacenamiento, es decir, el directorio donde se van a guardar los datos o archivos, a través de un diálogo.

Public Sub SaveWithDialog()
    Dim folderToSave As String
    carpetaGuardar = GuardarEnCarpeta
    'aquí luego sigue las instrucciones posteriores para usar la ruta de guardado
    Debug.Print carpetaGuardar
End Sub

Las 3-4 líneas de código que se muestran aquí son nuestra función básica, que luego se puede ejecutar como una macro. Aquí definimos una variable de cadena carpetaParaGuardar, a la que luego se le pasa la ruta del directorio. Con Debug.Print emitimos la ruta de memoria determinada mediante un diálogo de selección en la ventana directa.

La consulta de la ruta de memoria mediante un diálogo “Guardar como” se subcontrata aquí en una función aparte. El problema es que tales funciones de diálogo no existen directamente en VBA o no están disponibles en todos los programas, como Outlook. En su lugar, tiene que utilizar soluciones alternativas. Para ello existen dos variantes.

La función que gestiona la consulta de la ruta de guardado del usuario se llama GuardarEnCarpeta en nuestro ejemplo, no tiene parámetros y devuelve la ruta del directorio seleccionada por el usuario.

Variante 1: “Buscar carpeta” – diálogo para ruta de guardado

Puede utilizar el diálogo “Buscar carpeta“. Puede ver el aspecto de este diálogo en la siguiente captura de pantalla.

Captura de pantalla diálogo VBA Seleccionar carpeta para guardar en el directorio seleccionado
Variante 1: Diálogo de carpeta

El diálogo de búsqueda de carpetas utiliza un Shell.Application, como se puede ver en el siguiente código.

Función SaveToFolder(Opcional OpenAt As String) As String).
    Dim ShellApp As Object
    
    Set ShellApp = CreateObject("Shell.Application"). _
    BrowseForFolder(0, "Select Folder", 0, OpenAt)
    
    En caso de error reanudar siguiente
    SaveToFolder = ShellApp.self.Path
    En caso de error Ir a 0
    
    Select Case Mid(SaveToFolder, 2, 1)
    Case Is = ":"
        Si Left(SaveToFolder, 1) = ":" Entonces
            GuardarEnCarpeta = ""
        End If
    Case Is = "\"
        Si No Left(SaveToFolder, 1) = "\" Entonces
            GuardarEnCarpeta = ""
        Fin If
    Case Else
        SaveToFolder = ""
    Fin Select
    
Salir de la función:
    Set ShellApp = Nada
Función Final

Esta variante funciona bajo todas las aplicaciones de Office, ya que la aplicación shell está disponible en todo Windows.

Variante 2: “Guardar como” – usar diálogo

La segunda variante muestra el clásico diálogo “Guardar como” al que está acostumbrado en Windows. Por desgracia, no está disponible directamente en todas las aplicaciones con VBA. Por ejemplo, no puede utilizar VBA en Outlook para llamar directamente un diálogo de este tipo para especificar una carpeta como ruta de guardado.

Captura de pantalla del diálogo
Variante 2: Diálogo “Guardar como”

Sin embargo, este diálogo de archivo siempre está disponible para Excel. Esto significa que también puede llamar al cuadro de diálogo de archivo en otros programas de Office simplemente definiendo un objeto de aplicación de Excel en VBA. El siguiente código VBA muestra cómo hacerlo.

Función SaveToFolder() As String
    Dim fileDlg As fileDialogue
    Set excelApp = CreateObject("Excel.application")
    excelApp.Visible = False
    Set fileDlg = excelApp.fileDialog(msoFileDialogFolderPicker)

    Con fileDlg
        If .Show = -1 Then 'cuando el usuario pulsa el botón Aceptar
            'Recorre cada cadena de la colección FileDialogSelectedItems.
            Para Cada SelectedItem En .SelectedItems
                SaveToFolder = SelectedItem
            Siguiente ElementoSeleccionado
        Else
            'cuando el usuario pulsa el botón Cancelar
            SaveToFolder = ""
        End If
    Finalizar con
    
    Set fileDlg = Nada
    excelApp.Quit
    Set excelApp = Nada
Función Fin

Con una de estas dos variantes, ofreces al usuario la opción de seleccionar un directorio dedicado como ruta de almacenamiento para luego utilizarlo en la macro VBA.

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *