XL 2010 Paramétrer une macro pour charger un ou plusieurs tableaux

KIM

XLDnaute Accro
Bonjour le Forum, bonjour les ami(e)s,
Avec les modules de classe de Dranreb que j'en remercie vivement ainsi que le forum, j'ai créé une macro T_ParOP_DR_SITE_vT012 de synthèse avec en finale 3 tableaux liés TS, TSdr et TSop à charger dans une seule feuille (FT02) à partir de la ligne 4.
Application.EnableEvents = False
FT02.[A4].Resize(1000000, CFin).ClearContents
FT02.[A4].Resize(L, CFin).Value = TS
FT02.[A50].Resize(Ld, CFin).Value = TSdr
FT02.[A70].Resize(Lo, CFin).Value = TSop
Application.EnableEvents = True

Selon le besoin je dois charger dans la feuille FT02 1 ou 2 ou l'ensemble de ces tableaux et dans un ordre selon la demande. Pour éviter de créer 3 macros, 1 macro par tableau,
1/ Est-il possible de créer une autre macro paramétrée basée sur la macro T_ParOP_DR_SITE_vT012 pour le chargement de ces tableaux selon le besoin, en paramètre le nom des tableaux ? ou autre méthode ?
2/ le début de chaque tableau est figé, ligne 4, ou 50 ou 70, est-il possible de les charger l'un après l'autre avec un décalage de 5 lignes car les données évoluent et les lignes ne sont pas figées?
Merci d'avance pour votre aide
KIM
 

Pièces jointes

  • KIM_GiGg_20170508.xlsm
    369.8 KB · Affichages: 36

Dranreb

XLDnaute Barbatruc
Bonsoir.
Il serait possible de déclarer derrière Option Explicit:
VB:
Public TS(), TSdr(), TSor(), L&, Ld&, Lo&
Les retirez des déclarations locales dans la Sub, y retirer également les écritures tout à la fin, de façon à pouvoir les faire dans d'autres procédures.

Et pour rendre variable les emplacements de débuts, pour l'ordre actuel à peu près ça :
VB:
FT02.[A4].Resize(L, CFin).Value = TS
FT02.[A4].Offset(L + 5).Resize(Ld, CFin).Value = TSdr
FT02.[A4].Offset(L + Ld + 10).Resize(Lo, CFin).Value = TSop
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Dans un sens il y a plein d'exemples de procédures à paramètres dans mes modules de service.
Mais là ce n'est pas sûr qu'il en faille une. Ce qu'il faut déjà voir c'est comment on commande l'ordre de sortie des tableaux. Ce sera plutôt une procédure par cas avec 4 instructions chacune: l'appel de la macro qui ne fera plus que fabriquer les tableaux puis les trois sur le modèle de mon message précédent en intervertissant selon les cas.
 

KIM

XLDnaute Accro
Bonjour Dranreb et le forum,
Quand je déclare TotDR As Currency j'ai le résultat de type
1 219,35 € .
Est-ce possible d'avoir un résultat de type
1 219,35 m² en déclarant par ex TotDR As Area ou autre chose ?

Merci
KIM
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Le type Currency est représenté en mémoire par un vrai nombre entier binaire, ce qui évite des cumuls d'erreurs d'arrondis. Simplement dans sa conversion en d'autres types de données, et son édition, il est considéré que sa valeur n'est que 1/10000 de ce nombre entier. Il n'est utilisé en pratique que pour des montants. Le type de donnée usuel pour toutes autres quantités c'est As Double. Après, son affichage dépend du format de nombre de la cellule.
 

KIM

XLDnaute Accro
Bonsoir Dranreb,
Calculer les sommes et le nombre de bât selon une hiérarchie OP/DP/SITE/BAT et générer 3 tableaux, détaillé, par DR et par OP n'est plus un problème pour moi. voir l'onglet T013.
Maintenant j'ai créer un recap selon une colonne de référence pour les titres de colonne du tableau Recap avec DCols.
Set DCols = DicInvent(PlgDon, ColTitre, ColDép)
Pour chaque élément de DCols, j'ai pu calculer la surface des bât concernés, col 13 à 18 de l'onglet T015.
Ensuite j'ai voulu calculer le nombre de bât pour chaque Détail In DCols.Keys, col 19 à 23 et un total par ligne col 24.
Macro Sub T_ParOP_DR_SITE_vT015()
Je galère et te remercie par avance de ton aide
KIM
 

Pièces jointes

  • KIM_20170508.xlsm
    428.1 KB · Affichages: 32

Dranreb

XLDnaute Barbatruc
Bonsoir.
J'ai une impression de déjà vu, là, ou de réchauffé…
Et il m'est un peu difficile de me replonger la dedans.
Mais encore une fois au niveau Détail il vaut mieux tout cumuler dans TS, y compris les comptages, et à la fin cumuler TS(L, C) dans une table de totaux qui sert à tous les totaux.
Enfin à moi ça me parait plus simple d'ajouter 1 dans la bonne colonne de TS que de le faire dans une table spéciale, parce qu'après on ne se pose plus de question pour les totaux, ça va dans le même moule que les surfaces.
Il y avait juste un cas dont je ne me rappelle plus bien où il avait fallu prévoir un truc spécial parce qu'on ne pouvait pas savoir dans quelle colonne cumuler une chose avant d'avoir examiné les détails. Mais là ça ne semble pas être le cas.
 

KIM

XLDnaute Accro
Bonsoir Dranreb et le forum,
Je passe aux surfaces des locaux selon leur usage. La surface des locaux et en col 25. Col32 est à Oui si la surface du local est à déduire de la surface globale des locaux. Col 27 est la liste des usages qui deviennent les titres des colonnes (DCols).
Par Usage, je calcule la surface des locaux avec :
For Each Détail In STATUT.Co
If Détail(32) <> "Oui" Then TS(L, C) = TS(L, C) + Détail(25)
Next Détail
Si la col32 est à Oui, la surface de la col25 n'est pas prise en compte.
Au niveau du site je calcule aussi la surface des locaux du site par :
TS(L, 10) = TS(L, 10) + SIT.Somme(25)
Ma question : A ce niveau là comment calculer TS(L,10) correctement en supprimant les surfaces de la col25 dont la col32 est à Oui sans créer une col supplémentaire pour traduire les Oui en surface ?
Une partie du code :
L = 1: Lo = 1: Ld = 1
For Each OP In Gigogne(PlgDon, 10, 1, 2, 8, ColTitre) 'OP/DR/SITE/BAT/STATUT
For C = 4 To CFin: TotOP(C) = 0: Next C
Lo = Lo + 1: TSop(Lo, 1) = "Total " & OP.Id
Ld = Ld + 1: TSdr(Ld, 1) = "OP " & OP.Id

For Each DR In OP.Co
For C = 4 To CFin: TotDR(C) = 0: Next C
For Each SIT In DR.Co
L = L + 1
TS(L, 1) = OP.Id
TS(L, 2) = DR.Id
TS(L, 3) = SIT.Id
TS(L, 4) = SIT.Count 'Nb BAT
For C = 4 To CFin: TOccS(C) = 0: TOccS(C) = 0: Next C

For Each BAT In SIT.Co
If Right$(BAT.Id, 1) = "0" Then TS(L, 5) = TS(L, 5) + 1
For Each STATUT In BAT.Co
C = DCols(STATUT.Id)

For Each Détail In STATUT.Co
'Calcul de la surface des locaux par usage sans prendre en compte les surfaces à déduire, col32 à Oui
If Détail(32) <> "Oui" Then TS(L, C) = TS(L, C) + Détail(25): Next Détail

NbD(C) = NbD(C) + STATUT.Count: Next STATUT

TS(L, 6) = TS(L, 6) + BAT.Count: Next BAT 'Nb lignes
TS(L, 8) = Empty: TS(L, 9) = Empty

TS(L, 10) = TS(L, 10) + SIT.Somme(25) 'Surface des locaux
'Comment supprimer de SIT.Somme(25) les surfaces des locaux dont col32 à Oui ?

For C = ColDép To ColDép + DCols.Count - 1: TS(L, ColDép + DCols.Count) = TS(L, ColDép + DCols.Count) + TS(L, C): Next C
For C = 4 To CFin: TotDR(C) = TotDR(C) + TS(L, C): Next C, SIT

Merci d'avance
KIM
 

KIM

XLDnaute Accro
Bonjour Dranreb,
En effet, le Next Détail qui suit ne peut pas être mis sur la même ligne. ci-joint le fichier avec le code suivant (résultat dans l'onglet U01).
Pour chaque usage, j'ai la bonne surface des locaux après avoir déduit ceux dont la col32 est à Oui :
For Each Détail In STATUT.Co
If Détail(32) <> "Oui" Then TS(L, C) = TS(L, C) + Détail(25)
Next Détail
Par contre pour la surface des locaux par site je n'ai pas réussi à déduire la surface des locaux dont la col32 est à Oui :
TS(L, 10) = TS(L, 10) + SIT.Somme(25) 'Surface des locaux

As-tu une idée sans rajouter une col supplémentaire ?
Merci encore
KIM

Sub T_ParOP_DR_SITE_vU00()
....

L = 1: Lo = 1: Ld = 1
For Each OP In Gigogne(PlgDon, 10, 1, 2, 8, ColTitre)
For C = 4 To CFin: TotOP(C) = 0: Next C
Lo = Lo + 1: TSop(Lo, 1) = "Total " & OP.Id
Ld = Ld + 1: TSdr(Ld, 1) = "OP " & OP.Id

For Each DR In OP.Co
For C = 4 To CFin: TotDR(C) = 0: Next C

For Each SIT In DR.Co
L = L + 1
TS(L, 1) = OP.Id
TS(L, 2) = DR.Id
TS(L, 3) = SIT.Id
TS(L, 4) = SIT.Count 'Nb BAT
For C = 4 To CFin: TOccS(C) = 0: TOccS(C) = 0: Next C

For Each BAT In SIT.Co
If Right$(BAT.Id, 1) = "0" Then TS(L, 5) = TS(L, 5) + 1
For Each STATUT In BAT.Co
C = DCols(STATUT.Id)

For Each Détail In STATUT.Co
If Détail(32) <> "Oui" Then TS(L, C) = TS(L, C) + Détail(25)
Next Détail

NbD(C) = NbD(C) + STATUT.Count: Next STATUT
TS(L, 6) = TS(L, 6) + BAT.Count: Next BAT 'Nb lignes

TS(L, 10) = TS(L, 10) + SIT.Somme(25) 'Surface des locaux
...
End Sub
 

Pièces jointes

  • KIM_20170530.xlsm
    435.2 KB · Affichages: 33

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 885
Membres
101 830
dernier inscrit
sonia poulaert