Sub Extract()
Dim I As Byte 'déclaration de la variable I (qui va de 1 à 31)
Dim Nb As String 'itou pour NB, qui représentera le nom de la feuille
Dim Derlig As Integer 'itou pour Derlig, qui calculera la première ligne vide
Dim ShProv As Object 'itou pour SHProv, qui sera la feuille source
Application.ScreenUpdating = False 'on annule le rafraichissement de l'écran
Sheets("Recap").Range("A2:O1000").Clear 'on efface tout dans l'onglet "Recap"
For I = 1 To 31 'on va balayer tous les onglets
Nb = Format(I, "00") 'on met en forme ("01", "02", ...., "31")
Set ShProv = Sheets(Nb) 'on détermine l'onglet source
With Sheets("Recap") 'sur l'onglet "Recap"
Derlig = .[C65000].End(xlUp).Row + 1 'calcul de la première ligne vide
ShProv.Range("A3:Y3").Copy .Cells(Derlig, 1) 'on copie les entêtes de l'onglet source
ShProv.Range("A3:Y29").AdvancedFilter Action:=xlFilterCopy, CopyToRange:= _
.Range(.Cells(Derlig, 1), .Cells(Derlig, 25)), Unique:=False
'Ici, on copie toutes les données de l'onglet source dans l'onglet "Recap"
'par le biais d'un filtre élaboré
'on copie de la cellule A (première ligne vide) à la cellule Y (première ligne vide)
.Rows(Derlig).Delete 'on supprime les en-têtes qu'on venait de copier
.Columns(2).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
'on supprime toutes les lignes dont les valeurs de la colonne B sont vides
.Cells.EntireColumn.AutoFit 'on ajuste la largeur des colonnes
End With
Next I
End Sub