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.

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.

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.