Trier le Dictionnaire dans VBA (par clé et par valeur)


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

  1. Création d'un Objet Dictionary (si on ne l'a pas encore) & son remplissage par des paires clé/valeur
  2. Création d'une Array intermédiaire
  3. On copie le contenu non-trié du Dictionary dans l'Array
  4. On trie l'Array (par clé ou par valeur, selon besoin)
  5. On copie le contenu trié de l'Array dans le Dictionary d'origine nettoyé ou dans un nouveau Dictionary
  6. On attribue au nouveau Dictionary son nom d'origine
  7. 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"

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 ( http://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 ( http://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 ( http://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…

icon-alert-greenBesoin 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.

 

24 0

Pourrait vous intéresser

Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée.