Option Compare Text 'la casse est ignorée
Private Sub Worksheet_Change(ByVal Target As Range)
Dim crit As Range, ub1%, critere1(), i%, vide1, ub2%, critere2(), vide2, P As Range, tablo, j%, x$, flag1, flag2
Set crit = [A2:C7]: ub1 = crit.Rows.Count: ReDim critere1(1 To ub1) 'plage à adapter
For i = 1 To ub1
If Application.CountA(crit.Rows(i)) Then _
critere1(i) = IIf(crit(i, 1) = "", "*", crit(i, 1)) & IIf(crit(i, 2) = "", "*", crit(i, 2)) & IIf(crit(i, 3) = "", "*", crit(i, 3))
Next
If Application.CountA(crit) = 0 Then vide1 = True
Set crit = [E2:F7]: ub2 = crit.Rows.Count: ReDim critere2(1 To ub2) 'plage à adapter
For i = 1 To ub2
If Application.CountA(crit.Rows(i)) Then _
critere2(i) = IIf(crit(i, 1) = "", "*", crit(i, 1)) & IIf(crit(i, 2) = "", "*", crit(i, 2))
Next
If Application.CountA(crit) = 0 Then vide2 = True
Set P = [M1].CurrentRegion.Resize(3)
tablo = P 'matrice, plus rapide
For j = 1 To UBound(tablo, 2) Step 3
tablo(3, j + 2) = "" 'RAZ
x = tablo(1, j) & tablo(1, j + 2)
flag1 = vide2
For i = 1 To ub2
If x Like critere2(i) Then flag1 = True
Next i
x = tablo(2, j) & tablo(2, j + 1) & tablo(2, j + 2)
flag2 = vide1
For i = 1 To ub1
If x Like critere1(i) Then flag2 = True: Exit For
Next i
If flag1 And flag2 Then tablo(3, j + 2) = 1 + Int((Month("1/" & tablo(1, j + 2)) - 1) / 3) 'repère le trimestre en ligne 3
Next j
'---restitution---
Application.EnableEvents = False 'désactive les évènements
P = tablo
Application.EnableEvents = True 'réactive les évènements
End Sub