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
Enfin il ne faudrait peut être pas oublier la possibilité de définir un SsGr pour chacun de ces critères et ne traiter que ceux d'Id intéressantes. On peut même y accéder directement si c'est une valeur String (Méthode ItemSsGr)
Si c'est toute la procédure qui ne concerne qu'une certaine combinaison de valeurs, en préciser les colonnes en premier pour accéder rapidement au seul sous ensemble intéressant.
Il y a aussi la possibilité de préfiltrer l'ensemble. Mais ça je crois que je ne t'en ai jamais parlé…
 
Dernière édition:

KIM

XLDnaute Accro
Re bonjour,
Ci-joint un fichier simple qui utilise trois appels à la méthode Extraire. Comment le simplifier pour appliquer ton raisonnement. Désolé, j'ai besoin d'un exemple concret pour mieux comprendre.
Merci d'avance pour ton aide
KIM

Sub RecapParOPetETAT()
Dim DicTit As Dictionary, L As Long, C As Long, TRés(1 To 500, 1 To 12), _
Dpt As SsGr, Serv As SsGr, Site As SsGr, Eqp As SsGr, OP As SsGr, Détail
Dim TBUD(), TCOND(), TOP()

'Recherche les entetes des colonnes pour identifier le numero de la colonne.
Dim nC_PHASE&, nC_LibEQP&, nc_ETAT&, nC_BUD&
Dim LOt As ListObject
Set LOt = FDonn.ListObjects(1)
nC_PHASE = NColTab(LOt, "PHASE")
nC_OP = NColTab(LOt, "OP")
nc_ETAT = NColTab(LOt, "ETAT")
nC_BUD = NColTab(LOt, "BUD")


Set DicTit = GigIdx.DicInvent(LOt, "PHASE", nC_PHASE)
L = 1
For C = 1 To 5: TRés(L, C) = Choose(C, "DPT", "AB BUD", "AB BUD 2", "AB BUD En Cours", "Lib EQP"): Next C

For Each OP In GigIdx.Gigogne(Null, "OP", "DPT")
For Each Dpt In OP.Co
L = L + 1
TRés(L, 1) = Dpt.ID
TRés(L, 2) = Dpt.SommeSi(nC_OP, "AB", nC_BUD) 'Pour controler le calcul ci-dessous

'Extraction des colonnes
Dpt.Extraire TCOND, nc_ETAT
Dpt.Extraire TBUD, nC_BUD
Dpt.Extraire TOP, nC_OP

For N = 1 To UBound(TBUD)
If TOP(N) = "AB" Then
TRés(L, 3) = TRés(L, 3) + TBUD(N)
If TCOND(N) = "En cours" Then TRés(L, 4) = TRés(L, 4) + TBUD(N)
End If
Next N
Next Dpt, OP

FDonn.[A20].Resize(500, 12).Value = TRés
End Sub
 

Pièces jointes

  • GigogneKIM(AvecConditionsMultiples)_vE.xlsm
    25.3 KB · Affichages: 40

Dranreb

XLDnaute Barbatruc
Déjà il semblerait que tu ne t'intéresse qu'a l'OP d'Id="AB" alors pourquoi les explore tu tous par une boucle ?
Et pourquoi teste tu encore les nc_OP au lieu de tester au début si OP.Id = "AB". On n'a alors que ceux là dans tout le SsGr !
 

Dranreb

XLDnaute Barbatruc
Là ton résultat uniquement pour les "AB" peut s'obtenir comme ça :
VB:
Sub RecapParOPetETAT()
Dim DicTit As Dictionary, L As Long, C As Long, TRés(1 To 500, 1 To 12), _
   Dpt As SsGr, Serv As SsGr, Site As SsGr, Eqp As SsGr, OP As SsGr, EC As SsGr, Détail
'Recherche les entetes des colonnes pour identifier le numero de la colonne.
Dim nC_PHASE&, nC_LibEQP&, nc_ETAT&, nC_BUD&
Dim LOt As ListObject
Set LOt = FDonn.ListObjects(1)
nC_PHASE = NColTab(LOt, "PHASE")
nc_op = NColTab(LOt, "OP")
nc_ETAT = NColTab(LOt, "ETAT")
nC_BUD = NColTab(LOt, "BUD")
Set DicTit = GigIdx.DicInvent(LOt, "PHASE", nC_PHASE)
L = 1
For C = 1 To 5: TRés(L, C) = Choose(C, "DPT", "AB BUD", "AB BUD 2", "AB BUD En Cours", "Lib EQP"): Next C
Set OP = GigIdx.Gigogne(Null, "OP", "DPT", "ETAT").Item("AB")
For Each Dpt In OP.Co
      L = L + 1
      TRés(L, 1) = Dpt.ID
      TRés(L, 2) = Dpt.Somme(nC_BUD)
      TRés(L, 3) = Dpt.Somme(nC_BUD)
      Set EC = Dpt.ItemSsGr("En cours"): If Not EC Is Nothing Then TRés(L, 4) = EC.Somme(nC_BUD)
      Next Dpt
FDonn.[A30].Resize(500, 12).Value = TRés
End Sub
 

KIM

XLDnaute Accro
Re,
Je viens de découvrit 2 syntaxes qui vont réduire mes codes de création de TDB :
Set OP = GigIdx.Gigogne(Null, "OP", "DPT", "ETAT").Item("AB") : C'est l'équivalent d'une boucle IF OP.ID = "AB" Then etc.
et
Set EC = Dpt.ItemSsGr("En cours") : C'est la 2è condition pour ETAT " En cours"

C'est ce que je cherche. Je vais les appliquer.
Merci encore et Bonne soirée
KIM
 

KIM

XLDnaute Accro
Re bonsoir,
Je reviens vers toi concernant les ItemSsGr.
Dans ces 2 lignes de commandes,
Set OP = GigIdx.Gigogne(Null, "OP", "DPT", "ETAT").Item("AB")
Set EC = Dpt.ItemSsGr("En cours"): If Not EC Is Nothing Then TRés(L, 4) = EC.Somme(nC_BUD)
EC est un ItemSsGr de DPT figé à "En cours" pour OP = "AB".
Est-il possible de déclarer 2 ItemSsGr pour DPT (2 conditions dans 2 col différentes) ?
Cette condition pour col ETAT = "En cours" et une autre pour col EQP = "E1".
Comment faire ?
Merci
KIM
 

KIM

XLDnaute Accro
Bonjour Dranreb et le forum,
J'ai ainsi découvert la fonction ItemSsGr. Pour les 3 conditions :
OP = "AB"
ETAT = "En cours"
et PHASE = "E1"
J'ai rajouté PHASE en tant que SsGr de ETAT et j'ai intégré la 3è condition dans le IF de la 2è condition (voir ci-dessous et fichier ci-joint).
J'obtiens le résultat correct. Mais est-ce que c'est la bonne solution ou le bon raisonnement?
Merci d'avance
KIM

Code:
Sub RecapParOPetETAT_v4()
Dim DicTit As Dictionary, L As Long, C As Long, TRés(1 To 500, 1 To 12), _
   Dpt As SsGr, Serv As SsGr, Site As SsGr, Eqp As SsGr, OP As SsGr, EC As SsGr, PH As SsGr, Détail
'Recherche les entetes des colonnes pour identifier le numero de la colonne.
Dim nC_PHASE&, nC_LibEQP&, nc_ETAT&, nC_BUD&
Dim LOt As ListObject
Set LOt = FDonn.ListObjects(1)
nC_PHASE = NColTab(LOt, "PHASE")
nC_OP = NColTab(LOt, "OP")
nc_ETAT = NColTab(LOt, "ETAT")
nC_BUD = NColTab(LOt, "BUD")
Set DicTit = GigIdx.DicInvent(LOt, "PHASE", nC_PHASE)
L = 1
For C = 1 To 5: TRés(L, C) = Choose(C, "DPT", "AB BUD", "AB BUD / En Cours", "AB BUD / En Cours / pour E1", " "): Next C
Set OP = GigIdx.Gigogne(Null, "OP", "DPT", "ETAT", "PHASE").Item("AB")
For Each Dpt In OP.Co
      L = L + 1
      TRés(L, 1) = Dpt.ID
      TRés(L, 2) = Dpt.Somme(nC_BUD)
      Set EC = Dpt.ItemSsGr("En cours")
      If Not EC Is Nothing Then
        TRés(L, 3) = EC.Somme(nC_BUD)
        Set PH = EC.ItemSsGr("E1"): If Not PH Is Nothing Then TRés(L, 4) = PH.Somme(nC_BUD)
      End If
Next Dpt
FDonn.[A15].Resize(500, 12).Value = TRés
End Sub
 

Pièces jointes

  • GigogneKIM(AvecCondMultiples)_vE.xlsm
    28.1 KB · Affichages: 31

KIM

XLDnaute Accro
Re,
Je reviens vers toi concernant des doublons dans une col dans un de mes tdb.
A cause des doublons seulement la col14 est correcte. Comment donc traiter les doublons avec Co(1) et ItemSsGR ?
Pour les autres col 10, 11, 12 et 13, :
J'ai utilisé :
TS(L, 10) = TS(L, 10) + TER.Co(1).Somme(nC_SHON)
ou
TS(L, 10) = TS(L, 10) + TER.Co(1) (nC_SHON)
ou
TS(L, 10) = TER.Co(1).Somme(nC_SHON)
toujours le message d'erreur : Incompatibilité de type.

Merci d'avance
KIM
Code:
For Each OP In Gigogne(LOt, nC_OP, nC_BAT, nC_TER, nC_RT)    'OP/DR/SITE/BAT/STATUT  (LOt, 18, 1, 2, 7, ColTitre)
        For Each BAT In OP.Co
            Set TER = BAT.ItemSsGr("NON")
            If Not TER Is Nothing Then
                TS(L, 10) = TS(L, 10) + TER.Co(1).Somme(nC_SHON)
                TS(L, 11) = TS(L, 11) + TER.Co(1).Somme(nC_SDP)
                TS(L, 12) = TS(L, 12) + TER.Co(1).Somme(nC_SUB)
                TS(L, 13) = TS(L, 13) + TER.Co(1).Somme(nC_SUN)
                TS(L, 14) = TS(L, 14) + TER.Somme(nC_LSURF)
            End If
        Next BAT
Next OP
 

KIM

XLDnaute Accro
En effet, j'ai des répétitions de l'ensemble des lignes détail dans plusieurs TER de BAT.
J'ai rajouté RT dans Gigogne(LOt, nC_OP, nC_BAT, nC_TER, nC_RT) pour une autre boucle (condition ItemSsGr RT de TER). Mais comme la première condition n'a pas fonctionné, je ne l'ai pas écrite.
Merci encore pour tes conseils
KIM
 

KIM

XLDnaute Accro
Bonsoir Dranreb,
J'ai besoin de l'aide pour avancer avec les ItemSsGr. En effet j'explore un TER de BAT, le "NON" et le RT = "app" de TER.
1- les critères dans l'ordre : OP / TER = "NON" / RT = "app"
2- La col nC_SHON contient beaucoup de doublons : Dans Col(10) je dois récupérer la somme de la SHON sans doublons
TS(L, 10) = TS(L, 10) + TER.Co(1).Somme(nC_SHON) n'a pas fonctionné
3- Dans Col(12) et Col(13) je récupère la somme. OK car pas de doublons à gérer
TS(L, 12) = TS(L, 12) + TER.Somme(nC_SUB)
TS(L, 13) = TS(L, 13) + TER.Somme(nC_SUN)
4- Ensuite à partir de ColDep = 15 je dois récupérer la somme(nC_SUB) par CAT (ColTitre = nC_CAT)
Merci d'avance
KIM

VB:
For Each Détail In DicTit.Keys: C = C + 1: TS(1, C) = Détail: Next Détail
TS(1, CFin - 1) = "STot": TS(1, CFin) = "LSTot"
'C = C + 1
FR5.[A5].Resize(1, CFin).Value = TS
'
For Each OP In Gigogne(LOt, nC_OP, nC_BAT, nC_TER, nC_RT)
    L = L + 1
    TS(L, 1) = "Total " & OP.Id
    TS(L, 2) = OP.Count
       
        For Each BAT In OP.Co
            Set TER = BAT.ItemSsGr("NON")
            If Not TER Is Nothing Then
                Set RT = TER.ItemSsGr("app")
                If Not RT Is Nothing Then
                    TS(L, 10) = TS(L, 10) + TER.Co(1).Somme(nC_SHON)
                    TS(L, 12) = TS(L, 12) + TER.Somme(nC_SUB)
                    TS(L, 13) = TS(L, 13) + TER.Somme(nC_SUN)
'
                    For Each Détail In BAT.Co
                        TS(L, DicTit(Détail(ColTitre))) = TS(L, DicTit(Détail(ColTitre))) + Détail(nC_SUB)
                    Next Détail
'
                End If
            End If
        Next BAT
Next OP
 

Pièces jointes

  • GigogneKIM(CondMultiples)_AvecCriteres.xlsm
    83.4 KB · Affichages: 45

Discussions similaires

Réponses
1
Affichages
319