Function DecalerSi(Plage_Dynamique As Range, Plage_Criteria As Range, Criteria As String) As Range
Dim cel_d As Range, cel_c As Range, dyn_range As Range, cell_range As Range
Dim Plage_Tab()
Dim i As Byte
If Plage_Dynamique.Columns.Count > 1 Or Plage_Criteria.Columns.Count > 1 Then Exit Function 'ne fonctionne qu'en colonne pour l'instant et pas en ligne
If Plage_Dynamique.Cells.Count <> Plage_Criteria.Cells.Count Then Exit Function 'même nombre de cellules exigé pour les deux ranges
ReDim Plage_Tab(2, Plage_Dynamique.Cells.Count) 'redimensionnement de l'array
'Remplissage de l'array Plage_Tab avec l'addresse de chaque cellule de Plage_Dynamique
i = 1
For Each cel_d In Plage_Dynamique
Plage_Tab(1, i) = cel_d.Address
i = i + 1
Next
'Remplissage de l'array Plage_Tab avec la valeur de chaque cellule de Plage_Criteria
i = 1
For Each cel_c In Plage_Criteria
Plage_Tab(2, i) = cel_c.Value
i = i + 1
Next
'Traitement de l'array et test ligne par ligne si critère respecté
For i = 1 To UBound(Plage_Tab, 2)
If Plage_Tab(2, i) = Criteria Then
Set cell_range = Range(Plage_Tab(1, i))
If dyn_range Is Nothing Then
Set dyn_range = cell_range
Else
Set dyn_range = Application.Union(dyn_range, cell_range)
End If
End If
Next i
Set DecalerSi = dyn_range
End Function