Private Sub Worksheet_Change(ByVal Target As Range)
Dim OI As Worksheet 'déclare la variable OI (Onglet Import)
Dim OD As Worksheet 'déclare la variable OD (Onglet Données)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer '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)
If Target.Address = "$D$4" And Target(1).Value <> "" Then Range("B4").Value = Range("B4").Value 'si la cellue modifié est D4 redéfinit la valeur de B4 (permet de relancer cette macro événementielle)
If Target.Address = "$B$4" Then 'condition 1 : si l'addresse de la cellule modifiée est B4
If Target.Offset(0, 2).Value = "" Then 'si le seuil n'est pas renseigné
MsgBox "Vous devez renseigner le seuil !" 'message
Target.Offset(0, 2).Select 'sélectionne D4
Exit Sub 'sort de la procédure
End If 'fin de la condition
If Target.Value = "" Then Target.Offset(0, 2).Value = "": Target.Offset(0, 3).Value = "" 'si B4 est effacée, efface D4 et E4
Set OI = Worksheets("Import") 'définit l'onglet OI
Set OD = Worksheets("Données") 'définit l'onglet OD
TV = OI.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
For I = 2 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant d ela seconde)
If CStr(TV(I, 7)) = CStr(Target.Value) Then 'condition 2 : si la donnée ligne I colonne 7 de TV (convertie en texte) est égale à B4 (convertie en texte)
If TV(I, 5) < Target.Offset(0, 2).Value Then 'condition 3 : si la donnée ligne I colonne 5 de TV est inférieure au seuil en D4
K = K + 1 'incrémente K
ReDim Preserve TL(1 To 5, 1 To K) 'redimensionne le tableau des lignes TL (5 lignes, K colonnes)
For J = 1 To 5 'boucle 2 : sur les 5 premières colonnes J de TV
TL(J, K) = TV(I, J) 'récupère dans la ligne J de Tl la donnée en colonne J de TV (=> Tranposition)
Next J 'prochaine colonne de la boucle 2
End If 'fin de la condition 3
End If 'fin de la condition 2
Next I 'prochaine ligne de la boucle 1
Range("J1").CurrentRegion.ClearContents 'efface les éventuelles anciennes valeurs
If K > 0 Then 'condition : si K est supérieur à 0
Range("J1").Resize(K, 5).Value = Application.Transpose(TL) 'renvoie dans J1 redimensionnée le tableau TL transposé
Range("E4").Value = K 'renvoie le K dans E4
End If 'fin de la condition
End If 'fin de la condition 1
End Sub