Re-
une proposition (en faisant abstraction de tes macros qui ne sont plus tout à fait utiles je pense)
elle s'appuie ici sur un tableau structuré
Const nbZones = 5
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim data() As Variant
Dim choix() As Variant
Dim dico As Object
Dim i&, iData&, iZone&, plus&
If Target.Count <> 1 Then Exit Sub
plus = Target.Row - 1
If plus = 0 Then Exit Sub
ReDim choix(1 To nbZones)
For i = 1 To nbZones
choix(i) = Range("zone" & i).Offset(plus, 0).Value
If Not Intersect(Range("zone" & i).Offset(plus, 0), Target) Is Nothing Then
data = [TabData].Value
Set dico = CreateObject("Scripting.Dictionary")
For iData = 1 To UBound(data)
flag = True
If i > 1 Then
For iZone = 1 To i - 1
If choix(iZone) <> CStr(data(iData, iZone)) Then flag = False
Next
End If
If flag Then dico(CStr(data(iData, i))) = ""
Next iData
If dico.Count > 0 Then
Target.Validation.Delete
Target.Validation.Add xlValidateList, Formula1:=Join(dico.keys, ",")
End If
Exit For
End If
Next i
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count <> 1 Then Exit Sub
plus = Target.Row - 1
If plus = 0 Then Exit Sub
For i = 1 To nbZones
If Not Intersect(Range("zone" & i).Offset(plus, 0), Target) Is Nothing Then
If i < nbZones Then
Application.EnableEvents = False
For iZone = i + 1 To nbZones
With Range("zone" & iZone).Offset(plus, 0)
.Value = ""
.Validation.Delete
End With
Next
Application.EnableEvents = True
End If
Exit For
End If
Next
End Sub