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,
J'essaye d'avancer en utilisant tes recommandations,
1- Dans les 2 premières lignes de la macro, j'ai le message suivant "L'indice n'appartient pas à la sélection" au niveau du Next C. La valeur de C reste à 1.
For C = 1 To 10: TS(1, C) = Choose(C, "OP", "DPT", "SITE", "SUB", _
"", "", "A+D+F", "B+C+G", "E", "Total"): Next C
2- Où utiliser ColGrStat.Id dans la macro ?
Les autres macros de synthèse et de récap fonctionnent par contre je n'arrive pas à avancer avec celle là.

Merci de ton aide
KIM
Ci-dessous la macro Synthese_ParOP_DPT_Site_GrouperCol_v3
Sub Synthese_ParOP_DPT_Site_GrouperCol_v3()
'Synthese R3

Dim Données As Range, DCols As Dictionary, TS(), CFin As Long, L As Long, C As Long, Détail, _
DR As SsGr, TotDR As Double, SITE As SsGr, TotSite As Double, Statut As SsGr, Tot As Double
Dim OP As SsGr, TotOP As Double
Dim NbDR As Long, NbSite As Long, DRtot As Double, TotGlobal As Double, NbC(), NbG()
Dim ColTitre As Long, TotOP_G As Long, TotDR_G As Long, TotSite_G As Long
Dim TitOP As Range, TitDR As Range, TitDét As Range
Dim TotD(), TSpl(), TE(), TotG(), N

For C = 1 To 10: TS(1, C) = Choose(C, "OP", "DPT", "SITE", "SUB", _
"", "", "A+D+F", "B+C+G", "E", "Total"): Next C

Set DCols = New Dictionary
For C = 7 To 9: TSpl = Split(TS(1, C), "+")
For N = 0 To UBound(TSpl): DCols(TSpl(N)) = C: Next N, C

TE = ColUti(FBase1.[A5:p5]).Value
For L = 1 To UBound(TE, 1)
If Not DCols.Exists(TE(L, 16)) Then MsgBox "Statut """ & TE(L, 16) & """ non prévu.", vbCritical: Exit Sub
TE(L, 16) = DCols(TE(L, 16)): Next L
L = 1

For Each OP In Gigogne(TE, 10, 1, 2, 16)
TotOP = 0

For Each DR In OP.Co
TotDR = 0

For Each SITE In DR.Co
L = L + 1
TS(L, 1) = OP.Id
TS(L, 2) = DR.Id
TS(L, 3) = SITE.Id
TotSite = 0
NbDR = 0

For Each Statut In SITE.Co
C = DCols(Statut.Id)
Tot = 0

For Each Détail In Statut.Co
Tot = Tot + Détail(14): Next Détail

TS(L, C) = Tot
TotSite = TotSite + Tot
TotOP = TotOP + Tot
TotDR = TotDR + Tot
NbDR = NbDR + Statut.Count
TotG(C) = TotG(C) + Tot: TotG(CFin) = TotG(CFin) + Tot
TotD(C) = TotD(C) + Tot

NbG(C) = NbG(C) + Statut.Count: NbG(CFin) = NbG(CFin) + Statut.Count
Next Statut

TS(L, 4) = TotSite
TS(L, CFin) = TotSite: Next SITE

L = L + 1: TS(L, 2) = "Total DPT": TS(L, 4) = TotDR: TS(L, CFin) = TotDR
L = L + 1: Next DR

L = L + 1: TS(L, 1) = "Total OP": TS(L, 4) = TotOP: TotGlobal = TotGlobal + TotOP: L = L + 1: Next OP
L = L + 1

L = L + 1: TS(L, 1) = "Total"
TS(L, 4) = TotGlobal
For C = 7 To CFin
TS(L, C) = TotG(C)
TS(L + 1, C) = NbG(C)

Next C
FR3.[4:1000].ClearContents
FR3.[A4].Resize(1000, CFin).Value = TS
End Sub
 

Pièces jointes

  • T_RecapGigogne_vKIM2E1.xlsm
    310.6 KB · Affichages: 47

ChTi160

XLDnaute Barbatruc
Bonsoir KIM
Bonsoir le Fil "Dranreb" , Le Forum
j'ai retrouvé un fichier qui date et qui me rappelle ce genre de travaux . LOL
je n'ai pas poursuivie , mais je me suis bien amusé Lol
On peut choisir (sélection simple ou Multiple) Département, Bâtiment ,Site , puis faire le Cumul , selon le choix .Mais , c'est pas tout jeune ça !!!! lol
pour ce qui est de la demande de KIM
j'avais dimensionné le tableau TS(),mais ensuite , j'ai eu le même problème avec le tableau TotG() et j'ai renoncé !!! lol
Bonne continuation
Amicalement
Jean marie
 

Pièces jointes

  • RecapBatSiteLstV_ChtiCie 67kim.xlsm
    349.3 KB · Affichages: 40
Dernière édition:

Dranreb

XLDnaute Barbatruc
Je continue à tenter des exécutions.
Alors. Il faut déclarer TSpl() As String
Et il ne faut plus utiliser le DCols pour C ensuite, puisqu'on s'en est déjà servi pour mettre directement ce qu'il donne dans la colonne 16 des données avant soumission à Gigogne. C'est directement ColGrStat.Id s'il a bien été renommé comme ça.
Après, bon, y'a TotG qui n'est pas dimensionné.
Je me demande s'il ne vaudrait pas mieux simplifier, et utiliser des tableaux à 1 dimension pour tous les totaux plutôt qu'une variable élémentaire Tot, comme on aurait dû le faire si on avait renoncé à employer un SsGr pour le numéro de colonne du groupe de statuts, mais bon, à voir…
 
Dernière édition:

KIM

XLDnaute Accro
Bonjour Dranreb, Bonjour Jean Marie.
Ravi d'avoir de tes nouvelles Jean Marie.
En effet avec les outils de Dranreb et surtout son module Gigogne, on peut traiter facilement les données en colonnes et créer des tableaux de synthèses. Gigogne et les modules de classe associés sont très riches en fonctionnalités. J'essaye de les appliquer à mes divers tableaux de synthèse. Actuellement je suis confronté au regroupement de colonnes.
Dranreb, désolé de te solliciter pour finaliser ce recap. Je suis preneur de toute simplification (tableaux à une dimension, supprimer le SsGr pour le n° de colonne, etc.)
Merci d'avance,
KIM
 

Dranreb

XLDnaute Barbatruc
Alors sans SsGr pour le n°de colonne, comme ça ça me semble pas mal :
VB:
Sub Synthese_ParOP_DPT_Site_GrouperCol_v3()
'Synthese R3
Dim C As Long, TS(), DCols As Dictionary, TSpl() As String, N As Long, L As Long, _
    OP As SsGr, TotOP(7 To 10) As Double, DR As SsGr, TotDR(7 To 10) As Double, SITE As SsGr, _
    Détail, Statut As String, Montant As Double, NbG(7 To 10) As Long, TotG(7 To 10)
ReDim TS(1 To 1000, 1 To 10)
For C = 1 To 10: TS(1, C) = Choose(C, "OP", "DPT", "SITE", "SUB", _
   "", "", "A+D+F", "B+C+G", "E", "Total"): Next C
Set DCols = New Dictionary
For C = 7 To 9: TSpl = Split(TS(1, C), "+")
   For N = 0 To UBound(TSpl): DCols(TSpl(N)) = C: Next N, C
L = 1
For Each OP In Gigogne(ColUti(FBase1.[A5:P5]), 10, 1, 2)
   For C = 7 To 10: TotOP(C) = 0: Next C
   For Each DR In OP.Co
      For C = 7 To 10: TotDR(C) = 0: Next C
      For Each SITE In DR.Co
         L = L + 1
         TS(L, 1) = OP.Id
         TS(L, 2) = DR.Id
         TS(L, 3) = SITE.Id
         For Each Détail In SITE.Co
            Statut = Détail(16): Montant = Détail(14)
            If Not DCols.Exists(Statut) Then MsgBox "Statut """ & Statut & """ non prévu.", vbCritical: Exit Sub
            C = DCols(Statut)
            TS(L, C) = TS(L, C) + Montant: TS(L, 10) = TS(L, 10) + Montant
            NbG(C) = NbG(C) + 1: NbG(10) = NbG(10) + 1: Next Détail
         For C = 7 To 10: TotDR(C) = TotDR(C) + TS(L, C): Next C, SITE
      L = L + 1: TS(L, 2) = "Total DPT"
      For C = 7 To 10: TS(L, C) = TotDR(C): TotOP(C) = TotOP(C) + TotDR(C): Next C
      L = L + 1: Next DR
   L = L + 1: TS(L, 1) = "Total OP"
   For C = 7 To 10: TS(L, C) = TotOP(C): TotG(C) = TotG(C) + TotOP(C): Next C
   L = L + 1: Next OP
L = L + 1: TS(L, 1) = "Total"
For C = 7 To 10
   TS(L, C) = TotG(C)
   TS(L + 1, C) = NbG(C)
   Next C
FR3.[4:1000].ClearContents
FR3.[A4].Resize(1000, 10).Value = TS
End Sub
 

KIM

XLDnaute Accro
Re bonjour Dranreb,
Merci beaucoup, test OK.
J'ai besoin d'une explication concernant le regroupement des colonnes. Ce regroupement est sûrement basé sur TSpl. Comment TSpl est créé ?
For C = 7 To 9: TSpl = Split(TS(1, C), "+")
For N = 0 To UBound(TSpl): DCols(TSpl(N)) = C: Next N, C
J'ai vu que tu n'as pas utilisé ColGrStat. Peut-elle être utilie pour d'autres synthèse et si oui comment l'utiliser ?

Merci encore, et Bonne fêtes de Pâques
KIM
 

Dranreb

XLDnaute Barbatruc
À partir des titres mis, et à l'aide de la fonction Split qui renvoie une table de String basé 0 contenant les bout de textes séparés par un caractère délimiteur, ici le "+".

ColGrStat c'était un nom comme ça, de variable As SsGr qu'on aurait pu utiliser à condition de remplacer, d'après le même dictionnaire, les Statut de la colonne 16 par le numéro de colonne du groupe de statuts, dans une image des données rangée dans un tableau TE supplémentaire, avant sa soumission à Gigogne.
C'est la seule chose à retenir pour d'autres synthèse: Gigogne accepte aussi bien, en guise de 1er paramètre, un tableau un peu transformé selon des besoins particuliers qu'une plage brute.
 

KIM

XLDnaute Accro
Bonsoir Dranreb,
Dans la création de tableau de synthèse, il est très courant de regrouper des colonnes pour une autre synthèse, en tout cas pour moi. par exemple avec Gigogne et les SsGrp on définit la structure du 1er tableau de synthèse T1. Est-il possible de créer une fonction intégrée à tes outils qui prend en entrée le tableau T1 et les actions à faire sur les colonnes. Exemple fonction GrpCol(T1, 5+7, 8-6, 0;75*9,10) qui génère un tableau T2 dont la
T2:Col 5 = T1:(Col 5 + Col 7)
T2:Col 6 = T1:(Col8 - Col6)
T2:Col7 = T1:(0,75*Col9)
T2:Col8 = T1:Col10
Toutes les combinaisons peuvent être possible. Est-ce possible ?
Bonne soirée et merci encore pour ta dernière solution.
KIM
 

KIM

XLDnaute Accro
Ce n'est qu'une idée. Mais si un jour tu as développé quelque chose dans ce sens je suis preneur.
Dans la suite des tableaux de synthèse,
1- j'ai une macro qui créé des onglets par exemple par DPT : Pour chaque DPT, création d'un onglet du nom du DPT et recopie du tableau de synthèse les données du DPT.
2- J'ai une autre macro qui recopie un onglet type au nom de chaque DPT et recopie les données de ce DPT selon le format défini dans l'onglet type.
Est-ce que ce type de macros peut être programmé avec tes outils ?

Bonne soirée
KIM
 

Dranreb

XLDnaute Barbatruc
Oui. C'est même le truc que ne savent pas faire les TCD
Il y a une Sub VentilaZone dans ce classeur qui fait exactement ça.
Mais elle prend le dernier onglet existant comme modèle.
 

Pièces jointes

  • GigogneAkni.xlsm
    510.5 KB · Affichages: 45

KIM

XLDnaute Accro
Bonsoir Dranreb,
Je reviens vers toi après ces quelques jours de Pâques.
Ta macro du #66 tourne bien après adaptation sur mes données. Elle créé un tableau de synthèse onglet R3.
Pour créer une ventilation selon un choix spécifique de ce même tableau de synthèse, Est-il possible de rajouter une condition If .... Then dans chacune des boucles suivantes :
For Each OP In Gigogne(ColUti(FBase1.[A5:p5]), 10, 1, 2)
For C = 7 To 10: TotOP(C) = 0: Next C
For Each DR In OP.Co
For C = 7 To 10: TotDR(C) = 0: Next C
For Each SITE In DR.Co

Par exemple, créer le même tableau de synthèse mais pour DR=DPT02 dans un onglet de nom DPT02 càd
For Each DR In OP.Co
If DR = DPT02 Then
... la suite du même code que le tableau de synthèse global.

Idem pour l'OP ou le SITE ou une combinaison de ces 3 IF ?

J'ai essayé mais j'ai toujours des erreurs de compilation. Peut-être y-a-t-il une autre méthode plus simple.

Je vais approfondir la Sub VentilaZone du #73.
Merci d'avance
KIM
 

Pièces jointes

  • T_RecapGigogne_vKIM2E12.xlsm
    340.2 KB · Affichages: 34

Discussions similaires

Réponses
1
Affichages
321