Ce tutoriel explique comment trier la structure "Dictionnaire" (Dictionary
) dans VBA par clé et par valeur. Il s'agit de l'extension du tutoriel La structure "Dictionnaire" dans VBA qui explique la création et l'utilisation d'un Dictionnaire.
Le Dictionnaire en VBA sert à associer les paires de valeurs (clé/valeur) et de les garder facilement accessible dans la mémoire. Il est également possible d'importer ou exporter le Dictionnaire en tant que texte ou en tant que fichier Excel.
Pour cela, il est souhaitable (voir indispensable) de pouvoir trier les valeurs dans le Dictionnaire. Ici, vous trouverez les codes VBA qui vous offrent les deux possibilités: tri par clé ou par valeur.
Pour les débutants: imaginez le Dictionnaire VBA comme un vrai dictionnaire (par exemple) français/allemand. On peut dire que la Clé correspond aux mots en français et la Valeur correspond aux traduction en allemand des clés. Pour le tri, il est donc possible de trier le Dictionnaire par les mots en français (tri par Clé) tout comme par les traductions en allemand (tri par Valeur).
Le tri d'un Dictionnaire VBA: la théorie
L'Objet Dictionnaire (Dictionary
) ne peut pas être trié directement. Nous devons donc le trier par un détour vers un Objet qui peut être trié. Dans ce cas-ci, on va utiliser l'Objet Array
. Voici la procédure à suivre pour trier un Dictionnaire.
Procédure de tri: Pas à pas
- Création d'un Objet
Dictionary
(si on ne l'a pas encore) & son remplissage par des paires clé/valeur - Création d'une
Array
intermédiaire - On copie le contenu non-trié du
Dictionary
dans l'Array
- On trie l'
Array
(par clé ou par valeur, selon besoin) - On copie le contenu trié de l'
Array
dans leDictionary
d'origine nettoyé ou dans un nouveauDictionary
- On attribue au nouveau
Dictionary
son nom d'origine - Terminé: un Dictionnaire trié identique (nom, contenu) au Dictionnaire d'origine est à votre disposition et prêt à être utilisé
Microsoft Scripting Runtime
Pour rappel, les codes sources qui suivent utilisent l'Objet (Object
) de type Dictionnaire (Dictionary
) qui est disponible après l'activation de la Référence "Microsoft Scripting Runtime
". Cette référence est disponible dans chaque installation Excel mais il faut l'activer:
- dans VBE en anglais: Alt + F11 –> Tools –> References –> cocher "Microsoft Scripting Runtime"
- dans VBE en français: Alt + F11 –> Outils –> Références –> cocher "Microsoft Scripting Runtime"
Après la théorie, voici donc la pratique…
Le tri par Valeur d'un Dictionnaire VBA
Voici le code VBA de la fonction TrierDictionnaireParValeur
qui, comme son nom l'indique, tri le Dictionnaire par les valeurs. Cette fonction est tout à fait autonome. Elle peut être utilisée telle quelle dans n'importe quel projet. Elle utilise comme argument un objet de type Dictionary
( = votre dictionnaire) et retourne un autre objet Dictionary
(= le même dictionnaire mais trié).
Avantage principal: pour pouvoir l'utiliser, vous n'aurez pas besoin de modifier votre code VBA existant. Il suffit d'en faire "copier & coller" vers votre projet.
Le code est largement commenté pour une utilisation/apprentissage plus facile.
Public Function TrierDictionnaireParValeur(Dico As Dictionary) As Dictionary 'par Excel-Malin.com ( https://excel-malin.com ) 'Fonction VBA qui trie l'Object Dictionnary par valeur 'ce code nécessite que la référence "Microsoft Scripting Runtime" soit activée On Error GoTo ErreurTri 'définition des variables Dim ArrayTemporaire() As Variant Dim OrdreTemporaire1 As Variant Dim OrdreTemporaire2 As Variant Dim i As Long Dim j As Long 'Allocation de l'espace de mémoire pour un Array dynamique ReDim ArrayTemporaire(0 To Dico.Count - 1, 0 To 1) ' 1) Remplissage de l'Array avec les valeurs du Dictionnaire non-trié For i = 0 To Dico.Count - 1 ArrayTemporaire(i, 0) = Dico.Keys(i) ArrayTemporaire(i, 1) = Dico.Items(i) Next i ' 2) Tri de l'Array par Valeur For i = LBound(ArrayTemporaire, 1) To UBound(ArrayTemporaire, 1) - 1 For j = i + 1 To UBound(ArrayTemporaire, 1) If ArrayTemporaire(i, 1) > ArrayTemporaire(j, 1) Then OrdreTemporaire1 = ArrayTemporaire(j, 0) OrdreTemporaire2 = ArrayTemporaire(j, 1) ArrayTemporaire(j, 0) = ArrayTemporaire(i, 0) ArrayTemporaire(j, 1) = ArrayTemporaire(i, 1) ArrayTemporaire(i, 0) = OrdreTemporaire1 ArrayTemporaire(i, 1) = OrdreTemporaire2 End If Next j Next i ' 3) Nettoyage du Dictionnaire d'origine Dico.RemoveAll ' 4) Ajout des valeurs triées dans le Dictionnaire (à partir de l'Array créé précédemment) For i = LBound(ArrayTemporaire, 1) To UBound(ArrayTemporaire, 1) Dico.Add Key:=ArrayTemporaire(i, 0), Item:=ArrayTemporaire(i, 1) Next i ' 5) renvoi du Dictionnaire trié Set TrierDictionnaireParValeur = Dico Exit Function ErreurTri: Set TrierDictionnaireParValeur = Nothing End Function
Le tri par Clé d'un Dictionnaire VBA
Tout comme pour la fonction précédente, TrierDictionnaireParCle
est une fonction autonome qui utilise comme input un objet Dictionary
et retourne un Dictionary
trié. Elle est également utilisable directement.
Public Function TrierDictionnaireParCle(Dico As Dictionary) As Dictionary 'par Excel-Malin.com ( https://excel-malin.com ) 'Fonction VBA qui trie l'Object Dictionnary par clé 'ce code nécessite que la référence "Microsoft Scripting Runtime" soit activée On Error GoTo ErreurTri 'définition des variables 'Dim Dict As Scripting.Dictionary Dim DicoTemporaire As Scripting.Dictionary Dim PaireTemporaire As Variant Dim ArrayTemporaire() As Variant Dim OrdreTemporaire As Variant 'Dim Txt As String Dim i As Long Dim j As Long 'Allocation de l'espace de mémoire pour un Array dynamique ReDim ArrayTemporaire(0 To Dico.Count - 1) ' 1) Remplissage de l'Array avec les valeurs du Dictionnaire non-trié For i = 0 To Dico.Count - 1 ArrayTemporaire(i) = Dico.Keys(i) Next i ' 2) Tri de l'Array For i = LBound(ArrayTemporaire) To UBound(ArrayTemporaire) - 1 For j = i + 1 To UBound(ArrayTemporaire) If ArrayTemporaire(i) > ArrayTemporaire(j) Then OrdreTemporaire = ArrayTemporaire(j) ArrayTemporaire(j) = ArrayTemporaire(i) ArrayTemporaire(i) = OrdreTemporaire End If Next j Next i ' 3) Création d'un nouveau Dictionnaire (Temporaire) Set DicoTemporaire = New Dictionary ' 4) Ajout des valeurs triées dans le Dictionnaire temporaire(à partir de l'Array créé précédemment) For i = LBound(ArrayTemporaire) To UBound(ArrayTemporaire) PaireTemporaire = ArrayTemporaire(i) DicoTemporaire.Add Key:=PaireTemporaire, Item:=Dico.Item(PaireTemporaire) Next i ' 5) Renvoi du Dictionnaire trié Set TrierDictionnaireParCle = DicoTemporaire Exit Function ErreurTri: Set TrierDictionnaireParCle = Nothing End Function
Exemple d'utilisation de Tri de Dictionnaire en VBA
Maintenant que nous avons les deux fonctions de tri, nous pouvons les appliquer dans un exemple. Dans la procédure suivante, nous allons créer un Dictionnaire (exemple: dictionnaire français/allemand) et le remplir avec les données non-triées. Ensuite, nous allons le trier avec une des fonctions de tri (par Clé ou Valeur) et afficher le résultat dans un MessageBox
.
Pour le choix de méthode de tri, il suffit de mettre en commentaire une des deux lignes qui appellent les fonctions: dans le code, il s'agit des lignes 34 et 35. Enlevez de commentaire celle que vous voulez appliquer et mettez en commentaire celle que vous ne voulez pas utiliser. Ensuite, vous pourrez faire le contraire pour tester l'autre méthode.
Rappel: n'oubliez pas de "copier & coller" dans votre projet également le code des deux fonction (en plus de code de l'exemple qui suit) et activer la Référence "Microsoft Scripting Runtime
" si ce n'est pas déjà fait.
Sub ExempleTriDictionnaire() 'par Excel-Malin.com ( https://excel-malin.com ) 'Procédure VBA qui montre l'utilisation du tri de l'Object Dictionnary par Clé et par Valeur 'ce code nécessite que la référence "Microsoft Scripting Runtime" soit activée On Error GoTo TestErreur 'Déclaration des variables Dim Dico As Scripting.Dictionary Dim TempDict As Scripting.Dictionary Dim MonTempDict As Scripting.Dictionary Dim i As Long Dim j As Long Dim MessageAvecResultat As String ' 1) Création d'un nouveau Dictionnaire Set Dico = New Dictionary ' 2) Choix de méthode de comparaison --> comparaison textuelle Dico.CompareMode = TextCompare ' 3) Ajout des valeurs dans le Dictionnaire (en "désordre") Dico.Add "Bonjour", "Guten Tag" Dico.Add "Au revoir", "Auf Viedersehen" Dico.Add "Voiture", "Wagen" Dico.Add "Merci", "Danke" Dico.Add "Un", "Ein" Dico.Add "Deux", "Zwei" ' 4) Appel de la fonction qui trie le Dictionnaire (choisissez le type de tri que vous souhaitez) '= mettez en commentaire une des deux lignes suivantes (elle ne sera pas exécutée) 'Set MonTempDict = TrierDictionnaireParCle(Dico) ' <-- trie par Clé Set MonTempDict = TrierDictionnaireParValeur(Dico) '<-- trie par Valeur ' 5) Appliquer le tri au Dictionnaire Set Dico = MonTempDict ' 6) Affiche un message avec le résultat = le Dictionnaire trié (Facultatif - dans le cadre de la démo) For i = 0 To Dico.Count - 1 MessageAvecResultat = MessageAvecResultat & Dico.Keys(i) & vbTab & " : " & vbTab & Dico.Items(i) & Chr(13) Next i MsgBox MessageAvecResultat, vbInformation Exit Sub TestErreur: MsgBox "Une erreur est survenue..." End Sub
Voici donc un exemple de tri avec des fonctions que je vous propose. Comme vous pouvez constater, leur utilisation en soi n'est pas difficile. Vous pourrez donc les intégrer facilement à votre code/projet.
Conclusion
Maintenant que vous pouvez non seulement réer un Dictionnaire mais également le trier – et cela dans les deux sens. Il s'agit d'une fonctionnalité fort pratique qui a de nombreuses applications possibles.
Si vous avez trouvé ce tutoriel utile, n'hésitez pas à le partager et à revenir sur Excel-Malin.com pour en apprendre encore plus sur Excel et VBA.
Vous avez trouvé un cas pratique intéressant d'utilisation de la structure "Dictionnaire" (Dictionary
)? N'hésitez pas à nous en faire part dans les commentaires. Cela pourra inspirer d'autres visiteurs/utilisateurs d'Excel…
Besoin d'un développement sur mesure en Excel ou/et en VBA? Contactez-nous par email ou via le formulaire de contact. Nous allons analyser vos besoin et vous proposer une solution.
Nous proposons également de la consultance dans les domaines de VBA, Excel, analyse de projets ou gestion de données… Nos services sont disponibles aux entreprises tout comme aux particuliers.