Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
If Target.Address <> "$A$1" Then Exit Sub 'si le changement a lieu ailleurs qu'en A1, sort de la procédure
Rows("6:" & Application.Rows.Count).Delete 'supprime les anciennes données
If Target.Value = "" Then Exit Sub 'si A1 est effacée, sort de la procédure
'Set D = CreateObject("Scripting.Dictionary")
For Each O In Worksheets 'boucle 1 : sur tous les onglets O
Select Case O.Name 'agit en fonction du nom de l'onglet de la boucle
Case "État", "STOCKS" 'cas où rien ne se passe
Case Else 'tous les autres cas
TV = O.Range("A5").CurrentRegion 'définit le tableau des valeurs TV
For I = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs (en partant de la seconde)
'condition : si la destination de la donnée ligne I colonne 3 de TV correspond à la valeur de la cellule A1
If TV(I, 3) = Target.Value Then
Li = IIf(Range("A6").Value = "", 6, Cells(Application.Rows.Count, "A").End(xlUp).Row + 1) 'définit la ligne LI
Cells(Li, "A").Value = O.Name 'renvoie le nom de l'onglet O dans la cellule ligne LI colonne A
'renvoie dans la cellule ligne LI colonne B redimensionnée la ligne I du tableua TV
Cells(Li, "B").Resize(1, UBound(TV, 2)).Value = Application.Index(TV, I)
End If 'fin de la condition
Next I 'prochaine ligne de la boucle 2
End Select 'fin de l'action en fonction du nom de l'onglet de la boucle
Next O 'prochain onglet de la boucle 1
End Sub