Bonsoir Dranreb,
J'ai réduit au minimum le code pour aller l'essentiel. Les SsGr sont déclarés sans l'ordre : OP/DR/SITE/BAT/STATUT
Jusqu'à maintenant j"avais dans mes données une ligne par BAT. Maintenant j'ai plusieurs lignes par BAT. Les doublons concernent le code du BAT et les 2 surfaces du BAT SUB et SUN.
Tous les calculs sont bons sauf pour les 2 col 10 et 11. La surface SUB et SUN par site cumule les doublons. J'ai testé plusieurs codes mais je n'ai pas réussi à calculer la bonne surface sans les doublons.
J'ai besoin de ton aide et t'en remercie par avance.
KIM
Sub T_ParOP_DR_SITE_vU001()
Dim PlgDon As Range, TS(), L&, C&, DR As SsGr, OP As SsGr, SIT As SsGr, BAT As SsGr, STATUT As SsGr, Détail
Dim TotOP() As Double, TotDR() As Double
Dim CFin As Long, LFin As Long
Dim DCols As Dictionary, ColTitre As Long, ColDép As Long
ColTitre = 27
ColDép = 13
Set PlgDon = ColUti(FBase4.[A10:AI10])
Set DCols = DicInvent(PlgDon, ColTitre, ColDép): CFin = ColDép + DCols.Count
LFin = PlgDon.Rows.Count
ReDim TS(1 To LFin, 1 To CFin), TotOP(4 To CFin), TotDR(4 To CFin)
'
For C = 1 To ColDép - 1: TS(1, C) = Array("OP", "DP", "SITE", "Nb BAT", "Nb BatP", "Nb lignes", "Nb sites", "Nb DR", "", "SUB", "SUN", "Surf Locaux")(C - 1): Next C
C = C - 1: For Each Détail In DCols.Keys: C = C + 1: TS(1, C) = Détail: Next Détail
C = C + 1: TS(1, C) = "Surface Totale"
'
FU01.[A4].Resize(1, CFin).Value = TS
L = 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
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 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): TS(L, 12) = TS(L, 12) + Détail(25)
Next Détail
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) = SIT.Somme(15)
TS(L, 11) = SIT.Somme(16)
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
L = L + 1
TS(L, 1) = "Total " & OP.Id & " de la ": TS(L, 2) = DR.Id: TotDR(7) = DR.Count 'Nb sites
For C = 4 To CFin: TS(L, C) = TotDR(C): TotOP(C) = TotOP(C) + TotDR(C): Next C
TS(L, 8) = Empty: TS(L, 9) = Empty
L = L + 1: Next DR
L = L + 1: TS(L, 1) = "Total pour " & OP.Id: TotOP(8) = OP.Count 'Nb OP
For C = 4 To CFin: TS(L, C) = TotOP(C): Next C
L = L + 1: Next OP
Application.EnableEvents = False
FU01.[A4].Resize(1000000, CFin).ClearContents
FU01.[A4].Resize(L, CFin).Value = TS
Application.EnableEvents = True
End Sub