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 de tri: tri par clé ou tri 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).
Sommaire
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 d'un Dictionnaire: 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é
Utilisation du 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, trie 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
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 pratique 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
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 |
C'était 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 vous pouvez non seulement cré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.
Pour aller plus loin en VBA…
Et pour terminer, voici une liste des articles qui pourraient vous être utiles dans votre travail en VBA…
- Dictionnaire VBA – utilisation avancée (suite de ce tutoriel)
- Utilisation directe des fonctions Excel en VBA (tel que RECHERCHEV)
- Gestion des fichiers en VBA (copie, suppression,…)
- Liste de toutes les fonctions disponibles en VBA
- Comment fonctionnent les dates et les mesures de temps en VBA?
- Débloquer VBA dans les fichiers en provenance d'emails et d'internet
Et n'oubliez pas de consulter la section Téléchargements de Excel-Malin.com pour voir ce qui est possible de créer avec Excel et VBA!
2 commentaires sur “Trier le Dictionnaire dans VBA (par clé et par valeur)”
onVOUS REMERCIE BEAUCOUP LE CONTENU EST TRES TRES INTERESSANT.
S'IL VOUS PLAIT EST CE QU'ON PEUT AVOIR UNE COPIE DE CES DEUX TUTORIELS :
Trier le Dictionnaire dans VBA (par clé et par valeur);
La structure dictionnaire dans vba
Bonjour Zahia,
ces tutoriels sont publiques donc pour une utilisation non commerciale, vous pouvez simplement les copier à partir de mon site.
Et si en les utilisant, vous faites une référence à mon site, cela fera plaisir…
Bien à vous, Martin