Tableaux dans vba

akni

XLDnaute Nouveau
Bonjour,
J'ai un tableau des quantités vendues par articles, clients et mois, je veux faire une récap par client sans passer par TCD quand j'utilise la méthode FOR NEXT elle tarde un peu, je crois qu'avec les tableaux Ubound et Lbound le résultat sera rapide.
ci joint mon fichier avec la macro FOR NEXT.


Merci beaucoup pour toute aide.
 

Pièces jointes

  • test Tableau 2.xlsm
    1.8 MB · Affichages: 116

Dranreb

XLDnaute Barbatruc
Bonjour.
J'ai du mal à me concentrer sur ton problème parce que je suis sur un très gros truc pour un autre demandeur…
Mais depuis le temps tu dervais être capable de trouver tout seul comment organiser au mieux les collections fabriquées par Gigogne en fonction du résultat souhaité. Je ne vois pas de répétition de colonnes dans les données, et c'est tant mieux, parce que ce serait très inconfortable. Ça obligerait pratiquement à fabriquer un tableau intermédiaire sur lequel devrait partir Gigogne.
 

KIM

XLDnaute Accro
Re,
Avec Co(1) je récupère en effet le 1é BUD d'un EQP.
Je souhaite la somme des 1és BUD de tous les EQP d'un SERV; le nombre de SIT, le nombre de EQP et la répartition par PHASE.
J'ai essaye le Co(1) mais le résultat n'est pas correct.
Le résultat souhaité est présenté à partir de la col 0
le résulta erronné de la macro se trouv à partir de A32.
je suis bloqué, Merci d'avance pour ton aide.
KIM
 

Pièces jointes

  • GigogneKIM_LignesMultiples_v2.xlsm
    25.3 KB · Affichages: 16

Dranreb

XLDnaute Barbatruc
Co(1) donne toute la table Détail dans un variant. Pour en prendre un poste particulier il faut le préciser entre parenthèses derrière. Par Exemple .Co(1)(34)
Ce n'est utilisable que sur le dernier SsGr de l'arborescence. Pour les autres .Co renvoie le 1er SsGr de la collection.
Site.Co(1).Count renvoie le nombre de lignes de détail dans son 1er Eqp, quel que soit l'Eqp qu'on est en train de traiter.
TRés(L, 5) = Eqp.Co(1)(nC_BUD) me parait correct.
 
Dernière édition:

KIM

XLDnaute Accro
Re,
J'ai modifié la macro, voir ci-dessous :
1/ nb de Site OK seulement. nb Eqp erroné
2/ La somme BUD par DPT/SERV n'est pas correcte.
3/ La répartition de la col NOT par PHASE est correcte mais j'ai un problème. Avec
TRés(L, DicTit(Détail(nC_PHASE))) = TRés(L, DicTit(Détail(nC_PHASE))) + Détail(nC_NOT)
La répartition démarre à partir de la même col que la col PHASE du Tableau des données. Pourquoi?
Ci-dessous le coeur de la macro :
For C = 1 To 7: TRés(L, C) = Choose(C, "DPT", "SERV", "Nbr SITE", "Nbr EQP", "Nbr ??", "Nbr ??", "BUD"): Next C
VerserTitres TRés, DicTit
'Stop
For Each Dpt In GigIdx.Gigogne(Null, "DPT", "SERV", "SITE", "EQP")
For Each Serv In Dpt.Co
L = L + 1
TRés(L, 1) = Dpt.ID
TRés(L, 2) = Serv.ID
TRés(L, 3) = Serv.Count 'Nb site
For Each Site In Serv.Co
TRés(L, 4) = TRés(L, 4) + Site.Co(1).Count 'Nb Eqp
For Each Eqp In Site.Co
TRés(L, 5) = Eqp.Count 'Nb eqp
TRés(L, 6) = TRés(L, 6) + 1
TRés(L, 7) = TRés(L, 7) + Eqp.Co(1)(nC_BUD)
For Each Détail In Eqp.Co
TRés(L, DicTit(Détail(nC_PHASE))) = TRés(L, DicTit(Détail(nC_PHASE))) + Détail(nC_NOT)
Next Détail, Eqp, Site, Serv, Dpt

Merci encore
KIM
 

Pièces jointes

  • GigogneKIM_LignesMultiples_v2.xlsm
    28.5 KB · Affichages: 24

Dranreb

XLDnaute Barbatruc
Je compte bien 6 tel que tu les totalise pour SERV2.
3 EQP04, le 1er de SIT03 + 2 EQP06, le 1er de SIT04 + 1 EQP05, Le 1er de SIT05.

Les Eqp.Co(1)(nC_BUD) sont: EQP002: 500, EQP02: 1500, EQP03: 1000. Total: 3000
Edit: Il faut que je cherche encore pourquoi il trouve 4000
Alors. En déroulant pas à pas avec un espion sur Eqp.Id et sur Eqp.Co(1)(nC_BUD)
je trouve: EQP002: 500, EQP02: 1500, EQP03: 1000, EQP03: 1000
Ah oui, on change de site entre temps: Le SIT03 de SRV1 a aussi un EQP03 avec 1000.

Parce que tu l'a expressément demandé par :
Set DicTit = GigIdx.DicInvent(LOt, "PHASE", nC_PHASE)
J'avais déjà souligné que le 3ième paramètre de DicInvent était une colonne dans le résultat, pas dans les données.
 
Dernière édition:

KIM

XLDnaute Accro
Bonjour Dranreb,
J'ai supprimé les doublons dans SRV01 avec SRV02.
Pour le recap par DPT/SRV, pour moi j'ai seulement 5 équipements différents pour SRV02 : EQP04, EQP05, EQP06, EQP07, EQP08 avec Somme BUD= 7500
Pour SRV01, J'ai 4 EQP différents : EQP002, EQP02, EQP03 et EQP09 avec Somme BUD = 4000
Comment c'est possible d'avoir le bon compte avec TRés(L, 6) = TRés(L, 6) + 1 au niveau de EQP
et non avec TRés(L, 4) = TRés(L, 4) + Site.Co(1).Count au niveau du site.
Si je place au niveau de EQP
TRés(L, 5) = Site.Co(1).Count ou TRés(L, 5) = TRés(L, 5) + Site.Co(1).Count je n'ai pas le bon nombre d'EQP par SRV.

Je découvre un autre problème au bureau. Ce même fichier qui fonctionne sans problème chez moi.
avec le même GigIdx au bureau et chez moi j'utilise un 1é message d'erreur au niveau de la ligne
Set DicTit = GigIdx.DicInvent(LOt, "PHASE", 9)
Incompatibilité de type au niveau de la ligne : réglé en remplçant "PHASE" par son num nC_PHASE
ensuite un autre problème : Argument "DPT" Sans Listobject, idem pour les autres au niveau de la ligne
For Each Dpt In GigIdx.Gigogne(Null, "DPT", "SERV", "SITE", "EQP")
réglé en remplçant chacun par son num de col.
GigIdx est coché et jusque là jamais de problème. Est-ce un problème récurrent sinon je dois revoir toutes mes macros pour remplacer les noms des col par leur num.
Merci d'avacne
KIM
 

Pièces jointes

  • GigogneKIM_LignesMultiples_v2b.xlsm
    29.5 KB · Affichages: 18

Dranreb

XLDnaute Barbatruc
Pour calculer l'ensemble du nombre d'équipements différent dans un service il suffit de cumuler les Sit.Count puisque Sit.Count donne le nombre d'élément qu'il contient et qu'il contient des SsGr équipements
Y a t il bien la référence Microsoft Scripting Runtime cochée partout où le truc est utilisé ?
 

KIM

XLDnaute Accro
Re,
Oui, j'ai bien la référence Microsoft Scripting Runtime cochée
For Each Dpt In GigIdx.Gigogne(Null, "DPT", "SERV", "SITE", "EQP").
Pour le nombre d'EQP, J'ai bien compris le fonctionnement, je continue les tests.
Merci encore
KIM
 

KIM

XLDnaute Accro
Bonjour Dranreb,
Je reviens vers toi car, non pas mais plusieurs macros, ne fonctionnent plus avec des messages d'erreurs :
Message 1: Erreur d'execution 13, Incompatibilité de type
au niveau de : Set DicTit = GigIdx.DicInvent(LOt, "PHASE", 7)
Je remplace "PHASE" par nC_PHASE et le message d'erreur disparait.

Message 2 : Argument "DPT" sans ListObject , etc
au niveau de : ReDim ValArg(1 To RupMax) de la fonction Gigogne
J'ai remplacé les noms des colonnes par leur numéro dans l'appel à Gigogne et cela fonctionne.
remplacer "DPT" par nC_DPT.

Je testerai ce soir sur mon portable.
En attendant peux-tu stp me renvoyer ta dernière version GigIdx?
Merci d'avance
KIM
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Elle n'a pas changé. depuis le 22/2/2018 mais je le joins quand même.

Il semblerait que ton LOt ne soit pas défini, mais dans ce cas il devrait y avoir comme message "Votre paramètre source consiste en un objet non initialisé.", à la rigueur "Source de type "Empty" non supportée."
 

Pièces jointes

  • GigIdx.xlsm
    86.5 KB · Affichages: 24

KIM

XLDnaute Accro
Merci Dranreb,
Mais là depuis hier je galère avec ces messages d'erreurs.
Le tableau est bien défini.
Dim LOt As ListObject
Set LOt = FDonn.ListObjects(1)

ET là il y a un instant j'ai changé la colonne des titres et je reçois le message d'erreur suivant :
Erreur d'exécution 10, Ce tableau est fixe ou temporairement verrouillé
au niveau de : VerserTitres TRés, DicTit
Avec des chiffres (Age des équipements) dans la col nC_AGE
dans
Set DicTit = GigIdx.DicInvent(LOt, nC_AGE, 7)
L = 1
For C = 1 To 6: TRés(L, C) = Choose(C, "DPT", "SERV", "SITE", "EQP", "Lib EQP"): Next C
VerserTitres TRés, DicTit

PS : Beaucoup de mes TDB sont basés sur tes modules de services.

Merci encore
KIM
 

Discussions similaires

Réponses
1
Affichages
341

Statistiques des forums

Discussions
312 023
Messages
2 084 716
Membres
102 636
dernier inscrit
TOTO33000