Sub SousTotaux()
Dim dur#, P As Range, t, rest(), i&, n&, a#, b#, c#, d#
dur = Timer
With Feuil1 'CodeName
Set P = .Range("A2:B" & .Range("A" & .Rows.Count).End(xlUp)(2).Row)
End With
P.Sort P(1), xlAscending, Header:=xlNo 'tri pour accélérer
On Error Resume Next
P.Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
P.Columns(1).SpecialCells(xlCellTypeConstants, 2).EntireRow.Delete
t = P 'matrice, plus rapide
On Error GoTo 0
If Not IsArray(t) Then Exit Sub
ReDim rest(1 To 1 + Int(1.2 * UBound(t)), 1 To 2)
For i = 1 To UBound(t)
n = n + 1
rest(n, 1) = t(i, 1)
rest(n, 2) = t(i, 2)
If i Mod 5 = 0 Then
n = n + 1
'rest(n, 1) = "S/TOTAL" 'facultatif, je vous laisse tester
a = Val(Replace(t(i - 4, 2), ",", ".")): b = Val(Replace(t(i - 3, 2), ",", "."))
c = Val(Replace(t(i - 2, 2), ",", ".")): d = Val(Replace(t(i - 1, 2), ",", "."))
rest(n, 2) = a + b + c + d + Val(Replace(t(i, 2), ",", "."))
End If
Next
P.Resize(n) = rest
MsgBox "Durée " & Format(Timer - dur, "0.00 \s") 'mesure facultative
End Sub