Option Explicit
Private Sub Worksheet_Activate()
   Dim LOtDoc As ListObject, C As Long, L As Long, RngRenv As Range, TSrc(), CelTit As Range, RngDonn As Range, Wsh As Worksheet, _
      TSyn(), Code As SsGr, Détail, Dsgn As String, LDéb As Long, CEstLeDébut As Boolean, IlFautAvancer As Boolean, CEstUneSuite3ou4 As Boolean
      
Rem. — Analyse de la documentation.
   Set LOtDoc = WshDoc.ListObjects("TabDoc")
   For C = 2 To 5 ' Colonnes des sources.
      Set RngRenv = LOtDoc.ListColumns(C).DataBodyRange ' Récupère la colonne des renvois aux titres.
      For L = 1 To RngRenv.Rows.Count
         If RngRenv.Rows(L).HasFormula Then ' Pour chaque cellule portant une formule :
            Set CelTit = Evaluate(RngRenv.Rows(L).Formula)
            If RngDonn Is Nothing Then                ' Initialisations plage et tableaux impliqués.
               Set Wsh = CelTit.Worksheet
               Set RngDonn = Intersect(Wsh.Rows(CelTit.Row + 1).Resize(1000000 - CelTit.Row), Wsh.UsedRange)
               TSrc = RngDonn.Value
               ReDim TCbl(1 To UBound(TSrc), 1 To 14)
               End If
            GarnirColonne TCbl, L, TSrc, CelTit.Column ' Transfère les valeurs de la colonne.
            End If
         Next L
      AjouterTableau TCbl ' La fonction TableUniqueCréée renvera dans un seul les tableaux ainsi mis bout à bout.
      Set RngDonn = Nothing
      Next C
      
Rem. — Préparation du résultat.
   ReDim TSyn(1 To 5000, 1 To 14)
   L = 0
   For Each Code In Gigogne(TableUniqueCréée, 2) ' Renvoie une Collection d'éléments de type SsGr à raison d'un pour chaque Code (colonne 2).
      CEstLeDébut = True: IlFautAvancer = True
      LDéb = L + 1
      For Each Détail In Code.Co
         CEstUneSuite3ou4 = Détail(0) > 2
         If CEstLeDébut And CEstUneSuite3ou4 Then Exit For
         If CEstLeDébut Then Dsgn = Détail(3) Else Détail(3) = Dsgn
         If CEstUneSuite3ou4 Then IlFautAvancer = True
         If IlFautAvancer Then L = L + 1
         If Détail(7) = "R" Then Détail(7) = "Rupture"
         If Détail(0) = 3 Then Détail(12) = Détail(12) + Détail(14)
         For C = 1 To 13
            If Not IsEmpty(Détail(C)) And IsEmpty(TSyn(L, C)) Then TSyn(L, C) = Détail(C)
            Next C
         CEstLeDébut = False: IlFautAvancer = CEstUneSuite3ou4: Next Détail
      If L = LDéb + 1 Then
         TSyn(LDéb, 1) = TSyn(L, 1)
         For C = 11 To 13: TSyn(LDéb, C) = TSyn(L, C): Next C
         For C = 1 To 13: TSyn(L, C) = Empty: Next C
         L = L - 1
      ElseIf L > LDéb Then
         TSyn(LDéb, 11) = "=SUBTOTAL(9,OFFSET([@[Qté Cdée]],1,0," & L - LDéb & ",1))"
         TSyn(LDéb, 12) = "=SUBTOTAL(9,OFFSET([@[Qté Prép]],1,0," & L - LDéb & ",1))"
         End If
      Next Code
   With Me.ListObjects(1)
      If .ListRows.Count > L Then .ListRows(L + 1).Range.Resize(.ListRows.Count - L).Delete xlShiftUp
      Me.[A2:N5001].ClearContents
      .DataBodyRange.Resize(L, 13).Value = TSyn
      End With
   End Sub