Microsoft 365 Créer un dictionnaire sans doublon

Goufra

XLDnaute Occasionnel
Bonjour à tous,

je suis l’hérétique de service, J’ai créé un dictionnaire avec doublons !
Je souhaite à partir de ce dictionnaire créer un dictionnaire sans doublon

C’est pour le fun je sais le créer à partir d’une plage

Donc voici le code qui ne fonctionne pas


Sub nefonctionnepas() '
For Each c In DavecDoublons.Keys

DsansDoublon(c.Value) = ""

MsgBox c

Next c
End Sub

pièce jointe

C’est surtout pour faire marcher ma boîte à malices et éviter qu’elle ne se grippe ! Et je cherche à comprendre le fonctionnement d'un dictionnaire.
Avec mes sincères remerciements anticipés .
Goufra
 

Pièces jointes

  • 0000 Goufra.xlsm
    31.2 KB · Affichages: 20

mapomme

XLDnaute Barbatruc
Supporter XLD
Ce qui me trouble:
j'obtiens un dictionnaire sans avoir eu besoin de mettre " if not Dsansdoublon exists"
Parfois je suis obligé de mentionner en début de code on error resume next, pour continuer.
Je suis vraiment navré de mon niveau d'incompréhension
Je vous ai expliqué que :

dic.add "toto", 123 aboutit à une erreur si la clef "toto" existe déjà.

dic("toto")=123 n'aboutit pas une erreur puisque si la clef existe déjà on modifie la valeur de l'item associé à la clef existante par 123. Et si la clef n'existe pas alors on crée la clef "toto" puis on y associe l'item 123.

La méthode add aboutit toujours à une erreur si la clef existe déjà.
 

patricktoulon

XLDnaute Barbatruc
bonjour
depuis le début je l'ai expliqué
la méthode ".exists avec ADD sert uniquement si tu compte te servir
des clés ET!!! item(unique les items!!!!)
exemple
sans méthode exists et sans Add
for i= 1 to 50
dico("toto")=i
next

ici à la fin il n'y aura qu'un seul "toto" avec la valeur"50" pour son item

maintenant avec méthode ".exists"ET SANS METHODE ADD!!! mais ajout anonyme
for i= 1 to 50
if not dico.exists("toto") then dico("toto")=i
next

ici il y aura toujours qu'un seul toto mais sa valeur sera "1"
donc selon moi pour un débutant
ce qu'il faut bien comprendre
1°le principe de clé/item
2° la méthode non décrémentable du dico (ajout sans ".Add"
3° la méthode ".exists"
au final il dépendra de la maitrise de ces 3 points et de la compréhension du contexte du besoins
avant même de coder la macro
capiché ;)
quand on comprends ces 3 points c'est un jeu d'enfant
de coder une macro ou fonction avec cet object "Scripting.dictionary"
 

fronck

XLDnaute Junior
Bonjour
le fonctionnement d'un dictionnaire est on ne peut plus simple
un dictionnaire a des clés et des items (valeur : numerique,string ou même object)

quand on ajoute un element dans le dictionnaire on le fait par sa clé
exemple
dictionnaire("toto")="ce que tu veux"

maintenant si je fait
dictionnaire("toto")="autre chose"

en fait ici on a changé la valeur de l'item du dictionnaire pas sa clé il n'y a donc toujours q'une seule clé ce qui veux dire pas de doublons


le dictionnaire a des méthode comme par exemple la fonction exists
if not dictionnaire.exists("toto") then dictionnaire("toto")="trucbidule"
a
vec cette méthode cela permet de ne plus y toucher dans une boucle par exemple

oserais-je dire qu'il existe deux autres objects plus ancien mais encore fonctionels dans windows
l'object (arraylist)
et
l'object("sortedlist")

qui ont d'autre fonctions et méthode intégrées tel que le tri dans un ordre ainsi que le deplacement dans la hiérachie etc..etc..

pour le dictionnaire
on peut le transformer par la suite en deux array distincts et exploitables
macolonneclé=application.transpose(dictionnaire.keys)
macolonnevaleur=application.transpose(dictionnaire.items)
ces deux variable sont des array contenant les valeurs et clé (sans doublons bien sur )

pour en apprendre un peu plus et mettre tout cela en pratique je te renvoie vers une page de notre regretté Jacques Boisgontier

je pense qu'il y a suffisamment d'exemples et mise en pratique pour maitriser ou apprendre à maitriser le dictionnaire

l'object dictionnaire de Jacques Boisgontier

je t'invite aussi a faire des recherche sur l'object "Collection" natif dans vba
qui peut apporter une solution simple au problème doublons

Bonne lecture ;)
Bonjour,
le fonctionnement d'un dictionnaire est on ne peut plus simple
un dictionnaire a des clés et des items (valeur : numerique,string ou même object)

quand on ajoute un element dans le dictionnaire on le fait par sa clé
exemple
dictionnaire("toto")="ce que tu veux"

maintenant si je fait
dictionnaire("toto")="autre chose"

en fait ici on a changé la valeur de l'item du dictionnaire pas sa clé il n'y a donc toujours q'une seule clé ce qui veux dire pas de doublons
Merci pour la tentative d'explication, mais je comprends toujours pas. Sur Excel-pratique Sébastien fait de meilleures démonstrations, sauf qu'il n'y a rien sur le dictionnaire.
Le blog de J Boisgontier c'est aussi pour les experts, et un tuto serait bienvenu.
Moi pour sortir les doublons je fais par exemple des doubles boucles, comme dans ce fichier sur les présents
par rapports aux absents (macro sur feuille planning).
1681284964937.png

VB:
'Présents selon absents
        drn4 = ws1.Range("A1000").End(xlUp).Row
        ws1.Range("A" & drn4 + 2).Value = "PRESENTS"
        ws1.Range("A" & drn4 + 2).Font.Bold = True
        drn1 = drn4 + 2
        x = drn4 + 3
        For j = 2 To drn2
            pres = ws2.Range("A" & j).Value
            For i = 3 To drn1
                If ws2.Range("A" & j).Value <> ws1.Range("A" & i).Value Then
                    cpt = cpt + 1
                End If
            Next i
         If cpt = drn1 - 2 Then
            ws1.Range("A" & x).Value = pres
            x = x + 1
         End If
            cpt = 0
       Next j
    'couleur  verte
        ws1.Range("A" & drn4 + 2 & ":V" & drn4 + 2).Interior.ColorIndex = 4
        drn1 = ws1.Range("A1000").End(xlUp).Row
Cdt
 

Pièces jointes

  • Chantier V agenda 5 jours.xlsm
    481.2 KB · Affichages: 1

cp4

XLDnaute Barbatruc
Bonjour,

Merci pour la tentative d'explication, mais je comprends toujours pas. Sur Excel-pratique Sébastien fait de meilleures démonstrations, sauf qu'il n'y a rien sur le dictionnaire.
Le blog de J Boisgontier c'est aussi pour les experts, et un tuto serait bienvenu.
Moi pour sortir les doublons je fais par exemple des doubles boucles, comme dans ce fichier sur les présents
par rapports aux absents (macro sur feuille planning).
Regarde la pièce jointe 1168081
VB:
'Présents selon absents
        drn4 = ws1.Range("A1000").End(xlUp).Row
        ws1.Range("A" & drn4 + 2).Value = "PRESENTS"
        ws1.Range("A" & drn4 + 2).Font.Bold = True
        drn1 = drn4 + 2
        x = drn4 + 3
        For j = 2 To drn2
            pres = ws2.Range("A" & j).Value
            For i = 3 To drn1
                If ws2.Range("A" & j).Value <> ws1.Range("A" & i).Value Then
                    cpt = cpt + 1
                End If
            Next i
         If cpt = drn1 - 2 Then
            ws1.Range("A" & x).Value = pres
            x = x + 1
         End If
            cpt = 0
       Next j
    'couleur  verte
        ws1.Range("A" & drn4 + 2 & ":V" & drn4 + 2).Interior.ColorIndex = 4
        drn1 = ws1.Range("A1000").End(xlUp).Row
Cdt
Bonjour,

@fronck : ce lien pourrait mieux t'éclairer https://excelmacromastery.com/vba-dictionary/

Bonne journée.
 

Goufra

XLDnaute Occasionnel
Bonjour,
Merci pour l'adresse du site
Je suis d'accord avec Fronck il faudrait bien un tutoriel pour comprendre les exemples. On peut bien évidemment s'en servir sans comprendre.
Je reviens à mes moutons
For Each c In plage
DsansDoublon(c.Value) = ""
Next c
si la clef existe déjà on modifie la valeur de l'item associé à la clef existante par un vide.
Donc pas de doublon !
Oups cela va mieux en l'écrivant !!!!
Merci donc à ma pomme.

il semblerait que cette partie que j'ai abordée ait sauté.

Je vous remercie infiniment et navré si j'ai eu la comprenette difficile !
Bref un petit pas sur la lune ... un grand pas .....
Amicalement downloads
Bien cordialement
jc Goufra
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @fronck :) ,

(en attendant votre propre discussion... ;)), voici quelques notions pour une présentation du dictionary. La pratique, ce sera pour après.

Un dictionary est une structure qui comporte des clefs et à chaque clef on peut associer quelque chose (Item).
La particularité de la structure dictionary, c'est qu'elle n'autorise pas deux clefs identiques.

Un dictionary peut être vu comme une structure qui comporte une collection de paires. Chaque paire comporte une clef (différente des clefs de toutes les autres paires) et une valeur associée.

Donc si on considère une clef particulière au sein du dictionary alors on sait que cette clef est unique. On peut lire l'Item associé à cette clef ou bien redéfinir l'item pour cette clef.

Cette structure dictionary (qu'on nommera dic par la suite) est livrée avec des méthodes pouvant gérer les paires (clef, item) qui la composent.

Quelques méthodes ou fonctions :
Ajouter une paire (clef , Item) : dic.Add maclef, monItem
Supprimer la paire correspondant à une clef particulière : dic.Remove maClef
Supprimer toutes les paires du dictionary : dic.RemoveAll
Vérifier si une clef est dans le dictionary : if dic.Exists(cetteClef)

Pour accéder à l'item de la paire d'une clef particulière, on utilise dic(maclef) ou dic.items(maclef)
On peut accéder à un tableau contenant toutes les clefs par dic.keys
On peut accéder à un tableau contenant toutes les items par dic.items
Attention! Dans ce cas, les items du tableau des items correspondent (à l'emplacement du tableau des clefs).
Le premier Item du tableau correspond à la première clef du tableau des clefs, le deuxième Item du tableau des items correspond à la deuxième clef du tableau des clefs, etc.
Les tableaux des clefs ou Items sont des tableaux à une seule dimension et dont l'index commence à 0 et non à 1.
On utilise souvent ces tableaux pour transférer la liste des clefs et la liste de leur élément associé (à chaque clef) sur la feuille de calcul.

Il n'y a pas de tri dans un dictionary. On empile les paires (clef, item) au fur et à mesure qu'on les crée dans le dictionary.

Toutes les clef sont différentes. De base, les minuscules sont différentes de leur équivalent en majuscule.
"abc" et "aBc" sont deux clefs différentes. On peut donc ajouter une paire pour chaque clef : dic.add "abc", 123 et ensuite dic.add "aBc", 135.
Pour que le dictionary ne fasse pas la distinction entre les majuscules et les minuscules, on peut avant de commencer à remplir le dictionary définir la propriété : dic.CompareMode=TextCompare.
Après quoi, si on fait dic.add "abc", 123 et ensuite dic.add "aBc", 135, alors VBA va détecter une erreur sur dic.add "aBc", 135 en informant que la clef existe déjà!

Une autre propriété importante est de connaitre le nombre de paires présentes dans le dictionary (ou bien le nombre de clefs => c'est équivalent). Ce nombre est donné par dic.count.

Il existe deux ou trois autres méthodes mais qui sont très peu utilisées donc inutile de les voir ici.

Il est inutile de connaitre les mécanismes internes du dictionary. Savoir comment il se comporte (unicité de la clef, association d'une clef avec un item) et les outils pour le manipuler ou manipuler ses éléments sont suffisants pour l'utiliser.

Une autre caractéristique du dictionary est que son utilisation est très rapide.

Attention! Cette structure fait partie d'une bibliothèque Windows. Elle n'existe pas sous OS d'Apple.
 
Dernière édition:

fronck

XLDnaute Junior
Bonjour @fronck :) ,

(en attendant votre propre discussion... ;)), voici quelques notions pour une présentation du dictionary. La pratique, ce sera pour après.

Un dictionary est une structure qui comporte des clefs et à chaque clef on peut associer quelque chose (Item).
La particularité de la structure dictionary, c'est qu'elle n'autorise pas deux clefs identiques.

Un dictionary peut être vu comme une structure qui comporte une collection de paires. Chaque paire comporte une clef (différente des clefs de toutes les autres paires) et une valeur associée.

Donc si on considère une clef particulière au sein du dictionary alors on sait que cette clef est unique. On peut lire l'Item associé à cette clef ou bien redéfinir l'item pour cette clef.

Cette structure dictionary (qu'on nommera dic par la suite) est livrée avec des méthodes pouvant gérer les paires (clef, item) qui la composent.

Quelques méthodes ou fonctions :
Ajouter une paire (clef , Item) : dic.Add maclef, monItem
Supprimer la paire correspondant à une clef particulière : dic.Remove maClef
Supprimer toutes les paires du dictionary : dic.RemoveAll
Vérifier si une clef est dans le dictionary : if dic.Exists(cetteClef)

Pour accéder à l'item de la paire d'une clef particulière, on utilise dic(maclef) ou dic.items(maclef)
On peut accéder à un tableau contenant toutes les clefs par dic.keys
On peut accéder à un tableau contenant toutes les items par dic.items
Attention! Dans ce cas, les items du tableau des items correspondent (à l'emplacement du tableau des clefs).
Le premier Item du tableau correspond à la première clef du tableau des clefs, le deuxième Item du tableau des items correspond à la deuxième clef du tableau des clefs, etc.
Les tableaux des clefs ou Items sont des tableaux à une seule dimension et dont l'index commence à 0 et non à 1.
On utilise souvent ces tableaux pour transférer la liste des clefs et la liste de leur élément associé (à chaque clef) sur la feuille de calcul.

Il n'y a pas de tri dans un dictionary. On empile les paires (clef, item) au fur et à mesure qu'on les crée dans le dictionary.

Toutes les clef sont différentes. De base, les minuscules sont différentes de leur équivalent en majuscule.
"abc" et "aBc" sont deux clefs différentes. On peut donc ajouter une paire pour chaque clef : dic.add "abc", 123 et ensuite dic.add "aBc", 135.
Pour que le dictionary ne fasse pas la distinction entre les majuscules et les minuscules, on peut avant de commencer à remplir le dictionary définir la propriété : dic.CompareMode=TextCompare.
Après quoi, si on fait dic.add "abc", 123 et ensuite dic.add "aBc", 135, alors VBA va détecter une erreur sur dic.add "aBc", 135 en informant que la clef existe déjà!

Une autre propriété importante est de connaitre le nombre de paires présentes dans le dictionary (ou bien le nombre de clefs => c'est équivalent). Ce nombre est donné par dic.count.

Il existe deux ou trois autres méthodes mais qui sont très peu utilisées donc inutile de les voir ici.

Il est inutile de connaitre les mécanismes internes du dictionary. Savoir comment il se comporte (unicité de la clef, association d'une clef avec un item) et les outils pour le manipuler ou manipuler ses éléments sont suffisants pour l'utiliser.

Une autre caractéristique du dictionary est que son utilisation est très rapide.

Attention! Cette structure fait partie d'une bibliothèque Windows. Elle n'existe pas sous OS d'Apple.
Merci pour ce mal que tu te donnes, mais sans exemple, je vois toujours pas ce qu'est une clef.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @fronck,

Voici un exemple assez basique et commun d'utilisation d'un dictionary (prendre une liste et pour chaque nom (c'est la clef) qui apparait plusieurs fois dans la liste ne garder que le premier).

Le code (qui est commenté) est dans module1 pour la question n° 1. Je vous laisse faire pour les questions n°2 et n°3 par analogie.

Pour la question n°4, on y reviendra plus tard.

:)
 

Pièces jointes

  • fronck- dictionary- v1.xlsm
    205.1 KB · Affichages: 4
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonsoir
fronk si tu le comprends mieux comme ça
considère qu'une clef est l'identifiant d'un élément du dico l'item c'est sa valeur

VB:
Sub test()
Dim dicoDate As Object
Set dicoDate = CreateObject("scripting.dictionary")
dicoDate("mapomme") = Format(CDate("01/11/2011"), "dddd dd mm yyyy")
dicoDate("fronk") = Format(CDate("06/12/2019"), "dddd dd mm yyyy")
dicoDate("patrick") = Format(CDate("09/11/2010"), "dddd dd mm yyyy")

MsgBox " 'fronc' c'est inscrit sur XLD le :" & dicoDate("fronk")
End Sub
 

fronck

XLDnaute Junior
Merci mapomme, et Patrick.
Aprés ce bon exercice de mapomme, je dirais que les clefs sont les éléments qui restent de la liste de base.
Mais pour la 4eme question qui doit avoir les noms et prenoms en commun, çà bug
dans ma modif de code:
1681328572656.png
 

Pièces jointes

  • fronck- dictionary- v1.xlsm
    220.9 KB · Affichages: 5
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 206
Messages
2 086 221
Membres
103 158
dernier inscrit
laufin