VBA : Demander le chemin d’enregistrement avant d’enregistrer

VBA - Visual Basic for Application

VBA peut déjà être d’une grande aide dans le monde Microsoft Office pour automatiser des tâches quotidiennes, on peut par exemple enregistrer automatiquement les pièces jointes des e-mails Outlook ou lire le contenu d’un PDF et l’insérer dans un fichier Excel. Pour de tels automatismes, il peut être utile de demander au préalable le chemin d’enregistrement, en tant que répertoire où les données ou les fichiers doivent être enregistrés, via un dialogue.

Public Sub SaveWithDialog()
    Dim folderToSave As String
    folderToSave = SaveToFolder
    'ici suivent ensuite les autres instructions pour utiliser le chemin de sauvegarde.
    Debug.Print folderToSave
End Sub

Les 3-4 lignes de code présentées ici sont notre fonction de base, que l’on peut ensuite exécuter via une macro. Nous définissons ici une variable de type chaîne de caractères folderToSave, à laquelle est ensuite transmis le chemin du répertoire. Avec Debug.Print, nous affichons le chemin d’enregistrement déterminé par une boîte de dialogue de sélection dans la fenêtre directe.

La demande du chemin d’enregistrement au moyen d’une boîte de dialogue “Enregistrer sous” est ici transférée dans une fonction séparée. Le problème est qu’il n’existe pas de telles fonctions de dialogue directement dans VBA ou qu’elles ne sont pas disponibles dans tous les programmes comme Outlook. Il faut donc recourir à des solutions de contournement alternatives. Il existe deux variantes.

La fonction qui gère la demande du chemin d’enregistrement à l’utilisateur s’appelle ici dans notre exemple SaveToFolder, elle est sans paramètre et renvoie le chemin du répertoire sélectionné par l’utilisateur.

Variante 1 : “Rechercher un dossier” – dialogue pour le chemin de sauvegarde

On peut utiliser la boîte de dialogue “Rechercher un dossier“. La capture d’écran suivante montre à quoi elle ressemble.

Capture d'écran de la boîte de dialogue VBA Sélectionner un dossier à enregistrer sous le répertoire sélectionné
Variante 1 : Boîte de dialogue des dossiers

La boîte de dialogue de recherche de dossier utilise une Shell.Application, comme on peut le voir avec le code ci-dessous.

Function SaveToFolder(Optional OpenAt As String) As String.
    Dim ShellApp As Object
    
    Set ShellApp = CreateObject("Shell.Application"). _
    BrowseForFolder(0, "Select Folder", 0, OpenAt)
    
    On Error Resume Next
    SaveToFolder = ShellApp.self.Path
    On Error GoTo 0
    
    Select Case Mid(SaveToFolder, 2, 1)
    Case Is = " :"
        If Left(SaveToFolder, 1) = " :" Then
            SaveToFolder = ""
        End If
    Case Is = "\"
        If Not Left(SaveToFolder, 1) = "\" Then
            SaveToFolder = ""
        End If
    Case Else
        SaveToFolder = ""
    End Select
    
ExitFunction:
    Set ShellApp = Nothing
End Function

Cette variante fonctionne sous toutes les applications Office, car l’application shell est disponible dans tout Windows.

Variante 2 : “Enregistrer sous” – Utiliser la boîte de dialogue

La deuxième variante montre la boîte de dialogue classique “Enregistrer sous”, comme on en a l’habitude sous Windows. Malheureusement, celle-ci n’est pas directement disponible avec VBA dans toutes les applications. Par exemple, avec VBA dans Outlook, il n’est pas possible d’appeler directement une telle boîte de dialogue pour définir un dossier comme chemin d’enregistrement.

Capture d'écran du fichier VBA Enregistrer sous - boîte de dialogue, on peut indiquer le chemin d'enregistrement et le nom du fichier
Variante 2 : Boîte de dialogue “Enregistrer sous”

Cependant, cette boîte de dialogue de fichier est en tout cas disponible pour Excel. Ainsi, on a également la possibilité d’appeler la boîte de dialogue de fichier dans d’autres programmes Office, en définissant simplement un objet d’application Excel dans VBA. Le code VBA suivant montre comment cela fonctionne.

Fonction SaveToFolder() As String
    Dim fileDlg As fileDialog
    Set excelApp = CreateObject("Excel.application")
    excelApp.Visible = False
    Set fileDlg = excelApp.fileDialog(msoFileDialogFolderPicker)

    With fileDlg
        If .Show = -1 Then 'si l'utilisateur appuie sur le bouton Okay
            'Parcourir chaque chaîne de caractères de la collection FileDialogSelectedItems.
            For Each SelectedItem In .SelectedItems
                SaveToFolder = SelectedItem
            Next SelectedItem
        Else
            'si l'utilisateur appuie sur le bouton Cancel
            SaveToFolder = ""
        End If
    End With
    
    Set fileDlg = Nothing
    excelApp.Quit
    Set excelApp = Nothing
End Function

Avec l’une de ces deux variantes, on offre donc à l’utilisateur la possibilité de choisir de manière dédiée un répertoire comme chemin de stockage, pour ensuite le réutiliser dans la macro VBA.

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *