Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim P As Range
If Sh.ListObjects.Count Then Set P = Sh.ListObjects(1).Range _
Else Set P = Sh.[A5].Resize(Sh.UsedRange.Rows.Count, Sh.Cells(5, Sh.Columns.Count).End(xlToLeft).Column)
If Intersect(Target, P.Resize(, 2)) Is Nothing Then Exit Sub
Application.EnableEvents = False 'désactive les évènements
P.Sort P(1), xlAscending, Header:=xlYes 'tri alphabétique
On Error Resume Next 'si aucune SpecialCell
Intersect(P.Offset(2).Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow, P).Delete xlUp 'supprime les noms vides
If P(2, 1) = "" Then P.Rows(2).SpecialCells(xlCellTypeConstants).ClearContents 'traitement particulier de la 2ème ligne
On Error GoTo 0
P.RemoveDuplicates Array(1, 2), Header:=xlYes 'supprime les doublons
Application.EnableEvents = True 'réactive les évènements
With Sh.UsedRange: End With 'actualise la barre de défilement verticale
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim t, d As Object, i&, P As Range, derlig&, x$, s
'---liste des noms et prénoms (avec séparateur)---
With Sheets("Liste Noms")
If Sh.Name = .Name Then Exit Sub
If .ListObjects.Count Then t = .ListObjects(1).Range.Resize(, 2) _
Else t = .[A5].Resize(.UsedRange.Rows.Count, 2) 'matrice, plus rapide
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(t)
If t(i, 1) <> "" Then d(t(i, 1) & Chr(1) & t(i, 2)) = ""
Next
End With
'---traitement de la feuille activée---
If Sh.ListObjects.Count Then Set P = Sh.ListObjects(1).Range Else _
Set P = Sh.[A5].Resize(Sh.UsedRange.Rows.Count, Sh.Cells(5, Sh.Columns.Count).End(xlToLeft).Column)
derlig = P.Rows.Count
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
For i = 2 To derlig
x = P(i, 1) & Chr(1) & P(i, 2)
If d.exists(x) Then d.Remove x Else P(i, 1) = ""
Next
If d.Count Then
t = d.keys
For i = 0 To UBound(t)
s = Split(t(i), Chr(1))
P(derlig + i + 1, 1) = s(0)
If UBound(s) Then P(derlig + i + 1, 2) = s(1)
Next
End If
'---mise à jour---
Workbook_SheetChange Sh, P 'lance la macro
End Sub