Option Explicit 'oblige à déclarer toutes les variables
Private TEST As Boolean 'déclare la variable TEST
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'au changement dans tous les onglets
Dim OG As Worksheet 'déclare la variable OG (Onglet Globale)
Dim TG As ListObject 'déclare la variable TG (Tableau structuré Globale)
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TS As ListObject 'déclare la variable TS (Tableau Structuré)
Dim I As Integer 'déclare la variable I (incrément)
Dim R As Range 'déclare la variable OG (Onglet Globale)
Dim LI As Integer 'déclare la variable LI (LIgne)
Set OG = Worksheets("Globale") 'définit l'onglet OG
Set TG = OG.ListObjects(1) 'définit le tableau structuré TG
If TEST = True Then Exit Sub 'si TEST est [vrai], sort de la procédure
If Not Sh.Name = "Globale" And Not Sh.Name = "Modèle" Then 'condition 1 : si le nom de l'onglet où a lieu le changement n'est ni "Globale" ni "Modèle"
TEST = True 'définit la variable TEST (pour éviter la boucle sur l'événement change)
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
TG.DataBodyRange.ClearContents 'efface le contenu de TG (génère une erreur si TG est vide)
TG.Resize Range(TS.HeaderRowRange(1, 1), TS.DataBodyRange(1, TS.ListColumns.Count)) 'redimaneionne TG
On Error GoTo 0 'annule la gestion des erreurs
For Each O In Sheets 'boucle 1 : sur tous les onglets du classeur
If Not O.Name = "Globale" And Not O.Name = "Modèle" Then 'condition 2 : si le nom de l'onglet n'est ni "Globale" ni "Modèle"
Set TS = O.ListObjects(1) 'définit le tableau structuré TS (celui de l'onglet de la boucle)
For I = 1 To TS.ListRows.Count 'boucle sur toutes les lignes I du tableau structuré TS
'condition 3 : si l'état est "à faire" ou "urgent"
If TS.DataBodyRange(I, 4) = "À FAIRE" Or TS.DataBodyRange(I, 4) = "URGENT" Then
Set R = TG.ListColumns(1).Range.Find("") 'définit la recherche R (recherche du vide dans la colonne 1 du tableau structuré TG)
If R Is Nothing Or TG.ListRows Is Nothing Then 'condition 3 : si aucune occurrence n'est trouvée ou si TG n'a pas de ligne
TG.ListRows.Add 'ajoute une ligbe à TG
LI = TG.ListRows.Count 'définit la ligne LI
Else 'sinon (au moins une occurrence trouvée)
LI = R.Row - TG.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée - la ligne des en-têtes)
End If 'fin de la condition 3
TG.DataBodyRange(LI, 1).Value = O.Name 'récupère le nom de l'onglet en colonne 1 de TG
TG.DataBodyRange(LI, 2).Value = TS.DataBodyRange(I, 2) 'récupère la tâche en colonne 2 de TG
TG.DataBodyRange(LI, 3).Value = TS.DataBodyRange(I, 4) 'récupère l'état en colonne 3 de TG
TG.DataBodyRange(LI, 4).Value = TS.DataBodyRange(I, 3) 'récupère la date butoir en colonne 4 de TG
End If 'fin de la condition 3
Next I 'prochaine ligne de la boucle 2
End If 'fin de la condition 2
Next O 'prochain onglet de la boucle 1
End If 'fin de la condition 1
TEST = False 'redéfinit la variable TEST
End Sub