Dictionnaire Imbrique

Kzawi77 Messages postés 7 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
Hello a tous et a toute ,

J'esperes que la communaute pourra m'aider, en effet c'est mon tout 1er post
Je suis en plein developpement d'un outil, et j'aimerai imbrique 3 voir 4 dico cependant je bloque!
je sais comment en imbrique 2 mais au dela cela devient un peu plus complexe.
ci dessous vous trouverez mon code :

Function LoadDicMultiple(Rge As Range) As Dictionary


Dim dico As New Dictionary
Dim dico2 As New Dictionary
Dim Dico3 As New Dictionary
Dim Dico4 As New Dictionary


Dim cel As Range


For Each cel In Range(Rge.Offset(1), Rge.Offset(1).End(xlDown))

    key1 = cel.Offset(, 6).Value
    key2 = cel.Offset(, 8).Value
    key3 = cel.Offset(, 1).Value
    key4 = cel.Offset(, 4).Value
    
    
        If Not dico.Exists(key1) Then
        
            dico.Add key1, New Dictionary
            Call dico(key1).Add(key2, dico2)
            Call dico2(key2).Add(key3, key4)
            Call Dico3(key3).Add(key4, cel.Offset(, 2).Value)
            
        Else
        
        If Not dico.item(key1).Exists(key2) Then dico.item(key1).Add key2, key3


'* je pense aussi avoir besoin d'aide pour cette partie la

        End If
    
Next cel


Set LoadDicMultiple = dico

Set dico = Nothing
Set dico2 = Nothing
Set Dico3 = Nothing
Set Dico4 = Nothing

End Function


Merci D'Avance

2 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    tu ne nous expliques pas quelle aide tu espères recevoir.
    tu ne nous expliques pas si ton code fait ce que tu souhaites.
    tu ne nous expliques pas ce que tu souhaites que ton code fasse.
    tu ne nous expliques pas pourquoi tu fais cet outil.
    n'imagine pas que nous pourrons deviner tout cela à partir de ton code.
    0
  2. Kzawi77 Messages postés 7 Statut Membre
     
    Hello yg_be,

    Desole c'est mon tout 1er poste , merci je vais essaye de repondre a tes questions.

    J''ai un soucis au niveau du 3 et 4 eme dico j'arrive a imbrique un dico dans un dico mais pas ( dico de dico de dico de dico ).

    Du coup mon code bloque au niveau de cette ligne

    Call dico2(key2).Add(key3, key4)

    Mon code est censer parcourir une feuille excel avec plusieurs colonnes ou je m'interesse a 4 calonnes en particulier et remplir mes different dico de dico anfin d'avoir qu'une seul valeur et non des doublons et de concatener les valeurs qui font parti des Items.

    je peux le faire avec un tableau mais pour evite les doublons je dois utilise des conditions ce qui ralentie conciderablement le temps d'execution tout en sachant que il doit tourner sur 3 onglet et sur plus de 100 fichier et avec dans chaque onglet +100 000 lignes.

    Voila j'espere que c'est peu etre un peu plus claire n'hesite pas a me faire des remarque ou me poser des questions si besoin.

    Merci d'avance a tous.
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      tu donnes une ligne de code qui ne fonctionne pas, et tu ne dis pas ce que tu souhaites qu'elle fasse.
      tu écris que ton code bloque: cela donne-t'il un message d'erreur?

      je suggère d'oublier un moment la programmation et surtout les dictionnaires: explique ce que tu veux réaliser.

      je pense que ton code, comme il est, n'a pas de sens. cependant, si tu veux simplement éviter le message d'erreur et clarifier le code:
      Private Function LoadDicMultiple(Rge As Range) As Dictionary
      
      Dim dico As New Dictionary
      Dim dico2 As New Dictionary
      Dim Dico3 As New Dictionary
      Dim Dico4 As New Dictionary
      Dim ndico As New Dictionary
      Dim key1, key2, key3, key4
      Dim cel As Range
      
      For Each cel In Range(Rge.Offset(1), Rge.Offset(1).End(xlDown))
          key1 = cel.Offset(, 0).Value
          key2 = cel.Offset(, 1).Value
          key3 = cel.Offset(, 2).Value
          key4 = cel.Offset(, 3).Value
              If Not dico.Exists(key1) Then
                  Set ndico = New Dictionary
                  Call dico.Add(key1, ndico)
                  Call ndico.Add(key2, dico2)
                  Call dico2.Add(key3, Dico3)
                  Call Dico3.Add(key4, cel.Offset(, 2).Value)
              Else
              If Not dico.Item(key1).Exists(key2) Then
                  dico.Item(key1).Add key2, key3
              End If
          End If
      Next cel
      Set LoadDicMultiple = dico
      Set dico = Nothing
      Set dico2 = Nothing
      Set Dico3 = Nothing
      Set Dico4 = Nothing
      End Function
      
      0
    2. Kzawi77 Messages postés 7 Statut Membre
       
      J'ai un fichier avec plusieurs colonnes :

      Colonne 1 : des dates
      Colonne 2 : ID1
      colonne 3: ID2
      colonne 4: Nominal



      je souhaite Remplir mon Dico avec les dates qui seront des clefs avec les ID1 qui seront aussi des clefs , les ID2 aussi des clefs puis les Nominaux qui doivent s'additioner si L'ID2 et le meme.

      je sais pas si cela est plus claire pour toi , sachant que je veux faire ca sur plusieurs fichier ou il y a 3 onglets a chaque fois et ou il ya plus de 100K lines par onglets.

      je le fais deja avec un tableau mais cela me prends une eternite car chaque fichier fait 150mb un peu pres.
      0
    3. Kzawi77 Messages postés 7 Statut Membre
       
      je rajouterai qu'ils sont dependant , dans le sens ou ID1 peu apparaitre plusieurs fois dont l'interet d'avoir une seul fois et l'ID2 correspondant peu lui aussi etre different ou le meme
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Kzawi77 Messages postés 7 Statut Membre
       
      si je comprends bien, tu veux retrouver la somme des nominaux par combinaison (date, ID1, ID2).
      et tu as choisi de réaliser cela avec une hiérarchie de dictionnaires.
      ai-je bien compris?
      si oui, suggestion:
      Private Function LoadDicMultiple(Rge As Range) As Dictionary
      
      Dim dicodate As New Dictionary
      Dim dicoidun As Dictionary
      Dim dicoiddeux As Dictionary
      Dim keydate, keyid1, keyid2, nominal
      Dim cel As Range
      
      For Each cel In Range(Rge.Offset(1), Rge.Offset(1).End(xlDown))
          keydate = cel.Offset(, 0).Value
          keyid1 = cel.Offset(, 1).Value
          keyid2 = cel.Offset(, 2).Value
          nominal = cel.Offset(, 3).Value
              If Not dicodate.Exists(keydate) Then
                  Set dicoidun = New Dictionary
                  Call dicodate.Add(keydate, dicoidun)
                  Set dicoiddeux = New Dictionary
                  Call dicoidun.Add(keyid1, dicoiddeux)
                  Call dicoiddeux.Add(keyid2, nominal)
              Else
                  Set dicoidun = dicodate(keydate)
                  If Not dicoidun.Exists(keyid1) Then
                      Set dicoiddeux = New Dictionary
                      Call dicoidun.Add(keyid1, dicoiddeux)
                      Call dicoiddeux.Add(keyid2, nominal)
                  Else
                      Set dicoiddeux = dicoidun(keyid1)
                      If Not dicoiddeux.Exists(keyid2) Then
                          Call dicoiddeux.Add(keyid2, nominal)
                      Else
                          dicoiddeux(keyid2) = dicoiddeux(keyid2) + nominal
                      End If
                  End If
          End If
      Next cel
      Set LoadDicMultiple = dicodate
      End Function
      
      0
    5. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Kzawi77 Messages postés 7 Statut Membre
       
      il faudrait probablement que tu donnes des exemples.
      0