🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Dictionary dans Excel — recherches, dédoublonnage et regroupement (6 exemples)

|

VBA Dictionary dans Excel — recherches, dédoublonnage et regroupement (6 exemples)

Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 05/06/2026

En bref — Un Dictionary stocke des paires clé → valeur et retrouve n'importe quelle valeur par sa clé instantanément — sans boucle. On le crée, on le remplit, on consulte :

Sub BasesDict()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    dict("AAPL") = 182.5          ' ajouter ou mettre à jour par clé
    dict("MSFT") = 410.2

    If dict.Exists("AAPL") Then    ' vérifier avant de lire
        MsgBox "AAPL = " & dict("AAPL")
    End If
End Sub

Là où un tableau vous oblige à parcourir chaque élément pour en trouver un, un Dictionary va droit au but. C'est pourquoi les analystes l'utilisent avant tout pour deux choses : supprimer les doublons et compter/regrouper. Les deux sont ci-dessous.

Pourquoi un Dictionary — et ce qu'est une clé

Une clé est une étiquette unique ; une valeur est ce que vous rangez dessous. Les clés doivent être uniques, donc le Dictionary est parfait dès que la question est « l'ai-je déjà vu ? » ou « combien de chaque ? ». La recherche par clé est en O(1) — quasi instantanée — quel que soit le nombre d'entrées.

Exemple 1 — Configuration : liaison tardive contre précoce

Il y a deux façons de créer un Dictionary, et les confondre provoque la redoutable erreur « Type défini par l'utilisateur non défini ».

' ── Liaison tardive (aucune configuration, marche partout) ──
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
' ── Liaison précoce (plus rapide + IntelliSense) ──
' D'abord : Outils ▸ Références ▸ cocher "Microsoft Scripting Runtime"
Dim dict As New Scripting.Dictionary

Laquelle choisir ? La liaison tardive pour du code que vous partagez (rien à configurer sur l'autre poste). La liaison précoce en développement, pour l'autocomplétion. Ce guide utilise la liaison tardive pour que chaque exemple tourne tel quel.

Exemple 2 — Ajouter, mettre à jour et l'astuce de « l'ajout silencieux »

Il y a deux façons d'insérer des données, et la différence compte :

dict.Add "AAPL", 182.5      ' explicite — ERREUR si "AAPL" existe déjà
dict("MSFT") = 410.2        ' affectation — ajoute si nouveau, met à jour sinon

Cette seconde forme est l'ajout silencieux : affecter une clé qui n'existe pas la crée. Elle n'échoue jamais sur les doublons, ce qui rend les deux motifs suivants si propres.

Exemple 3 — .Exists avant de lire (éviter les clés fantômes)

Lire une clé absente avec dict(key) la crée silencieusement (vide). Pour tester l'appartenance sans rien ajouter, utilisez toujours .Exists :

Dim sku As String
sku = Range("A2").Value

If dict.Exists(sku) Then
    Range("B2").Value = dict(sku)        ' sûr — la clé est bien là
Else
    Range("B2").Value = "introuvable"
End If

Exemple 4 — Construire une liste unique (dédoublonner en une passe) ⭐

La tâche classique : la colonne A a des milliers de lignes avec des répétitions ; vous voulez chaque valeur une fois. L'ajout silencieux fait fusionner les doublons automatiquement :

Sub ValeursUniques()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Dim cellule As Range
    For Each cellule In Range("A2:A10000")
        If cellule.Value <> "" Then dict(cellule.Value) = 1   ' les doublons s'écrasent, la liste reste unique
    Next cellule

    ' dict.Keys est désormais la liste dédoublonnée — l'écrire en colonne D :
    Range("D2").Resize(dict.Count).Value = Application.Transpose(dict.Keys)
    MsgBox dict.Count & " valeurs uniques"
End Sub

Pas de boucles imbriquées, pas de tri, pas de colonne d'appoint — et ça reste rapide sur 100 000 lignes.

Exemple 5 — Compter / regrouper (un décompte de fréquences) ⭐

Vous voulez « combien de commandes par région » ? Ajoutez un à la valeur chaque fois que vous voyez la clé. L'ajout silencieux démarre une clé absente à 0, donc le tout premier + 1 fonctionne :

Sub CompterParRegion()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Dim cellule As Range
    For Each cellule In Range("A2:A10000")           ' colonne A = Région
        dict(cellule.Value) = dict(cellule.Value) + 1  ' première vue : 0 + 1
    Next cellule

    ' Déverser le décompte dans les colonnes F:G
    Dim k As Variant, l As Long
    l = 2
    For Each k In dict.Keys
        Cells(l, 6).Value = k                        ' F = région
        Cells(l, 7).Value = dict(k)                  ' G = nombre
        l = l + 1
    Next k
End Sub

C'est l'équivalent d'un tableau croisé dynamique en 12 lignes — et vous contrôlez exactement ce qui se passe.

Exemple 6 — Parcourir clés et valeurs ensemble

.Keys et .Items renvoient chacun un tableau à base 0, alignés par position :

Dim keys As Variant, items As Variant, i As Long
keys = dict.Keys
items = dict.Items
For i = 0 To dict.Count - 1
    Debug.Print keys(i) & " => " & items(i)
Next i

Besoin de clés insensibles à la casse (pour que « AAPL » et « aapl » soient identiques) ? Réglez dict.CompareMode = vbTextCompare avant d'ajouter quoi que ce soit.

Dictionary contre Collection — lequel choisir

VBA propose aussi une Collection intégrée. Choisissez un Dictionary quand il vous faut un accès par clé ; une Collection suffit pour une simple liste ordonnée.

Besoin Dictionary Collection
Vérifier qu'une clé existe .Exists(key) aucun — piéger une erreur
Mettre à jour une valeur en place dict(key) = x retirer + ré-ajouter
Obtenir toutes les clés / valeurs .Keys / .Items indisponible
Compter les éléments .Count .Count
Configuration requise référence Scripting.Dictionary ou CreateObject intégrée, aucune

Erreurs fréquentes avec Dictionary (et la solution)

Symptôme Cause Solution
« Type défini par l'utilisateur non défini » As New Scripting.Dictionary sans la référence Ajouter la référence, ou liaison tardive CreateObject(...)
« Cette clé est déjà associée… » .Add sur une clé existante Utiliser dict(key) = value pour ajouter-ou-mettre-à-jour
Le test d'appartenance fait grossir le dict If dict(key) <> "" Then crée la clé Tester avec dict.Exists(key) à la place
Transpose des clés échoue / tronque Au-delà d'~65 536 clés, limite de Transpose Parcourir les clés et les écrire une à une
« aapl » et « AAPL » comptés séparément Comparaison de clés sensible à la casse par défaut Régler dict.CompareMode = vbTextCompare avant d'ajouter

Sautez la liaison et la tuyauterie — demandez juste le résultat

Les Dictionaries sont l'outil idéal pour dédoublonner et regrouper — mais liaison précoce/tardive, garde-fous .Exists et limites de Transpose font beaucoup de cérémonie pour « donne-moi les régions uniques et leur nombre ». ExcelMaster Agent vous laisse dire exactement cela en français courant — « liste chaque région unique de la colonne A et son nombre de lignes » — et construit le dictionnaire, le garde-fou et la sortie pour vous. Essayer gratuitement →

Guides associés

FAQ

Qu'est-ce qu'un Dictionary en VBA ? Un Dictionary (Scripting.Dictionary) stocke des paires clé → valeur et récupère n'importe quelle valeur par sa clé instantanément, sans boucle. Les clés sont uniques, ce qui le rend idéal pour dédoublonner et pour compter ou regrouper.

Comment créer un Dictionary en Excel VBA ? La liaison tardive ne demande aucune configuration : Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary"). Pour la liaison précoce et IntelliSense, cochez Microsoft Scripting Runtime dans Outils ▸ Références, puis Dim dict As New Scripting.Dictionary.

Quelle différence entre un Dictionary et une Collection en VBA ? Un Dictionary a .Exists, permet de mettre à jour les valeurs en place et expose .Keys/.Items. Une Collection est une simple liste ordonnée intégrée, sans test d'existence de clé ni lecture des clés. Utilisez un Dictionary dès qu'il vous faut des recherches par clé.

Comment vérifier qu'une clé existe dans un Dictionary VBA ? Utilisez dict.Exists(key), qui renvoie True/False sans modifier le dictionnaire. Évitez If dict(key)…, car lire une clé absente la crée silencieusement.

Comment obtenir une liste unique avec un Dictionary VBA ? Parcourez la plage source et affectez dict(cellule.Value) = 1. Les clés en double s'écrasent, donc dict.Keys devient la liste dédoublonnée — réécrivez-la ensuite avec Range("D2").Resize(dict.Count).Value = Application.Transpose(dict.Keys).