Sub Bouton1_Clic()
Dim O As Object 'déclare la variable O (Onglet)
Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim I As Long 'déclare la variable I (Incrément)
Dim NL As Integer 'déclare la variable NL (Numéro de Ligne)
Set O = Sheets("Feuil1") 'définit l'onglet O
DL = O.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 O
Set PL = O.Range("A3:I" & DL) 'définit la plage pl
PL.Copy 'copy la plage pl
O.Range("A3").PasteSpecial (xlPasteValues) 'collage spécial "Valeurs"
Application.CutCopyMode = False 'supprime le clignotement de la plage lié au "copier"
With O 'prend en compte l'onglet O
.Sort.SortFields.Clear 'supprime d'eventuels tris précédents
'tri la plage pl par rapport à la colonne A
.Sort.SortFields.Add Key:=O.Range("A3"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers
End With 'fin de la prise en compte de l'onglet O
With O.Sort 'prend en compte le tri de l'onglet O
.SetRange PL 'plage à trier
.Header = xlNo 'pas d'en-ête
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With 'fin de la prise en compte du tri de l'onglet O
NL = 1 'initialise la variabel NL
For I = DL To 3 Step -1 'boucle inversée de la dernière ligne Dl à la ligne 3 par pas de -1
'condition si la cellule de référence en colonne A est différente de celle au-dessus d'elle
If O.Cells(I, 1).Value <> O.Cells(I - 1, 1).Value Then
'place la formule de la somme dans la cellule de référence décalée de (NL-1) lignes vers le bas et de 8 colonne à droite
O.Cells(I, 1).Offset(NL - 1, 8).FormulaR1C1 = "=SUM(R[" & -(NL - 1) & "]C[-1]:RC[-1])"
Rows(I).Insert xlDown 'insère une ligne au dessus
NL = 1 'réinitialise NL
Else 'sinon
NL = NL + 1 'incrément NL
End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub