Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim lsto As ListObject, topD#, ref$, nref&, ncol&, nlig&, n&, i&, j&, xrg1 As Range, xrg2 As Range
topD = Timer ' timer début
Application.ScreenUpdating = False ' on fige l'écran
If LCase(Sh.Name) = LCase("Pannes") Then Exit Sub ' si c'est la feuille "Pannes", on quitte
ref = Sh.Name ' la référence à garder
nref = Sheets("Pannes").ListObjects(1).ListColumns("Service").Index ' index de la colonne "Service"
ncol = Sheets("Pannes").ListObjects(1).ListColumns.Count ' nbre colonnes de la source
nlig = Sheets("Pannes").ListObjects(1).ListRows.Count + 1 ' nbre lignes de la source
Columns("a").CurrentRegion.EntireColumn.Clear ' effacement du précédent résultat
[a1].Resize(nlig, ncol).Value2 = Sheets("Pannes").ListObjects(1).Range.Value2 ' copie de la source vers la feuille cible
[a1].CurrentRegion.Sort Cells(1, ncol), xlAscending, Header:=xlYes, MatchCase:=False ' tri
' première cellule égale à ref
Set xrg1 = Columns(ncol).Find(what:=ref, LookIn:=xlValues, lookat:=xlWhole, After:=Cells(1, ncol), searchdirection:=xlNext, MatchCase:=False)
If Not xrg1 Is Nothing Then
' dernière cellule égale à ref
Set xrg2 = Columns(ncol).Find(what:=ref, LookIn:=xlValues, lookat:=xlWhole, After:=Cells(1, ncol), searchdirection:=xlPrevious, MatchCase:=False)
Range(Cells(xrg2.Row + 1, 1), Cells(nlig + 1, ncol)).Delete shift:=xlShiftUp ' suppression des lignes après
If xrg1.Row > 2 Then Range(Cells(2, 1), Cells(xrg1.Row - 1, ncol)).Delete shift:=xlShiftUp ' suppression des lignes avant
Set lsto = ActiveSheet.ListObjects.Add(xlSrcRange, [a1].CurrentRegion, , xlYes) ' plage en tableau structuré
lsto.Name = ref ' nom du TS
MsgBox "Pour le critère <" & ref & "> : " & Format(lsto.ListRows.Count, "#,##0\ lignes copiées en ") & _
Format(Timer - topD, "0.00\ sec.")
Else
Range(Cells(1, 1), Cells(Rows.Count - 1, ncol)).Delete shift:=xlShiftUp ' pas de ligne avec ref -> on efface tout
MsgBox "Pour le critère <" & ref & "> : aucune ligne copié en " & Format(Timer - topD, "0.00\ sec.")
End If
End Sub