Code exemple dictionnaire

Bonjour le forum,

Je cherche à comprendre le dictionnaire avec cet exemple et le code:

Sub Bouton1_Cliquer()
 Dim dercol%, dico, i%, plage, cpt%
  Set dico = CreateObject("Scripting.Dictionary")
   With Sheets("Feuil1")
    dercol = .Cells(2, Columns.Count).End(xlToLeft).Column
     plage = Application.Transpose(.Range(.Cells(2, 2), .Cells(2, dercol)))
       For i = LBound(plage) To UBound(plage)
        If Not dico.exists(plage(i, 1)) And plage(i, 1) <> "" Then
         cpt = cpt + 1: dico(plage(i, 1)) = ""
        End If
       Next i
      .Range("B4").CurrentRegion.ClearContents
     If cpt > 0 Then .Cells(4, 2).Resize(cpt, UBound(plage, 2)).Value = Application.Transpose(dico.keys)
   End With
End Sub

et surtout çà:

        If Not dico.exists(plage(i, 1)) And plage(i, 1) <> "" Then
         cpt = cpt + 1: dico(plage(i, 1)) = ""

Si je traduis

si l'enregistrement n'existe pas dans le dico, et que la cellule n'est pas vide, alors on incrémente le compteur et le dico prend rien ?

Merci de votre réponse.

3dictionnaire.xlsm (18.92 Ko)

Bonsoir fronck

un dictionnaire prend en paramètre une clé et une valeur, où chaque clé est unique.
Si vous voulez faire un "récap" de valeur unique sans prendre en compte les "vides" alors vous pouvez utilisez un Dico qui sera plus rapide sur le test "d'existence".

C'est ce que fait votre code, les données uniques correspondent aux clés du dictionnaire et comme dans ce cas précis les valeurs n'ont pas d'utilité alors le code y inscrit "rien".

Pour moi le Cpt ne sert à rien vu que l'on peut demander le nombre de clé d'un dictionnaire par Dico.Count.
En plus par structure, vu que le dico ne prend pas de clé en double, le test de "non existence" est superflue, me semble t-il. Il suffit de vouloir entrer la donnée dans le dico, si elle existe alors elle n'est pas inscrite.

Votre code modifié :

Sub Bouton1_Cliquer()
    Dim dercol%, dico, i%, plage
    Set dico = CreateObject("Scripting.Dictionary")
    With Sheets("Feuil1")
        dercol = .Cells(2, Columns.Count).End(xlToLeft).Column
        plage = Application.Transpose(.Range(.Cells(2, 2), .Cells(2, dercol)))
        For i = LBound(plage) To UBound(plage)
            If plage(i, 1) <> "" Then dico(plage(i, 1)) = ""
        Next i
        .Range("B4").CurrentRegion.ClearContents
        If dico.Count > 0 Then .Cells(4, 2).Resize(dico.Count, UBound(plage, 2)).Value = Application.Transpose(dico.keys)
    End With
End Sub

@ bientôt

LouReeD

Bonjour Lou Reed,

Merci pour tes explications.

Je m'étonne qu'on ne trouve pas de condition pour mettre les clés dans le dico.

Ensuite, j'arrive pas à mettre le résultat en 3ème colonne, avec un cas vertical sur un tirage au sort.

Cdt

6tas-petanque.xlsm (31.24 Ko)

bonjour LouReed, Fronck,

si le clef n'existe pas encore, on l'ajoute et s'il existe on écrase le précédent clef. Il y a des précautions à prendre concernant majuscules et miniscules mais aussi si on ajoute un chiffre en texte ou en valeur, alors cela seront 2 clefs.

Vous avez 69 joueurs, on peut créer 2.346 paires (69*68/2), avec 34 paires par round = en théorie 69 rounds.

Dans le PJ, j'ai exagéré, on fait 100 rounds en essayant d'avoir tous les paires mais à un certain moment, ce n'est plus possible d'avoir 34 paires par round, donc on arrête à ce moment. Il manque 2 paires des 2.346.

Colonne AA = la solution simple = liste de ces paires (il faut transponer le tableau !!!, vous ne l'avez pas fait dans votre macro)

Colonnes AC:AF = la solution plus complexe = on utilise aussi la partie "item", parce qu'on ajoute là un tableau avec le numéro du tour, le numéro du paire dans ce tour et les noms des 2 joueurs.

Pour vérification : en colonne AH, vos 69 joueurs complètement aleatoire après autant de manipulations.

En colonne AN:AO un TCD où on peut voir jusqu'à quel tour on a su tirer 34 paires sans problèmes. Vous voyez aussi qu'à partir du tour 60, cela commence à être difficile.

Moi, j'utilise ce lien https://excelmacromastery.com/vba-dictionary/

3tas-petanque.xlsm (146.10 Ko)

Bonjour,

Nativement un dico n'accepte pas de doublon au niveau des clés, donc si il y a un test avant d'entrer des données dans le dico mais c'est le dico lui même qui le fait sans affichage d'erreur.

Par contre pour la recherche d'une clé spécifique il y a bien Exists.

De mémoire le code ciblait la cellule B4, où B et désigné par 2, donc troisième colonne ce serait C donc 3. Mais je suis sur téléphone donc je n'ai pas ouvert le fichier.

@ bientôt

LouReeD

Hello ! BsAlv !

@ bientôt

LouReeD

Bonjour Bsalv, lou Reed, les pros

Merci pour la documentation et vos explications, plus une par mp, j'ai beaucoup à ...digérer.

J'ai réussit à faire fonctionné le 1er dico.

@Bsalv je vais faire plus simple, avec un ou plusieurs groupes qui fonctionne avec les multiples de 1,2,4,16, 32,64,128... et si le nombre est supérieur à ceux là, je ferais un tirage au sort des exclus.

La demande comporte des paires de joueurs déjà formées.

Ensuite comme les doublons éliminent environ 1/3 des équipes, je refais un tirage des équipes restantes.

Merci de votre aide en tout cas.

Rechercher des sujets similaires à "code exemple dictionnaire"