Sub toto()
Dim i As Long
Dim rg As Range
Dim rgdep As Range
Application.ScreenUpdating = False
Set rg = Range("B3")
Set rgdep = Range("B2") 'plage de référence pour le sous-total (1re ligne)
Do Until IsEmpty(rg.Offset(-1, 0))
If rg.Offset(-1, 0) <> rg Then
rg.EntireRow.Insert xlDown 'insère une ligne
rg.Offset(-1, 0) = "Total " & rg.Offset(-2, 0)
' Note :
' Application.WorksheetFunction.xxx permet d'utiliser une fonction normale dans Excel (exemple: Min, Max, SousTotal, ...)
' et renvoie directement le résultat
' rg.Offset(-1, 8) = Application.WorksheetFunction.Subtotal(9, rgdep.Offset(0, 8).Resize(rg.Row - rgdep.Row, 1))
' rg.Offset(-1, 9) = Application.WorksheetFunction.Subtotal(9, rgdep.Offset(0, 9).Resize(rg.Row - rgdep.Row, 1))
'
' Si on veut plutôt avoir la formule dans la cellule, il faut alors utiliser .FormulaR1C1
' voir l'aide à ce sujet. Ici, on travaille avec RC[-x]:RC[-1] pour définir la plage du sous-total
' on se sert de la ligne de rgDep pour savoir où commencer
rg.Offset(-1, 8).FormulaR1C1 = "=SUBTOTAL(9,R[-" & rg.Row - rgdep.Row - 1 & "]C:R[-1]C)"
rg.Offset(-1, 9).FormulaR1C1 = "=SUBTOTAL(9,R[-" & rg.Row - rgdep.Row - 1 & "]C:R[-1]C)"
rg.Offset(-1, 12).FormulaR1C1 = "=if(RC3="""",if(RC10>0,1,""""),"""")"
rg.Offset(-1, 13).FormulaR1C1 = "=if(RC3="""",if(RC11>0,1,""""),"""")"
rg.Offset(-1, 0).EntireRow.Font.Bold = True 'ligne en gras
Set rgdep = rg
End If
Set rg = rg.Offset(1, 0)
Loop
Application.ScreenUpdating = True
End Sub