Tableaux dans vba

Tableau

  • Choix du sondage...

  • Choix du sondage...


Les résultats ne sont visibles qu'après le vote.

Dranreb

XLDnaute Barbatruc
Je ne sais pas. Peut être en allant jusqu'à la colonne F, en mettant dans une petite boucle ces 5 1ers cars dans TE(L, 6) et en l'utilisant comme argument de Gigogne.
Il me semble que TA(DS.Co(1)(4),1)=1 ferait à peu près la même chose que la boucle avec Ap1, sauf qu'elle laisserait vide les non 1ers au lieu de leur mettre 0.
Au fait pour remplacer des expression genre …Co(1).Co(1).Co(1)(x) par quelque chose de plus clair j'ai ajouté ces deux méthodes dans de l'objet SsGr :
VB:
Public Function DonnéesDébut() As Variant()
   If TypeOf Co(1) Is SsGr Then DonnéesDébut = Co(1).DonnéesDébut Else DonnéesDébut = Co(1)
   End Function
Public Function DonnéesFin() As Variant()
   If TypeOf Co(1) Is SsGr Then DonnéesFin = Co(Co.Count).DonnéesFin Else DonnéesFin = Co(Co.Count)
   End Function
Ça permet donc d'obtenir sans faire de boucle le 1er ou le dernier Détail attaché directement ou non à un SsGr.
 

KIM

XLDnaute Accro
Re bonsoir,
As-tu d'autres nouveautés dans GigIdx ?
Concernant l'identification des doublons selon les 6 1ers car de la cellule, peut-être il est plus facile de régler ce pb avec une formule que j'intègre dans la macro. A créer une nouvelle discussion pour ce pb.
Bonne soirée et merci encore
KIM
 

KIM

XLDnaute Accro
Bonsoir Dranreb, et le forum,
Je reviens vers vous pour optimiser une macro et corriger des anomalies.
A partir d'une base (col A à H), je créé un recap par OP (col E), et par projet (les 5 premiers car de col C) :
1- Par OP, Compter le nombre de DT, le nombre de DB, le nombre de DBp (5 1è car) et nombre total DB par DT.
2- créer un recap des projets par DT, avec liste des sous-projets par projet et coût global par projet.
J'ai utlisé 2 appels de Gigogne, 3 tableaux TR, TBat et TS.
Je n'arrive pas à séparer les OP par une ligne vide, à redimensionner le dernier tableau TS car il se termine par des parasites,
Aussi des erreurs lors de la recap par DT, dernière ligne recap de chaque DT (col R), je retrouve une somme négative.
Comment optimiser ce code et résoudre ces problèmes ?
Ci-joint le fichier.
Merci de votre aide.
KIM
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonjour.
Si on a besoin d'utiliser Gigogne sur un tableau remplit partiellement, il convient d'affecter préalablement le numéro de la dernière ligne renseignée à GigIdx.DernièreLigneÀIndexer.
À part ça, pour l'instant je suis assez perdu dans tout ça…
 

Dranreb

XLDnaute Barbatruc
Cette procédure semble donner un résultat proche de ce que vous souhaitiez :
VB:
Sub Essai()
   Dim TDon(), L&, TR(), OP As SsGr, NumDT&, DT As SsGr, NumPJ&, NumD2&, PJ As SsGr, NumD1&, TBat() As String, Détail
   TDon = ColUti(TDonn5.[A2:F2]).Value
   For L = 1 To UBound(TDon, 1): TDon(L, 4) = Left$(TDon(L, 3), 5): Next L
   L = 0
   ReDim TR(1 To 2 * UBound(TDon, 1), 1 To 8)
   For Each OP In Gigogne(TDon, 5, 1, 4, Null, 3)
      NumDT = 0
      For Each DT In OP.Co
         NumDT = NumDT + 1: NumPJ = 0: NumD2 = 0
         For Each PJ In DT.Co
            NumPJ = NumPJ + 1: NumD1 = 0
            TR(L + 1, 6) = PJ.Id
            TR(L + 1, 7) = PJ.Somme(6)
            ReDim TBat(1 To PJ.Count)
            For Each Détail In PJ.Co: NumD1 = NumD1 + 1
               TBat(NumD1) = Détail(3) & " (" & Détail(6) & ")": Next Détail
            TR(L + 1, 8) = Join(TBat, ", ")
            NumD1 = -1
            For Each Détail In PJ.Co
               L = L + 1: NumD1 = NumD1 + 1: NumD2 = NumD2 + 1
               TR(L, 1) = OP.Id
               TR(L, 2) = "'" & NumDT & "." & NumPJ & "." & NumD1 & "." & NumD2
               TR(L, 3) = DT.Id
               TR(L, 4) = Détail(3)
               TR(L, 5) = Détail(6): Next Détail, PJ
         L = L + 1
         TR(L, 1) = OP.Id
         TR(L, 2) = "'" & NumDT
         TR(L, 3) = DT.Id
         TR(L, 5) = DT.Somme(6)
         TR(L, 7) = TR(L, 5)
         Next DT
      L = L + 1: Next OP
   TDonn5.[T2].Resize(UBound(TR, 1), UBound(TR, 2)).Value = TR
   End Sub
 

KIM

XLDnaute Accro
Bonjour Dranreb, et le forum,
Je viens de voir ta macro et je t'en remercie. En effet depuis hier je n'ai pas réussi à regrouper ces 2 appels à Gigogne.
Je l'ai testé. Elle répond bien à me demande.
Pour mieux comprendre et réappliquer ce code, pouvez-vous m'expliquer les lignes suivantes :
1/ ReDim TR(1 To 2 * UBound(TDon, 1), 1 To 8) : Est-ce un redim de sécurité pour dire que le nombre max de lignes de TR est 2 fois le nombre de lignes de TDon ?

2/
For Each OP In Gigogne(TDon, 5, 1, 4, Null, 3)
For Each DT In OP.Co
For Each PJ In DT.Co
Ainsi, OP = Col 5, DT = Col1, PJ = Col4
Par contre quelle est la signification de la variable "Null" que je n'ai jamais su utilisé ?
Quel est le rôle de la Col 3 dans l'appel de Gigogne puisqu'elle n'est pas appelée par For Each ?

Merci encore.
KIM
 

Dranreb

XLDnaute Barbatruc
Bonjour.
  1. — Oui, c'est ça, mais ce n'est peut être pas une si bonne idée que ça: si le nombre de lignes des données venaient à diminuer de plus de la moitié, le tableau pourrait avoir une taille insuffisante pour effacer les ligne de fin du dernier résultat…
  2. — Le Null termine la liste les arguments de regroupements sans terminer pour autant celle des arguments du classement. Les lignes Détail sont donc encore classées sur la colonne 3 dans chaque projet.
 

Discussions similaires


Haut Bas