Private TEST As Boolean 'déclare la variable TEST
Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim V As Variant 'déclare la variable V (Valeur)
Dim COL As Byte 'déclare la variable COL (COLonne)
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 Byte 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
'si le changement a lieu ailleurs que dans la plage A6:E6, sort de la procédure
If Application.Intersect(Target, Range("A6:E6")) Is Nothing Then Exit Sub
If TEST = True Then Exit Sub 'si TEST est [vrai], sort de la procédure
TEST = True 'définit la variable TEST (évite la boucle sur la procédure Change)
V = Target.Value 'définit la valeur V
Range("A6:E6").ClearContents 'efface le contenu de la plage A6:E6 (avec d'enventuelles anciennes recherches)
Target.Value = V 'renvoie la valeur V dans la cellule éditée
COL = Target.Column 'définit la colonne COL
TEST = False 'réinitialse la variable TEST
Range("A12:L100").ClearContents 'efface d'éventuelle anciennes données
If Target.Value = "" Then Exit Sub 'si la cellule est effacée, sort de la procédure
K = 1 'initialise la variable K
For Each O In Sheets 'boucle 1 : sur tous les onglets du classeur
If Not O.Name = "Recherche" Then 'condition 1 : si le nom de l'onglet O n'est pas "Recherche"
TV = O.Range("A4:L110") 'définit le tableau des valeurs TV
For I = 1 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV
If COL = 5 Then 'condition : cas spécial sur la recherche de description (prend en compte une partie edu mot)
If InStr(1, TV(I, COL), V, vbTextCompare) > 0 Then 'si le texte de V est contenu dans la donnée ligne I colonne COL de TV
ReDim Preserve TL(1 To 12, 1 To K) 'redimensionne le tableau des lignes TL (12 lignes, K colonnes)
For J = 1 To 12 'boucle 3 : sur les 12 colonnes du tableau des valeurs TV
TL(J, K) = TV(I, J) 'récupère dans la ligne J de TL la donnée en colonne J de TV (= Transposition)
If J = 1 Then TL(J, K) = DateSerial(Year(TV(I, J)), Month(TV(I, J)), Day(TV(I, J))) 'cas spécial pour les dates
Next J 'prochaine colonne de la boucle 3
K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
End If 'fin de la condition 2
GoTo suite 'va à l'étiquette "suite"
End If 'fin de condition du cas spécial recherche de description
If TV(I, COL) = V Then 'condition 2 : si la donnée ligne I colonne COL de TV est égale à V
ReDim Preserve TL(1 To 12, 1 To K) 'redimensionne le tableau des lignes TL (11 lignes, K colonnes)
For J = 1 To 12 'boucle 3 : sur les 12 colonnes du tableau des valeurs TV
TL(J, K) = TV(I, J) 'récupère dans la ligne J de TL la donnée en colonne J de TV (= Transposition)
If J = 1 Then TL(J, K) = DateSerial(Year(TV(I, J)), Month(TV(I, J)), Day(TV(I, J))) 'cas spécial pour les dates
Next J 'prochaine colonne de la boucle 3
K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
End If 'fin de la condition 2
suite: 'étiquette
Next I 'prochaine ligne de la boucle 2
End If 'fin de la condition 1
Next O 'prochain onglet de la boucle 1
'si K est supérieure à 1, renvoie dans la cellule A12 redimensionnée le tableau TL tranposé
If K > 1 Then Range("A12").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
End Sub