Sub Macro1()
Dim O1 As Object 'déclare la variable O1 (Onglet 1)
Dim O2 As Object 'déclare la variable O1 (Onglet 2)
Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim DC As Integer 'déclare la variable DC (Dernière Colonne)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim J As Integer 'déclare la variable J (incrément)
Dim NB As Integer 'déclare la variable NB (NomBre)
Dim PLV As Range 'déclare la variable PLV (PLage Visible)
Set O1 = Sheets("Feuil1") 'définit l'onglet O1
Set O2 = Sheets("Feuil2") 'définit l'onglet O2
O2.Range("A1").CurrentRegion.ClearContents 'supprime d'éventuelles anciennes données
DL = O1.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet O1
Set PL = O1.Range("A2:A" & DL) 'définit la plage PL
DC = O1.Cells(1, Application.Columns.Count).End(xlToLeft).Column 'définit la dernière colonne éditée DC de la ligne 1 de l'onglet O1
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For Each CEL In PL 'boucle sur toutes les cellules CEL de la plage PL
D(CEL.Value) = "" 'alimente le dictionnaire D
Next CEL 'prochaine cellule de la boucle
TMP = D.keys 'récupère dans le tableau temp[oraire TMP les valeurs uniques de la palge PL (sans doublon)
For I = 2 To DC 'boucle 1 : de la colonne 2 à la dernière colonne éditée DC (=agence)
Set DEST = O2.Cells(1, ((I - 2) * 2) + 1) 'définit la cellule de destination dans l'onglet O2
DEST.Value = O1.Cells(1, I) 'récupère dans DEST le numéro de l'agence
For J = 0 To UBound(TMP) 'boucle 2 : sur toutes les valeurs(uniques) du tableau TMP (=semaine)
NB = 0 'initialise le nombre NB
O1.Range("A1").AutoFilter Field:=1, Criteria1:=TMP(J) 'filte la colonne 1 (=A) de l'onglet O1 avec TMP(I) comme critère (=numéro de semaine)
Set PLV = PL.SpecialCells(xlCellTypeVisible) 'définit la plage PLV (=plage des cellules visibles, non filtrées, de la palge PL)
NB = Application.WorksheetFunction.CountA(PLV.Offset(0, I - 1)) 'définit le nombre de valeurs (cellule non vides) contenues dans la plage PLV
Set DEST = DEST.Offset(1, 0) 'redéfinit la cellule de destination DEST
DEST.Value = "Semaine " & TMP(J) 'récupère dans DEST le numéro de semaines
DEST.Offset(0, 1).Value = NB & IIf(NB > 1, " (personnes)", " (personne)") 'récupère dans la cellule adjacente à DEST le nombre NB
O1.Range("A1").AutoFilter 'supprime le filtre automatique
Next J 'prochaine valeur unique de la boucle 2 (=prochaine semaine)
Next I 'prohaine colonne de la boucle 1 (=prochaine agence)
End Sub