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
Bonjour Laetitia90, Mapomme, Staple1600 et le forum.

Ouh là là ça s'emballe:eek:
Pas compris non plus cette 1ière en #10...

S'il y avait eu moyen de flager "résolu", cela aurait été fait car ce code #6 fait tout, simplement tout.

Et qu'il y a des codes qui marquent les requérants dans le parcours Excel Download...pour leur faire passer des étapes.
Celui-ci-ci en fait incontestablement parti et je suis hyper content de finir l'année par ce petit bijou parce que je ne sais pas (savais pas - espérons le!) correctement manipuler pour un dictionnaire l'utilisation d'une clé à plusieurs éléments, ce que Laetitia a bien compris !

Et partant d'un code (bien plus) difficile d'approche, 1000 mercis @Laetitia 90 pour avoir proposé ce code #6 : concis, pédagogique dans sa syntaxe et sa performance :) (Et un soir tardivement ce qui m'a aidé par ailleurs pour un autre post - EUREKA!).

Que cela n'empêche pas quelques échanges CONSTRUCTIFS, c'est toujours un domaine pour lequel E.D. est reconnu et apprécié. J'ai bien retenu d'ailleurs les commentaires pour ne pas mettre "résolu" dans les titres par rapport à cette communication gagnant-gagnant là!).

Il me reste à vous souhaiter un très bon réveillon (et au plaisir renouvelé de lire vos codes !)
zebanx
 

job75

XLDnaute Barbatruc
Bonjour à tous,

Laetitia en général tu es laconique dans tes messages mais là tu t'es défoulée :D

Que dans un 1er message on se permette de te donner des leçons est en effet stupide.

Concernant l'indentation d'un code rappelons qu'elle consiste en VBA à introduire des espaces ou tabulations en début de ligne pour rendre l'ensemble plus compréhensible.

Ce n'est pas indispensable, surtout quand le code est court et simple comme ceux que tu proposes.

Enfin si l'on veut se passer de la variable x il faudrait écrire pour ne pas perdre du temps :
Code:
m(z) = m.Count + 1: For c = 1 To 9: t(m.Count, c) = t(i, c): Next c
Joyeux réveillon et très bonne année 2018.
 

job75

XLDnaute Barbatruc
Re,

Pour info j'ai testé les durées d'exécution des boucles sur un tableau de 65 000 lignes (ce qui n'est pas énorme) sans doublon.

Chez moi avec la variable x => 0,77 seconde, sans la variable x => 1,39 seconde.

On gagne 45 % avec la variable x.

Fichier .xls joint.

A+
 

Pièces jointes

  • tablo(1).xls
    8.9 MB · Affichages: 28

laetitia90

XLDnaute Barbatruc
re toutes:) & tous :)
enfin !!!! pas tous quand même leti toujours en colére cela ira mieux en 2018:):):)
je tiens a te remercie également l'ami Job:):) pour ton soutien trop!!! gentil

a l'epoque j'avais fait des tests sur ce cas de figure j'avais pas trouve trop écart < 5% avec 50% de doublons sur un fichier de 100000 lignes

je te souhaite egalement une bonne fin d'année Job:):) en se retrouvera en 2018:):):):):):):):)
 

job75

XLDnaute Barbatruc
Re Laetitia,
a l'epoque j'avais fait des tests sur ce cas de figure j'avais pas trouve trop écart < 5% avec 50% de doublons sur un fichier de 100000 lignes
Les durées d'exécution peuvent dépendre de la version Excel, que donne mon fichier chez toi ?

A+
 

Pièces jointes

  • upload_2017-12-31_18-0-41.png
    upload_2017-12-31_18-0-41.png
    238.7 KB · Affichages: 25
  • upload_2017-12-31_18-1-3.png
    upload_2017-12-31_18-1-3.png
    238.7 KB · Affichages: 21

laetitia90

XLDnaute Barbatruc
re l'ami :)

avec ton fichier

0.24 avec x
0.46 avec m count
oui cela fait +- 45% fait plusieurs fois en vidant le dico chaque fois & kill tablo
j'ai pas retrouve ce fichier de test pas envie d'en recrée un :rolleyes::rolleyes:

c'est vrai que les versions excel peuvent influer il y a tellement de para... le nb.. colonnes traitées ect..
mais m.count sur un petit fichier c'est sympa:):) le code est plus court
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous :),

Juste pour le fun. Puisqu'on parle performance.

Suite à un fil où se trouvait une longue boucle utilisant la notation [a1], je me suis posé la question de la performance de la notation [a1] versus range("a1") (cette dernière étant ma préférée). [...] correspond à un Evaluate et Range à une référence directe. Le petit test (fichier joint) semble montrer qu'effectivement range() est plus rapide que [].

Bon et joyeux réveillon à tous ! :)
 

Pièces jointes

  • mapomme- test range versus evaluate- v1.xlsm
    16 KB · Affichages: 27

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum

Bonjour leti, job75, zebanx, arthour973, mapomme

@mapomme
[private joke]
Tiens, cela me rappelle ce que j'ai lu dans cette ouvrage:
"Un petit avis entre la noël et le nouvel an" volume I
(publié aux éditons du Pommier Renifleur ;) sur papier velin )

C'est la même poésie VBAistique (ou c'est la version upgradée pour 2018) ?
(c'est pour savoir si je dois refaire le test ;))
[/private joke]
 

DoubleZero

XLDnaute Barbatruc
Bonjour et tous mes voeux de bonheur aux ami(e)s :D,
...
>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

Bellanger,

A l'occasion de votre première intervention, avez-vous opté pour une inscription dans le club des mal:mad:trus ?

:rolleyes::rolleyes:
 

zebanx

XLDnaute Accro
Bonsoir à tous :),
Juste pour le fun. Puisqu'on parle performance.
:)

Bonjour à tous,

Espérant que le réveillon fut en tout point réussi !

Tous mes voeux également @mapomme.
:)

Comme les retours sur ce poste de Laetitia et des spécialistes*, vos posts de 2017 sur les dictionnaires / findnext / match sont un régal pour apprendre.
C'était l'année dernière mais je me souviens sur la performance d'une demande en méthode dictionnaire (critère : nom + date comprise entre > et < avec BDD) avec réponse multiple de toi (2codes), Laetitia90, Klin89, Vgendron) ou d'une autre avec deux dictionnaires (couleurs + transfert dans tableau)... j'ai été gaté !
Et qu'à chaque fois qu'on te demande des explications sur le codage, la réponse est dense et toujours hyper intéressante pour progresser : bravo et encore merci Mapomme!

Et sur ce petit retour intuitif de range("A1") /[A1], ça méritait d'être testé.
Pas d'écart sur 3000 lignes mais sur 60000, comme JOB75 adore le faire (aussi), ça devient intéressant.
A mon tour donc de compléter ces constats et vos prochains codes à proposer ...par l'utilisation de cells(1,1) qui remporte le lot ;).

Très bonne journée de "détox"
zebanx


* Un grand bonjour sur une liste non exhaustive à : Laetitia90, Pierre-Jean, Job75, Staple1600, MaPomme, Vgendron, Eriic, JHA, Benoit59, Klin89, Nicole B. (JB), Gosselien, Hueu, Double-zero, DranReb, Pierrot, Cisco...
 

Pièces jointes

  • timer_rangeA1.xls
    32 KB · Affichages: 16
Dernière édition:

Discussions similaires

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

Membres actuellement en ligne

Statistiques des forums

Discussions
312 520
Messages
2 089 298
Membres
104 092
dernier inscrit
karbone57