XL 2019 Boucle sur plusieurs dico

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour,,
j'ai plusieurs Dico dont je récupère les items sans doublon et j'aimerais récupérer les valeurs sur chacul des Dico à partir d'une boucle K.
Du genre :
For K = 1 to 5
For Each D In Dico & " K".Items

Mais je ne sais pas si c'est possible.
Bonne journée
 
Solution
Bonsoir,
j'ai bien vérifié et au vu du classeur que tu as fournis je ne vois pas d'erreur!
VB:
Private Sub CommandButton1_Click()
Dim Cell As Range, CANum As String, K(), CA As Integer, CB As Integer

Dim Dico As Object
Set Dico = CreateObject("Scripting.Dictionary")
For CA = 1 To 5
    Set Dico("CA" & CA) = CreateObject("System.Collections.SortedList")
Next

For Each Cell In Sheets("BDD").Range("A1").CurrentRegion
    If Cell.Value <> "" And Cell.Row > 1 Then
        CANum = Trim(Split(Cell & "-", "-")(0))
        APSAS = Trim(Split(Cell & "-", "-")(1))
        If Dico.exists(CANum) Then Dico(CANum)(APSAS) = Dico(CANum)(APSAS) + 1
    End If
Next

K = Dico.keys
With Sheets("résultats")
    .UsedRange.Delete
    For CA = 0 To UBound(K)...

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour Mapomme, Dranreb,
Merci pour vos propositions.
J'ai testé en premier la proposition de Dranreb qui semble mieux s'intégrer à mon projet.
J'ai un messaged'erreur suivant :
1721581494857.png

J'ai bien mis : Dim TDico() As New Scripting.Dictionary
 

Pièces jointes

  • 1721581447068.png
    1721581447068.png
    29.2 KB · Affichages: 1

Dranreb

XLDnaute Barbatruc
Qu'est-ce que vous vouliez afficher par votre MsgBox ?
Essayez MsgBox D.Count par exemple.
Vous pouvez aussi ranger vos Dictionary dans une collection ou dans un autre Dictionary.
Info: ma classe SsGr est muni de deux propriétés: Id As Variant et Co as Collection
Ma fonction Gigogne renvoie une collection de ces objets à partir d'une ou plusieurs colonnes d'un tableau. Leur propriété Id étant les valeurs de la 1ère colonne spécifiée et leur propriété Co les collections de leurs contenus. Elle peuvent à leur tour contenir des SsGr si plusieurs colonnes sont spécifiées, sinon ce sont des tableaux dynamique d'une seule dimension contenant les valeurs de toutes les colonnes de chaque ligne attaché à cet Id. Le tout peut s'explorer très facilement par des bloc For Each SGrXY In … imbriqués. Joignez votre classeur si le point de départ de vos données est effectivement un tableau, et je vous y installerai mes modules de service pour ma fonction Gigogne.
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour carlos, mapomme, Bernard,

Voyez le fichier joint et cette macro :
VB:
Sub Test()
Dim tablo, ub1&, ub2%, TDico(), j%, i&, x$, a
tablo = [A1:C11]
ub1 = UBound(tablo)
ub2 = UBound(tablo, 2)
ReDim TDico(1 To ub2)
For j = 1 To ub2
    Set TDico(j) = CreateObject("Scripting.Dictionary")
    For i = 2 To ub1
        x = tablo(i, j)
        TDico(j)(x) = TDico(j)(x) + 1 'comptage
    Next i
    a = TDico(j).items
    For i = 0 To UBound(a)
        MsgBox a(i), , "TDico " & j
Next i, j
End Sub
A+
 

Pièces jointes

  • Dictionnaire.xlsm
    16 KB · Affichages: 7

carlos

XLDnaute Impliqué
Supporter XLD
Qu'est-ce que vous vouliez afficher par votre MsgBox ?
Essayez MsgBox D.Count par exemple.
Vous pouvez aussi ranger vos Dictionary dans une collection ou dans un autre Dictionary.
Info: ma classe SsGr est muni de deux propriétés: Id As Variant et Co as Collection
Ma fonction Gigogne renvoie une collection de ces objets à partir d'une ou plusieurs colonnes d'un tableau. Leur propriété Id étant les valeurs de la 1ère colonne spécifiée et leur propriété Co les collections de leurs contenus. Elle peuvent à leur tour contenir des SsGr si plusieurs colonnes sont spécifiées, sinon ce sont des tableaux dynamique d'une seule dimension contenant les valeurs de toutes les colonnes de chaque ligne attaché à cet Id. Le tout peut s'explorer très facilement par des bloc For Each SGrXY In … imbriqués. Joignez votre classeur si le point de départ de vos données est effectivement un tableau, et je vous y installerai mes modules de service pour ma fonction Gigogne.
Bonjuor Dranreb,
Je souhaitai afficher les items uniques retenus par TDico.
Bonne journée
 

Dranreb

XLDnaute Barbatruc
Bonjour
Je ne comprends pas ce que vous voulez dire. Un Dictionary peut garantir des clés uniques et des items correspondants. Mais un seul, pas une ribambelle !
Joignez un classeur montrant ce que vous avez et ce que vous voulez.
J'ai aussi un autre module de service n'utilisant pas d'objet qui peut produire une table d'éléments String classée et sans doublon accompagnée d'un table de listes de numéros des lignes d'où il sont tirés dans la colonne source.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Sinon pour sortir les liste d'items de tous les Dictionary contenus dans TDico cette structure devrait fonctionner :
VB:
For Each D In TDico
   For Each Itm In D.Items
      …
      Next Itm, D
Mais en amont pourquoi réinventer la poudre ? Ma fonction Gigogne construit justement une collection conçue pour être explorée par ce genre de code.
 

dysorthographie

XLDnaute Accro
Bonsoir,
VB:
Dim Dico As Object
Set Dico = CreateObject("Scripting.Dictionary")

Set Dico("1") = CreateObject("Scripting.Dictionary")
Set Dico("2") = CreateObject("Scripting.Dictionary")
Set Dico("3") = CreateObject("Scripting.Dictionary")
Set Dico("4") = CreateObject("Scripting.Dictionary")
Set Dico("5") = CreateObject("Scripting.Dictionary")

        For Each Cell In .Range("A2:A" & .Range("A65000").End(xlUp).Row)
        If Cell.Value = "" Then Exit For
        'regrouper tous les champs entre eux et en isolant les "CAx"
                For K = 1 To 3
                    CANum = Right(Left(.Cells(Cell.Row, .Range("APSA" & K).Column), 3), 1)
                    APSAS = Right(.Cells(Cell.Row, .Range("APSA" & K).Column), Len(.Cells(Cell.Row, .Range("APSA" & K).Column)) - 4)
                   If Not Dico(CANum).Exists(APSAS) Then Dico(CANum).Add APSAS, APSAS
                Next K
        Next Cell
 

Discussions similaires

Statistiques des forums

Discussions
315 091
Messages
2 116 114
Membres
112 663
dernier inscrit
Pauline243