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.
Je doute que vous vouliez laisser dans la colonne 3 de chaque Dr le nombre d'éléments du dernier DS trouvé dedans, écrasant les précédents.
Il me semblerait plus logique de les cumuler: TS(L, 3) = TS(L, 3) + DS.Count
Du reste le total produit à la fin devient ainsi la somme des chiffres portés en colonne 3.
 

KIM

XLDnaute Accro
Merci Dranreb,
voilà, résultat OK par contre est-ce que c'est normal que le cumul correct soit dans nBat V
Code:
'Nbr DS et DB par DR
L = 0: NSite = 0: NBat = 0
ReDim TS(1 To 10000, 1 To 3)
For Each Dr In Gigogne(TE, 1, 2, 3)
  L = L + 1
  TS(L, 1) = Dr.ID
  TS(L, 2) = Dr.Count
  NSite = NSite + Dr.Count
  For Each DS In Dr.Co
  TS(L, 3) = TS(L, 3) + DS.Count
  NBat = NBat + DS.Count
  Next DS, Dr

  L = L + 1
  TS(L, 2) = NSite
  TS(L, 3) = NBat
TDonn.[K3].Resize(10000, 3).Value = TS

Bonne soirée
KIM
 

KIM

XLDnaute Accro
Bonsoir Dranreb et le forum,

Avec le code ci-dessous, j'identifie les doublons de la col DB par DS
Comment je peux identifier les doublons selon les 5 premiers caractères de DB ?
et aussi faire un comptage selon les mêmes conditions ?
voir fichier ci-joint
Merci encore
KIM

VB:
For Each DB In Gigogne(TE, 3, 2)
  For Each DS In DB.Co
  Ap1 = 1: For Each Détail In DS.Co
  TA(Détail(4), 1) = Ap1: Ap1 = 0: Next Détail, DS, DB
Plage.Columns(4).Value = TA

et le récap
Code:
'Nbr DS et DB par DR
L = 0: NSite = 0: NBat = 0
ReDim TS(1 To 10000, 1 To 3)
For Each Dr In Gigogne(TE, 1, 2, 3)
  L = L + 1
  TS(L, 1) = Dr.ID
  TS(L, 2) = Dr.Count
  NSite = NSite + Dr.Count
    For Each DS In Dr.Co
       TS(L, 3) = TS(L, 3) + DS.Count
       NBat = NBat + DS.Count
    Next DS, Dr

  L = L + 1
  TS(L, 2) = NSite
  TS(L, 3) = NBat
TDonn2.[K3].Resize(10000, 3).Value = TS
      
End Sub
 

Pièces jointes

  • IdentifierDoublons_kb1.xlsm
    22.9 KB · Affichages: 3

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
 

Pièces jointes

  • Gigogne_SommeBudParProjet_KIM_01.xlsm
    34 KB · Affichages: 7

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

Réponses
1
Affichages
323

Statistiques des forums

Discussions
311 733
Messages
2 082 019
Membres
101 872
dernier inscrit
Colin T