Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
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,
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).

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,

@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:
Réactions: cp4

fronck

XLDnaute Junior
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:
 

Pièces jointes

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

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…