Private Sub CommandButton1_Click()
Dim Cel As Range, plg As Range, lsh As String, sh As Object
'Désactive le rafraîchissement d'écran qui ralentit l'exécution
Application.ScreenUpdating = False
'la variable lsh stocke le nom système des feuilles qui ne sont pas concernées par la copie
'l'utilisation des noms système (CodeName) permet de modifier les noms des onglets sans incidence sur le code
lsh = Feuil1.CodeName & "-" & Feuil2.CodeName & "-" & Feuil3.CodeName
'La boucle passe en revue toutes les feuilles du classeur
For Each sh In Sheets
'Si le nom de la feuille n'est pas contenu dans lsh les lignes suivantes s'y appliquent
If InStr(lsh, sh.CodeName) = 0 Then
'Cette boucle analyse toutes les cellules non vides de la colonne L, à partir de la ligne 5
For Each Cel In Me.Range("L5:L" & Rows.Count).SpecialCells(xlCellTypeConstants)
'Si la cellule contient le nom de la feuille en cours d'analyse et si la cellule correspondante en colonne J
'contient un des critères entre guillemets
If Cel = sh.Name And InStr("ACCORD, AVIS CF", UCase(Cel.Offset(0, -2))) > 0 Then
'Si la plage de cellules plg est vide, elle récupère la ligne complète de lacellule en cours d'analyse
'sinon elle ajoute les lignes des cellules suivantes
If plg Is Nothing Then
Set plg = Cel.EntireRow
Else
Set plg = Application.Union(plg, Cel.EntireRow)
End If
End If
Next
'Copie la plage plg et la colle à partir de la cellule A15
plg.Copy sh.Range("A15")
'Supprime la plage définie pour recommencer la boucle
Set plg = Nothing
'Opère le tri des lignes en fonction des colonnes Bailleur et Date
With sh.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("K15:K" & Rows.Count), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Range("I15:I" & Rows.Count), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A15:R" & Rows.Count)
.Apply
End With
End If
Next
'Rétablit le rafraîchissement d'écran
Application.ScreenUpdating = True
End Sub