Les boites de dialogue intégrées

Excel 2003 contient, d'après l'aide, pas moins de 258 boîtes de dialogue personnalisées !
En voici quelques exemples : Fichier/Ouvrir, Fichier/Enregistrer sous, Format/Cellule, Outils/Personnaliser, etc.
Et le plus fort, c'est qu'il est possible de les appeler depuis du code VBA !

La liste de toutes les boîtes de dialogues existantes se trouve ici (fichier XLS)

Le principe d'appel est toujours le même :

Application.Dialogs(NomDeLaBoiteDeDialogue).Show "Paramètre éventuel", "Autre paramètre", ...

Exemple simple : Le Zoom

Exemple : Admettons qu'on veuille affichier la boîte de dialogue Zoom (Affichage/Zoom) :

Sub MacroQuelconque
  Application.Dialogs(xlDialogZoom).Show
End Sub

Et si maintenant on voulait que cette boîte affiche par défaut 75 %, on l'appellerait comme ceci :

Application.Dialogs(xlDialogZoom).Show "75"

Paramètres des boîtes de dialogues intégrées

Vous pouvez donc visualiser la totalité des boîtes de dialogues d'Excel ici. En fait, ce fichier Excel n'est qu'une copie de l'aide intégrée, à la rubrique "Dialogs". On constate que l'aide concernant les paramètres des différentes boîtes de dialogue est pour le moins lapidaire. En effet, si vous recherchez justement xlDialogZoom, (facile, c'est la dernière tout en bas...), on constate :

xlDialogZoom   magnification

ou magnification est donc le degré de zoom. Bien, mais faut il indiquer 75, 75%, 75 %, "75", "75%" ou "75 %" pour obtenir une valeur par défaut de 75 % ? Ce n'est qu'après quelques tâtonnements que j'ai trouvé

Application.Dialogs(xlDialogZoom).Show "75"

Pour une raison qui me laisse perplexe, certaines boîtes de dialogue acceptent des paramètres, d'autres pas alors que des renseignements peuvent être données. Prenons l'exemple de la boîte "Format/Mise en forme conditionnelle" (xlDialogConditionalFormatting): d'après la liste de référence, aucun paramètre n'est accepté. Pourtant, voyons la boîte :

Utilisation du SendKeys

Afin de pallier à cette insuffisance, la méthode SendKeys est valable. Je rappelle que SendKeys envoie purement et simplement des touches du clavier via VBA.

Exemple :

Sub FormatConditionnel()
  SendKeys ("{TAB}{TAB}2{TAB}7")
  Application.Dialogs(xlDialogConditionalFormatting).Show
End Sub

Affiche la boîte comme ceci :

Problème du non-renvoi de valeur

Une autre lacune des boîtes de dialogues intégrées et leur incapacité à renvoyer une valeur. Par exemple, lors de l'appel à la boîte de dialogue "Fichier/Ouvrir", on pourrait s'attendre à récupérer le nom du fichier ouvert, de cette façon :

Sub FichierOuvrir()
  FichierAOuvrir = Application.Dialogs(xlDialogOpen).Show
  MsgBox FichierAOuvrir
End Sub

Mais il se contente de renvoyer VRAI...

Application.Dialogs permet donc uniquement d'appeler les boîtes de dialogues et éventuellement des les pré-remplir.

Sélectionner un fichier de manière très conviviale

Fort heureusement, dans la plupart des cas, nous n'avons pas besoin d'une valeur de retour. Mais dans le cas de la sélection d'un fichier, c'est important, car on ne veut pas forcément l'ouvrir, mais un autre traitement.

Application.GetOpenFilename

est l'instruction qu'il nous faut. Et le fichier sélectionné est renvoyé, comme ceci :

ATTENTION : Application.GetOpenFilename ne fonctionne apparemment pas dans Word. Si vous voulez l'utiliser dans Word, il faut écrire Excel.:Application.GetOpenFilename, en prenant soin d'avoir inclu la bibliothèque Excel avec Outils/Références : cocher "Microsoft Excel XX.X Object Library"

Sub ChoixFichier()
  FichierChoisi = Application.GetOpenFilename
  MsgBox FichierChoisi
End Sub

FichierChoisi contient le chemin suivi du nom du fichier (C:\Dossier\SousDossier\Fichier.ext)

Si on clique sur Annuler, FichierChoisi contient Faux (0)

GetOpenFileName est une méthode très puissante qui accepte de nombreux paramètres. Par exemple :

FichierChoisi = Application.GetOpenFilename("Poèmes textuels, *.txt")

Va afficher ceci (Filtre de tous les fichiers se terminant en .TXT et qu'on surnomme "Poèmes textuels") :

Voici un filtre plus élaboré :

Application.GetOpenFilename("Textes purs, *.txt,Fichiers office, *.xls;*.doc;*.ppt")

Va nous proposer soit la liste des textes purs .TXT - OU - Les fichiers Office, c'est à dire qui se terminent par DOC, PPT ou XLS

Cette petite variante donne la même chose, mais ce sont directement les fichiers office qui sont sélectionnés par défaut, car ils sont 2ème dans la liste des filtres :

Application.GetOpenFilename("Textes purs, *.txt,Fichiers office, *.xls;*.doc;*.ppt" , 2)

Cette variante affiche comme titre de la boîte de dialogue à la place de ouvrir : Tasse de café :

FichierChoisi = Application.GetOpenFilename("Textes purs, *.txt", , "Tasse de café")

Cette variante permet de sélectionner plusieurs fichiers à la fois :

FichierChoisi = Application.GetOpenFilename("Textes purs, *.txt", , , , True)

Attention toutefois avec cette méthode car tout à coup, il faudra récupérer les noms de nos fichiers dans un tableau, comme ceci :

Sub ChoixFichier()
  FichiersChoisis = Application.GetOpenFilename("Textes purs, *.txt", , , , True)
  For Ctr = 1 To UBound(FichiersChoisis)
    MsgBox FichiersChoisis(Ctr)
  Next

End Sub

GetSaveAsFilename

Il est possible d'appeler la méthode apparentée GetSaveAsFilename

FichierCible = Application.GetSaveAsFilename
MsgBox FichierCible

La défférence principale est que le nom de fichier peut ne pas exister.

La variante suivante propose le dossier D:\Atelier, et le nom de fichier truc.xls. Lorsqu'on essaie, il met truc.xls entre guillemets ("truc.xls"), mais lors de son affichage avec MsgBox, les guillements disparaissent... Troublant...

FichierCible = Application.GetSaveAsFilename("d:\atelier\truc.xls")
MsgBox FichierCible

---