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,
Les évolutions de mes tableaux avancent.
Dans l'onglet Base2, je calcule l'âge de chaque BAT selon 4 tranches.
Dans la Feuil recap "R42", le tableau synthèse est un récap par SRC/DPT/SITE/BAT et rajouté :
- le libellé de chaque DT
- le nombre de BAT principaux (Right$(BAT.Id, 1) = "0") pour chaque SITE et total par DTxx (col 5)
- la surface des BAT pour chaque tranche d'âge par SITE et total par DT.

Je suis confronté actuellement à un nouveau mode de calcul et je sollicite ton aide.
Après chaque tranche d'âge j'ai rajouté une colonne pour calculer le nombre de BAT par Tranche d'âge (cellule de la col de la tranche d'age <>0 dans l'onglet Base2) et par SITE et ensuite le total par DT et le total global par SRC comme les autres calculs. J'ai calculé la surface de chaque tranche d'âge par site (TS(L, 15) + Détail(30), etc;). J'ai besoin dans la col suivante du nombre de BAT de cette tranche d'age.
ci-joint le fichier avec la macro "Recap_Synthese_ParSRC_DPT_SITE_vR46()" qui génère la synthèse ci-dessus.
Merci de ton aide.
KIM
 

Pièces jointes

  • T_RecapGigg_NvKIM42R.xlsm
    388.6 KB · Affichages: 30

Dranreb

XLDnaute Barbatruc
Bonjour.
Ce ne serait pas possible d'avoir dans les données juste une paire de colonnes identifiant la tranche d'age et les m² ?
Mais même avec ça rien ne me garantit qu'un même bâtiment ne vas pas avoir plusieurs lignes avec des tranches d'age différentes.
Sous ces réserves, et dans l'état actuel des données on peut prévoir un tableau TOccParAge() As Long, en remettre à 0 les postes après For Each BAT et faire lors du détail
If Détail(29) <> 0 Then TS(L, 13) = TS(L, 13) + Détail(29): TOccParAge(14) = 1
et avant le Next BAT:
TS(L, 14) = TL(1, 14) + TOccParAge(14)
Pareil pour les autres tranches d'age, et ça pourrait se faire par des boucles
 

KIM

XLDnaute Accro
Bonjour Dranreb,
Je continue mon expérience avec Gigogne. Le dernier tableau de synthèse était un récap des surfaces par SITE, DPT et SRC, l'âge et le nombre de bâtiments par tranche d'âge.
La synthèse suivante est une répartition de la surface SUB (Col 17) par STATUT (col 16).
J'ai donc
- défini la colonne des titres (col 16),
- déclaré DCols : Set DCols = DicInvent(PlgDon, ColTitre, ColDép)
-créé les titres des colonnes For Each Détail In DCols.Keys: C = C + 1: TS(1, C)
- rajouté un SsGr STATUT après le BAT

Avant de passer au nombre de bâtiment par STATUT (col 19 à 26), je ne retrouve pas les surfaces correctes par STATUT (col 11 à 17) et aussi une différence dans le nombre des bâtiments de la col 6 (Nbre de lignes).
La macro Recap_Synthese_ParSRC_DPT_SITE_vR43() génère un tableau de synthèse dans l'onglet R43.

Merci de ton aide
KIM
 

Pièces jointes

  • T_RecapGigg_NvKIM42R.xlsm
    453.4 KB · Affichages: 27

Dranreb

XLDnaute Barbatruc
Bonjour.
À première vue, vu l'endroit où tu fait TS(L, C) = TotSTATUT(C), tu ne va y retrouver que les chiffres du dernier bâtiment. Pourquoi ne pas cumuler dans TS(L, C) ? C'est plus simple ! Pas de remise à 0 préalable à faire (risquée au mauvais endroit): quand on attaque une nouvelle ligne le poste est à Empty ce qui équivaut à 0 quand on cumule dedans. Après on reporte à chaque niveau dans les TotDR, TotSRC etc.
 

KIM

XLDnaute Accro
Rebonjour,
J'essaye d'avancer mais je constate que je me noie facilement dans les sous-totaux. J'ai créé un tableau avec une variable pour chaque sous-total ce qui a alourdi le code. Je n'ai pas réussi à reporter les TotDR et TotSRC comme dans le code du tableau de l'onglet R42.
Merci d'avance pour ton aide
KIM
 

Dranreb

XLDnaute Barbatruc
Mais commence par cumuler dans TS et non pas dans d'autres tableaux.
On n'a pas besoin d'un truc particulier comme TOccParAge du fait que c'était des bâtiments qu'on voulais compter et non pas les lignes détails, mais sans pouvoir savoir dans quelle colonne il fallait ajouter 1, avant d'avoir examiné les lignes détails.
Le reste devrait être fait automatiquement par For C = 4 To CFin: TotDR(C) = TotDR(C) + TS(L, C): Next C, SIT
 

KIM

XLDnaute Accro
Re,
J'ai cumulé dans TS. J'ai cumulé les TS par site pour le calcul de la col 18. Les cumuls des surfaces sont corrects, J'ai un résultat identique des col 10 (SIT.Somme(17)) et col 18. j'ai seulement une différence dans le résultat de la col6 (Nb de lignes) que je n'ai pas pu expliquer.
Peut-on optimiser le code de la macro Recap_Synthese_ParSRC_DPT_SITE_vR43
Il reste le calcul du nombre de BAT par STATUT (Col 19 à 25 et cumul col 26).
Où placer les .Count?
Merci encre
KIM
 

Pièces jointes

  • T_RecapGigg_NvKIM43R.xlsm
    446.8 KB · Affichages: 39

Dranreb

XLDnaute Barbatruc
Bat.Nombre devrait donner le nombre de lignes par BAT. Bat.Count, lui, dans ce rapport, donne le nombre de STATUT par BAT
Après la constitution du dico je calculerai une variable Décal = DCols.Count + 1 pour sauter aussi la surface totale.
Ceci pour avoir par C + Décal la colonne où envoyer les Count.
Mais le nombre de BAT par STATUT ce n'est pas possible avec cet ordre de classement. Il faudrait déjà que le STATUT soit avant le BAT.
Tout a l'air de m'indiquer que c'est ce qu'il aurait fallu faire. D'autant que BAT.Count redeviendrait le nombre de lignes par BAT.
Tu n'a apparemment pas encore le réflexe de réfléchir au moyen le plus commode de renseigner le tableau, de bien planifier ça mentalement, et de programmer l'appel de la fonction Gigogne en conséquence. (Il est vrai que c'est, ou plutôt c'était …un métier ! ;))
 
Dernière édition:

KIM

XLDnaute Accro
Bonjour Dranreb,
Je pensais que la colonne des titres doit être à la dernière dans la déclaration de Gigogne.
En effet je viens de modifier l'ordre de classement, STATUT avant BAT. Dans mon 1é tableau de synthèse je retrouve l'ensemble des données sans doublons de STATUT ligne par ligne.
Je vais essayer de préparer un autre tableau de synthèse avec les données STATUT comme titre de colonne.
Merci pour les conseils
KIM
 

KIM

XLDnaute Accro
Bonjour Dranreb,
Je continue avec ta dernière version de Gigogne et SsGr. Je dois faire actuellement du graphique avec les données du tableau de synthèse.
Ma question, au hasard as-tu un module de classe pour la construction des graphiques à l'identique de ceux pour la construction des tableaux de synthese ?
Merci d'avance
KIM
 

KIM

XLDnaute Accro
Bonjour Dranreb,
Bonjour le fil et le forum,
Je reviens vers toi concernant tes modules de service GigIdx. A chaque réception du tableau mensuel à traiter je dois modifier certaines lignes de code pour positionner les numéros de colonne car l'ordre des colonnes n'est pas toujours respecté. Pour éviter ce contrôle à chaque fois,
est-il possible de remplacer dans les fonctions par exemple
Gigogne(PlgDon, 17, 1) ou Détail(13) et d'autres
les numéros de colonnes par une variable.
Par exemple Gigogne(PlgDon, 17, 1) devient Gigogne(PlgDon, CDepCol, CSiteCol)

As-tu une fonction qui me retourne le numero de colonne pour un titre donné en argument.
j'utilise actuellement danscertains macros le code suivant

With ActiveSheet.Range("4:4")
Set C = .Find("*Centre*dépenses*", LookIn:=xlValues)
If Not C Is Nothing Then
CDepCol = C.Column
Else
testerr = 1
CommErr = CommErr & "*Centre*dépenses*" & " / "
End If
End With

With ActiveSheet.Range("4:4")
Set C = .Find("*Site régional*", LookIn:=xlValues)
If Not C Is Nothing Then
CSiteCol = C.Column
Else
testerr = 1
CommErr = CommErr & "*Centre*dépenses*" & " / "
End If
End With

Merci d'avance
KIM
 

Discussions similaires

Réponses
1
Affichages
345