Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la varable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim PAE As Range 'déclare la variable PAE (Plage À Effacer)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim CL As Variant 'déclare la variable CL (Classe)
Dim NH As Variant 'déclare la variable NH (Nombre d'Heures)
Set O = Worksheets("Feuil1") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet O
Set PL = O.Range("A4:AQ" & DL) 'définit la plage PL
Set PAE = O.Range("AR4:BG" & DL) 'définit la plage PAE
PAE.ClearContents 'efface le contenu de la plage PAE
For I = 4 To DL 'boucle 1 : des lignes 4 à DL
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For J = 4 To 43 'boucle 2 : des colonne 4 à 43
If O.Cells(I, J).Value <> "" Then 'condition : si la cellule ligne I colonne J de l'onglet O n'est pas vide
D(O.Cells(I, J).Value) = D(O.Cells(I, J).Value) + 1 'alimente le dictionaire D
End If 'fin de la condition
Next J 'prochaine ligne de la boucle
CL = D.Keys 'récupère dans le tabkeau CH la liste des éléments du dictionnaire D sans doublon
NH = D.items 'récupère dans le tabkeau NH le nombre de fois qu'apparaît chaque élément unique
O.Cells(I + 1, "AR").Resize(1, D.Count) = CL 'renvoie dans la cellule ligne I colonne AR redimensionnée le tableau CL
O.Cells(I + 1, "AZ").Resize(1, D.Count) = NH 'renvoie dans la cellule ligne I colonne AZ redimensionnée le tableau NH
Next I 'prochaine ligne de la boucle
End Sub