Problème code dictionnaire additions lignes (tableau non trié) (erreur 9)

zebanx

XLDnaute Accro
Bonsoir,

Je cherche à utiliser une macro communiquée (code : Jacques B. :) sauf erreur) qui permet d'additionner des valeurs à partir d'un dictionnaire :

Le fichier comporte 4 colonnes : workbook (pas utile dans la restitution), sheet, adresse de cellule et valeur

clé = sheets + adresse de cellule
item = valeur

La macro fonctionne bien quand on met les tableaux de 2 fichiers sur les 3 mais pas quand on met les 3 fichiers.

Si vous pouviez m'aider à comprendre d'où vient cette erreur "9" sur la ligne, merci beaucoup

zebanx

Le code :

Sub global_additionne()
Dim ta()
Set d = CreateObject("Scripting.Dictionary")
derligne = Cells(Rows.Count, 1).End(3).Row
ta = Range("A2:D" & derligne).Value
Ncol = UBound(ta, 2)
For i = 1 To UBound(ta)
clé = ""
For k = 2 To 3: clé = clé & ta(i, k) & "|": Next k
If d.exists(clé) Then
ReDim tb(1 To 1, 1 To Ncol)
For k = 1 To Ncol - 1: tb(1, k) = ta(i, k): Next k
'For k = Ncol : tb(1, k) = d(clé)(k) + ta(i, k): Next k
If k = Ncol Then
tb(1, k) = d(clé)(k) + ta(i, k) 'erreur 9 avec les 3 fichiers
End If
d(clé) = tb
Debug.Print clé
Else
d(clé) = Application.Index(ta, i)
End If
Next i
 

Pièces jointes

  • help_xldw_dictionnaire.xls
    490.5 KB · Affichages: 25

zebanx

XLDnaute Accro
Bonsoir Staple1600

Oui, je poste le code original et le fichier (code présenté en #1 issu de sub_..._4C)
(Sauf erreur un code de JB et qui fonctionne très bien dans le fichier ci-joint).

Je l'ai légèrement amendé (derligne plutôt qu'un chiffre au début et boucle if au lieu de for next car il n'y a qu'une colonne de valeurs à additionner (colonne D)).

Merci pour ton aide ;)++
zebanx

----------
Sub sh03_Sup2_limite4C()
Dim ta()
Set d = CreateObject("Scripting.Dictionary")
ta = [A2:I8].Value
Ncol = UBound(ta, 2)
For i = 1 To UBound(ta)
clé = ""
For k = 1 To 4: clé = clé & ta(i, k) & "|": Next k
If d.exists(clé) Then ' Somme les colonnes 6,7
ReDim tb(1 To 1, 1 To Ncol)
For k = 1 To Ncol - 2: tb(1, k) = ta(i, k): Next k
For k = Ncol - 1 To Ncol: tb(1, k) = d(clé)(k) + ta(i, k): Next k
d(clé) = tb
Debug.Print clé
Else
d(clé) = Application.Index(ta, i)
End If
Next i
res = Application.Transpose(Application.Transpose(d.items)) ' Dictionnaire dans Array res()
[n2].Resize(UBound(res), UBound(res, 2)) = res
End Sub
 

Pièces jointes

  • tablo.xls
    49.5 KB · Affichages: 55

Staple1600

XLDnaute Barbatruc
Re

Ca ne coute rien de déclarer ses variables,non?
(Et c'est pas parce un grand Ancien du forum ne le fait pas qu'il faille le faire.
Tu me diras c'est pas parce moi qui ne suis qu'ancien suggére de le faire qu'il faille le faire ;))
Mais au moins une fois déclarées, on sait que c'est pas là que se situe le problème ;)

Sinon il me semble avoir lu qu'il y avait une limite à l'utilisation de Transpose.
 

zebanx

XLDnaute Accro
Re-

Tu as raison ;) il semble que ce soit un problème de limite (si je reprends le fichier du #3) et que je copie la dernière ligne sur quelques lignes suivantes...

Aie aie, c'est le seul exemple que j'avais d'utilisation de dictionnaires avec deux valeurs prises pour faire une clé.
Je vais chercher déjà...

Merci pour ton aide et ta remarque précieuse
 

laetitia90

XLDnaute Barbatruc
bonsoir zebanx:):),Jean Marie:):)
avec ton fichier exemple je prends les 7 premieres colonne en ref pour doublons ...donc un Michel de +

VB:
Sub es()
  Dim t(), i As Long, m As Object, c As Byte, z
      Set m = CreateObject("Scripting.Dictionary")
    t = Range("a2:i" & Cells(Rows.Count, 1).End(3).Row).Value2
    For i = 1 To UBound(t)
    z = t(i, 1) & t(i, 2) & t(i, 3) & t(i, 4) & t(i, 5) & t(i, 6) & t(i, 7) 'possible boucle
    If m.Exists(z) Then
    For c = 8 To 9:  t(m(z), c) = t(m(z), c) + t(i, c): Next c
    Else
    x = x + 1
    For c = 1 To 9: t(x, c) = t(i, c): Next c:   m(z) = x
    End If
    Next i
    [n2].Resize(x, 9) = t
End Sub
 

Bellanger

XLDnaute Nouveau
Bonsoir,

>la declaration des var... c'est la première chose que mon mentor m'a enseignée.

-Dommage qu'il n'est pas enseigné l'indentation des programmes.
-La variable x n'est pas déclarée ni initialisée, ce qui n'empêche pas le programme de fonctionner.
-Avec Option Explicit, cette non déclaration de x aurait été détectée par le compilateur.
-D'ailleurs, la variable x ne sert à rien :
.For c = 1 To 9: t(x, c) = t(i, c): Next c: m(z) = m.count+1
.[n2].Resize(m.count, 9) = t

Bellanger
 
Dernière édition:

laetitia90

XLDnaute Barbatruc
bonsoir tous & toutes
je me dois de repondre pas de gaieté de coeur mais bon:(
effectivement j' ai oublié de de declarer la var... x que zebanx & Jm me pardonne "mea culpa "

par contre conard de bellanger que l'on reverra bien sur pas pour aider sur ce forum pas de courage:mad::mad:

oui !!!!j'ai oublie une var .... initialiser pourquoi conard dans ce type de code x=0 par defaut
si tu coder un peu tu devrais le savoir conard!!! j'aime bien conard:p:p:p:p expression a mon papounet que j'adore:):)

autre chose conard:p dans ce type de code x= m.count+1 simplification conard j'aime trop:p:p
plus facile a manipuler x que m.count+1
tu parles indentation conard :rolleyes::rolleyes: non la leti un peu trop:(
tu l'ecrirais comme cela
For c = 1 To 9: t(x, c) = t(i, c): Next c: m(z) = m.count+1
[n2].Resize(m.count, 9) = t

eh oui !!! conard marche pas tu laisse le x c'est vrai que tu est conard:p:p:p
je vais 't aidera a indenter ce que tu fais pas dans ta reponse & ecrire correctement le code en utilisant m.count+1

For c = 1 To 9
t(m.Count + 1, c) = t(i, c)
Next
m(z) = m.Count + 1
End If
Next i
[n10].Resize(m.Count, 9) = t

c'est quoi pour toi indenter un code j' ai oublie conard :oops:
pour moi j'aime avoir une vision global d'un projet imagine un code avec 1000 lignes les sequences importantes les grouper en evite le scroll

dans le milieu medical eh oui!!:):)
pour toi deja au niveau Psyc.... porter plainte a la police denoncer papa:eek: ou tonton :eek:ce qu il ton fait subir pendant ton adol... je passerais les details.... 50 pour cent du travail fait ...on verra apres
du moment que tu touches pas au gosses je suis rassurée

que l'on me pardonne en cette fin d'année de mes propos

leti qui vous aime toutes & tous:):):):):):):):):):):):):):):)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

@leti
[trait d'humour solidaire]
Je suppute (peut-être à tort) que Bellanger n'est pas un perdreau de l'année.
On ne poste son premier message sur un forum pour faire dans le vindicatif directement.
Intrigué, j'ai persévéré dans la supputation, et me suis rappelé que qui parle VBA parle anglais.
Or donc si on traduit Bellanger de l'anglais, on a: Bell anger
soit Cloche Colére.
Qui est donc cette cloche en colère qui vient derechef titiller leti en guise d'intronisation sur XLD?
[/trait d'humour solidaire]

@Bellanger
Si mes supputations sont fausses, bizarre est ta manière de nous rejoindre, non ?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @laetitia90 :), @Staple1600 ;),

Staple1600 suppute. Je suppute aussi avec humour:

Bellanger : On recherche donc une cloche, qui vient d'Anger(s), qui connaît le VBA, qui connait l'anglais, qui n'est pas un perdreau de l'année et qui a tout plein de dents apparemment pas uniquement réservées à ses programmes... Manquerait plus qu'il soit né un mois de mai !

Merdre alors! Ça me rappelle quelqu'un. Je vous jure, je n'ai rien à voir avec ce quidam. D'abord moi, j'ai un fond gentil.

Courage leti :rolleyes:, on t'aime aussi.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Salut mapomme ;)

[aparté]Alors ce rhume, ça se tasse?[/aparté]

J'ai encore eu un flash supputatif
Le tit nouveau angevin non genré gére déja le gras (enfin je veux la balise BBCODE idoine)
C'est rare chez le nouveau membre une telle maitrise du VBA et de la balise
Faudrait vite sortir l'anguille fumée qu'est sous France Roche ;)

Bon mapomme on se retrouve encore au bord du lit à une heure tardive ;)
 

Discussions similaires

Réponses
3
Affichages
571
Réponses
23
Affichages
1 K

Statistiques des forums

Discussions
312 294
Messages
2 086 893
Membres
103 404
dernier inscrit
sultan87