Scripting.Dictionary : plante car trop de donnees

Delux

XLDnaute Occasionnel
Bonjour a tous,

Maintenant que je maitrise un peu mieux le scripting.dictionary, je suis confronte a une erreur inattendue :/

En effet, la macro me supprime bien les doublons de ma liste, mais elle ne me renvoit pas la concatenation des items.
Je donne un exemple pour etre plus clair. J'ai une liste de 27000 TAGs (donnees alphanumeric) qui peuvent apparaitre plusieurs fois en colonne A.
En colonne B, les donnees pour un meme TAG peuvent etre differentes (ex: un client peu avoir plusieurs numeros de telephone)
Colonne A = Client (TAG) = dico.KEY
Colonne B = No de Tel = dico.item

Mon probleme est le suivant, arrive a la ligne 700 (environ), le dictionnaire plante. Je suppose que c'est a cause du nombre de donnees.
Pourtant il me semble avoir lu que le dictionnaire n'avait pas reellement de limitations...

Auriez-vous une solution/idee?

voici le code:
Code:
Sub ListeSansDoublons()
  Set mondico = CreateObject("Scripting.Dictionary")
  
  For Each c In Range("a2:a65000")
    If Not mondico.exists(c.Value) Then
     mondico(c.Value) = c.Offset(, 1).Value
    Else
     mondico(c.Value) = mondico(c.Value) & ";" & c.Offset(, 1).Value
    End If
  Next c
  a = mondico.Count
  [C2].Resize(a, 1) = Application.Transpose(mondico.keys)
  [D2].Resize(a, 1) = Application.Transpose(mondico.items)
  
  End Sub

En vous remerciant par avance.

Cordialement

Delux
 

Hervé

XLDnaute Barbatruc
Re : Scripting.Dictionary : plante car trop de donnees

salut:)

tu ne nous dit pas ou ça plante ^^

a mon avis c'est tes resizes qui plante, cette fonction, de mémoire, plante près des 5000 items.

tente de faire une boucle pour extraire tes donnes et regarde si ca plante.

a plus
 

Delux

XLDnaute Occasionnel
Re : Scripting.Dictionary : plante car trop de donnees

Salut,

Ca plante ici:
Code:
[D2].Resize(a, 1) = Application.Transpose(mondico.items)

En fait cela fonctionne pour 700 lignes qui peuvent se resumer sans doublons a 500 lignes mais avec les infos des 200 lignes supprimees ajoutees a la valeur unique

en resume:
a1 = b1
a2 = b2
a3 = b3
a1 = b4
a1 = b5
a4 = b6 ...
 

ROGER2327

XLDnaute Barbatruc
Re : Scripting.Dictionary : plante car trop de donnees

Bonjour à tous.


À défaut de support, une proposition pifométrique :​
VB:
Sub ListeSansDoublons()
Dim mondico, c, a
    Set mondico = CreateObject("Scripting.Dictionary")
    For Each c In Range("A2:A65000")
        If Not IsEmpty(c.Value) Then
            If Not mondico.exists(c.Value) Then
                mondico(c.Value) = c.Offset(, 1).Value
            Else
                mondico(c.Value) = mondico(c.Value) & ";" & c.Offset(, 1).Value
            End If
        End If
    Next c
    a = mondico.Count
    [C2].Resize(a, 1) = Application.Transpose(mondico.keys)
    [D2].Resize(a, 1) = Application.Transpose(mondico.items)
End Sub



ROGER2327
#6885


Vendredi 6 Haha 141 (Sainte Tourte, lyrique et Sainte Bévue, sociologique - fête Suprême Quarte)
20 Vendémiaire An CCXXII, 5,6360h - pressoir
2013-W41-5T13:31:35Z
 

ROGER2327

XLDnaute Barbatruc
Re : Scripting.Dictionary : plante car trop de donnees

Suite...


En plus, ça a l'air de fonctionner...​


ROGER2327
#6886


Vendredi 6 Haha 141 (Sainte Tourte, lyrique et Sainte Bévue, sociologique - fête Suprême Quarte)
20 Vendémiaire An CCXXII, 6,0146h - pressoir
2013-W41-5T14:26:06Z
 

Pièces jointes

  • SansDoublon.xls
    198.5 KB · Affichages: 76
  • SansDoublon.xls
    198.5 KB · Affichages: 79
  • SansDoublon.xls
    198.5 KB · Affichages: 79

Delux

XLDnaute Occasionnel
Re : Scripting.Dictionary : plante car trop de donnees

Bonjour a tous,

En fait j'ai trouve une solution detournee car la proposition si dessus ne fonctionne pas non plus :/.

Voici le code:
Code:
Sub ListeSansDoublons()

Dim mondico, c, a
    Set mondico = CreateObject("Scripting.Dictionary")
    For Each c In Sheet8.Range("A2:A65000")
        If Not IsEmpty(c.Value) Then
            If Not mondico.exists(c.Value) Then
                mondico(c.Value) = c.Offset(, 1).Value
            Else
                mondico(c.Value) = mondico(c.Value) & ";" & c.Offset(, 1).Value
            End If
        End If
    Next c
    
    Range("A2:b" & Range("a65000").End(xlUp).Row).ClearContents
    Range("A2:a65000").Interior.ColorIndex = xlNone
    
    a = mondico.Count
    [a2].Resize(a, 1) = Application.Transpose(mondico.keys)
        
    For Each c In Sheet8.Range("a2:a65000")
        If Not IsEmpty(c.Value) Then
            If mondico.exists(c.Value) Then
                c.Offset(0, 1).Value = mondico(c.Value)
            End If
        End If
    Next c

Set mondico = Nothing
End Sub

En vous remerciant tous par avance.

Coridalement,

Delux
 

ROGER2327

XLDnaute Barbatruc
Re : Scripting.Dictionary : plante car trop de donnees

Re...


(...) la proposition si dessus ne fonctionne pas non plus :/.

(...)
Si vous le dites...

(Expérience suggérée :
  1. Ouvrir le classeur proposé.
  2. Cliquer sur le bouton Essai.)



ROGER2327
#6928


Mercredi 18 Haha 141 (Nativité de Sa Magnificence le baron Mollet (St Pipe) - fête Suprême Quarte)
2 Brumaire An CCXXII, 4,0520h - céleri
2013-W43-3T09:43:29Z
 

Delux

XLDnaute Occasionnel
Re : Scripting.Dictionary : plante car trop de donnees

Re,

Effectivement dans votre cas cela fonctionne, mais adaptee a 25.000 lignes qui une fois les doublons supprimes ne font plus que 18000, avec parfois des des concatenations superieurs a 50.
Por cette raison, la memoire doit saturer rapidement et le transpose plante :/

Merci pour votre solution.

Cordialement,

Delux
 

ROGER2327

XLDnaute Barbatruc
Re : Scripting.Dictionary : plante car trop de donnees

Re...


Re,

Effectivement dans votre cas cela fonctionne, mais adaptee a 25.000 lignes qui une fois les doublons supprimes ne font plus que 18000, avec parfois des des concatenations superieurs a 50.
Por cette raison, la memoire doit saturer rapidement et le transpose plante :/

Merci pour votre solution.

Cordialement,

Delux
Je préfère cela ! Et vous avez raison, la fonction Transpose est très-limitée.
J'avais fait l'essai avec 60 000 lignes amenant à obtenir des chaînes de caractères de longueur supérieure à mille... ...et j'avais évidemment obtenu un magnifique plantage.

D'où l'intérêt de fournir un support d'essai reflétant la réalité du problème posé : c'est mieux qu'une description approximative... Et on gagne un temps fou.​


Bonne soirée.


ROGER2327
#6930


Mercredi 18 Haha 141 (Nativité de Sa Magnificence le baron Mollet (St Pipe) - fête Suprême Quarte)
2 Brumaire An CCXXII, 6,3079h - céleri
2013-W43-3T15:08:20Z
 

Statistiques des forums

Discussions
312 299
Messages
2 086 996
Membres
103 423
dernier inscrit
Guyom GIL