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

KIM

XLDnaute Accro
Bonjour Dranreb et le forum,
1/ Selon ton post 149, " La Sub VerserTitres a été intégrée aussi" dans tes modules de services. Dans ton post 223 de jeudi dernier tu m'as transmis ta dernière version GigIdx qui n'intère pas la sub VerserTitres. J'ai trouvé une macro "Sub VerserEntêtes", j'en déduis que c'est la même car le résultat est identique.
2/ Avec Set DicTit = GigIdx.DicInvent(LOt, nC_AGE, 7
et VerserEntêtes TRés, DicTit
nC_Age est une colonne qui contient l'age de chaque EQP (numérique). J'ai un message d'erreurs avec VerserEntêtes au niveau de
ReDim Preserve T(LBound(T, 1) To UBound(T, 1), LBound(T, 2) To K + DC)
Si je modifie la colonne des titres avec une qui contient du texte, la même maco fonctionne.
2 questions :
Q1/ Comment faire pour répartir par âge d'EQP?
Q2/ Comment créer des tranches d'âges : 0-5ans, 6-10ans, 11-20ans, 21-30ans, +31ans et répartir par tranche d'âge.

Merci d'avance
KIM
 

Pièces jointes

  • GigogneKIM_RecapParTrancheAge_v1.xlsm
    30.4 KB · Affichages: 21

Dranreb

XLDnaute Barbatruc
Bonjour.
1) — Ah oui, la verser Titres a été renommée VerserEntêtes. C'est mieux en soit mais… des fois je ne sait plus ce que j'apporte comme modifications… Je n'ai pas réinstallé mon propre GigIdx.xlam. C'y est toujours VerserTitres. Mes excuses.
2) — Là c'est clair. L'erreur vient de ce que VerserEntête agrandit si nécessaire le tableau en nombre de colonnes (puisqu'on ne peut le faire que sur les colonnes, pas les lignes, avec Redim Preserve), si ça dépasse avec le nombre d'arguments différents trouvés. Or là il n'en a pas la permission, parce que ce n'est pas un tableau dynamique: il est dimensionné TRés(1 To 500, 1 To 13) à la déclaration.

Pour la dernière question. Gigogne accepte un tableau VBA en guise de données. Alors soit on transforme celui pris de la propriété Value de la DataBodyRange, en y ajoutant une colonne qui détermine la tranche d'age, sur laquelle on pourra baser un SsGr ou utiliser un DicInvent dessus, soit on ajoute une colonne dans le tableau Excel avec une formule qui la détermine.
 

KIM

XLDnaute Accro
Bonsoir,
Merci pour ces explications.
1/ Concernant l'erreur de VerserEntête, e problème est réglé avec une declaration de TRés(1 To 500, 1 To 25).
2/ Pour la Q2 :
Q2/ Comment intégrer ces tranches horaires tranches d'âges : 0-5ans, 6-10ans, 11-20ans, 21-30ans, +31ans par rapport à une année de référence dans $B$2 et répartir BUD par ces tranche2 d'âge.
J'ai traité cette question avec des formules sommeprod et cela fonctionne. Mais je souhaite intégrer ce tableau dans le TDB créé avec tes modules de services.
voir fichier ci-joint.
Merci d'avance pour ton aide.
KIM
 

Pièces jointes

  • GigogneKIM_RecapParTrancheAge_v1E.xlsm
    29.2 KB · Affichages: 17
Dernière édition:

Dranreb

XLDnaute Barbatruc
Je le ferais peut être tout simplement comme ça finalement :
VB:
Sub RecapParTrchAge_v2()
Dim DicTit As Dictionary, L As Long, C As Long, TRés(1 To 500, 1 To 25), _
   Dpt As SsGr, Serv As SsGr, Site As SsGr, Eqp As SsGr, Age As SsGr, Détail

'Recherche les entetes des colonnes pour identifier le numero de la colonne.
Dim nC_BUD&, nC_PHASE&, nC_LibEQP&, nC_ETAT&, nC_DPT&, nC_SERV&, nC_SITE&, nC_EQP&, nC_AN&, nC_AGE&
Dim LOt As ListObject
Set LOt = FDonn.ListObjects(1)
nC_BUD = NColTab(LOt, "BUD")
nC_PHASE = NColTab(LOt, "PHASE")
nC_LibEQP = NColTab(LOt, "Lib EQP")
nC_DPT = NColTab(LOt, "DPT")
nC_SERV = NColTab(LOt, "SERV")
nC_SITE = NColTab(LOt, "SITE")
nC_EQP = NColTab(LOt, "EQP")
nC_ETAT = NColTab(LOt, "ETAT")
nC_AN = NColTab(LOt, "AN")
nC_AGE = NColTab(LOt, "AGE")

'Set DicTit = GigIdx.DicInvent(LOt, nC_PHASE, 7)
'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
'VerserEntêtes TRés, DicTit
For C = 1 To 5: TRés(1, C + 6) = "'" & Choose(C, "0-5", "6-10", "11-20", "21-30", ">=31"): Next C
'VerserTitres TRés, DicTit
For Each Dpt In GigIdx.Gigogne(LOt, nC_DPT, nC_SERV, nC_SITE, nC_EQP)
   For Each Serv In Dpt.Co
      For Each Site In Serv.Co
         For Each Eqp In Site.Co
            L = L + 1
            TRés(L, 1) = Dpt.ID
            TRés(L, 2) = Serv.ID
            TRés(L, 3) = Site.ID
            TRés(L, 4) = Eqp.ID
            TRés(L, 5) = Eqp.Co(1)(nC_LibEQP)
            For Each Détail In Eqp.Co
'               TRés(L, DicTit(Détail(nC_PHASE))) = Détail(nC_ETAT)
'               TRés(L, DicTit(Détail(nC_AGE))) = Détail(nC_BUD)
                Select Case Détail(nC_AGE)
                  Case Is >= 31: C = 11
                  Case Is >= 21: C = 10
                  Case Is >= 11: C = 9
                  Case Is >= 6: C = 8
                  Case Else: C = 7: End Select
               TRés(L, C) = TRés(L, C) + Détail(nC_BUD)
               Next Détail, Eqp, Site, Serv, Dpt
FDonn.[A50].Resize(500, 25).Value = TRés
End Sub
 

KIM

XLDnaute Accro
Merci Dranreb, Cela me permet de supprimer les formules sommeprod, d'alléger le fichier à l'ouverture et un temps d'exéc rapide.
Par contre reste les formules pour calculer l'âge (col AGE). Elle est calculée par la différence de l'année de réference en B2 et la col AN de chaque EQP. je vais la créer par une autre macro.
Merci encore
Bonne journée
KIM
 
Dernière édition:

KIM

XLDnaute Accro
Bonjour Dranreb,
J'ai créé la colonne "Age EQP" qui calcule l'âge de l'eqp par rapport à la date d'achat et l'année courante. Tout fonctionne. Merci.
J'ai voulu rajouter un critère de la col "ETAT" = "En cours".
J'ai remplacé la ligne : TRés(L, C) = TRés(L, C) + Détail(nC_BUD)
Par : TRés(L, C) = TRés(L, C) + Détail.SommeSi(nC_ETAT, "En cours", nC_BUD)
J'ai le message d'erreur suivant : "Erreur d'exécution 424, Objet requis"
Les valeurs nC_ETAT et nC_BUD sont corrects.
Par contre le code suivant fonctionne :
If Détail(nC_ETAT) = "En cours" Then TS(L, C) = TS(L, C) + Détail(nC_BUD)
Y-a-t-il de restriction pour l'utilisation de SommeSi ?
Merci d'avance
KIM
 

Pièces jointes

  • GigogneKIM_RecapParTrancheAge_v1E.xlsm
    32.4 KB · Affichages: 29
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Détail n'est pas un objet mais un Variant contenant une table. Il n'a donc ni propriété ni méthode.
En degors de la boucle Détail, derrière par exemple, serai correct :
VB:
          Next Détail
            TRés(L, C) = Eqp.SommeSi(nC_ETAT, "En cours", nC_BUD)
            Next Eqp, Site, Serv, Dpt
 

KIM

XLDnaute Accro
Merci Dranreb,
Pour retrouver le bon compte j'au dû écrire :
TRés(L, C) = TRés(L, C) + Eqp.SommeSi(nC_ETAT, "En cours", nC_BUD)
Que comptalise donc : TRés(L, C) = Eqp.SommeSi(nC_ETAT, "En cours", nC_BUD)
Bon we
KIM
 
Dernière édition:

KIM

XLDnaute Accro
Bonjour Dranreb,
Dans certains de tes posts je retrouve :
For Each DPT In Gigogne(PlgSrc, 1, 10, 2, 2, ColTitre)
ou
For Each DR In Gigogne(PlgSrc, 1, 10, , 2, ColTitre)

Dans la ligne Gigogne, quelle est la signification d'une même colonne qui se répète ou 2 séparateurs (,) sans num de col ?
Merci d'avance
KIM
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Deux numéros de colonnes identique, ça m'étonnerait vraiment. Ça n'aurait pas de sens
Par contre un numéro omis entre dans la catégorie visée par cette partie de la description du paramètre ColOrd de la fonction Gigogne dans l'aide de GigIdx :
À part ça, un élément non numérique ou omis dans la liste marquera la fin des colonnes
définissant l'organisation du résultat, mais des colonnes supplémentaires spécifiées
derrière pourront encore influencer le classement des lignes de détail.
 

KIM

XLDnaute Accro
Bonjour Dranreb et le forum,
Je reviens vers toi concernant la fonction SommeSI. Je l'utilise régulièrement quand j'ai une seule condition. par exemple :
Je remplis les 2 col d'un tableau TS():
Col 1, 1 condition : TS(L, 1) = TS(L, 1) + DR.SommeSi(nC_RT, [app], nC_SURFP)
Col2, 2 conditions : j'utilise la commande Extraire :
DR.Extraire TSURFP, nC_SURFP
DR.Extraire TCOND, nC_FCT
DR.Extraire TRT, nC_RT
For N = 1 To UBound(TSURFP)
If TRT(N) = [app] Then
' TS(L, 1) = TS(L, 1) + TSURFP(N)
If TCOND(N) = "En cours" Then
TS(L, 2) = TS(L, 2) + TSURFP(N)
End If
End If
Next N
Next DR

Résulta est correct. Par contre, pour faciliter le code et la lecture, y-a-t-il une autre possibilité d'utiliser SommeSi avec 2 conditions ou SommeSi imbriquée dans SommeSi ?
DR.SommeSi(nC_RT, [app], nC_FCT, "En cours", nC_SURFP) ou
SommeSi(SommeSi(nC_RT, [app], nC_SURFP), nC_FCT, "En cours", nC_SURFP)
J'ai essayé de modifier SommeSi mais sans résultat.
Merci d'avance
KIM
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Non, ce n'est pas possible
Pour écrire une méthode SommeSiEns il faudrait lui mettre un ParamArray pour que le nombre de paramètre soit variable. Mais ça poserait un problème pour son appel récursif s'il est utilisé sur un SsGr autre que celui d'une dernière colonne contenant directement les lignes Détail.
 

Dranreb

XLDnaute Barbatruc
Une chose qui pourrait être faite assez simplement ce serait une méthode que renverrait un tableau 2D de toutes les lignes Détail attachées à un SsGr. Comme ça au moins au lieu de trois appels à la méthode Extraire on pourrait n'invoquer qu'une fois cette méthode et travailler avec le tableau. Guère plus compliqué: n'y renvoyer que certaines colonnes des lignes détails. Mais est-ce que ça simplifierait, vu qu'il faudrait de toute façon les préciser, alors autant les préciser lors de l'exploitation du tableau complet ?
Mais même ça me parait superflu. Quitte à devoir explorer quelque chose, en l'occurrence le tableau obtenu, autant explorer les lignes Détail par la voie normale.
Un SsGr peut être exploré plusieurs fois si nécessaire pour des besoins différents. On n'a jamais dit que pendant qu'on était positionné sur un certain SsGrX, il ne devait y avoir dedans qu'une seule boucle For Each SsGrY In SsGrX.Co
 

Discussions similaires

Réponses
1
Affichages
356

Statistiques des forums

Discussions
312 184
Messages
2 086 008
Membres
103 088
dernier inscrit
Psodam