Hello Derryn,
I am assuming that the picture you posted is what you want to finish up with and that currently the data looks like the following. (I didn't insert values in columns C, D and E because not relevant for how I interpret your question.)
If my assumption is not correct then my solution will not be correct.

I am assuming that you know how to install the macro.
Ensure you backup your workbook before running the code in case it does not do what you expect.
Note my comments near the start of the code where you might need to edit the code to your worksheet name and also the row number where the actual data starts. Currently I have assumed you have column headers in row 1 and actual data starts at row 2. If
you are using more than one row for column headers then edit the row number to the row where the actual data starts.
Sub SubTotalData()
Dim ws As Worksheet
Dim lngFirstDataRow As Long
Dim lngLastRow As Long
Dim r As Long
Dim rngColB As Range
Dim rngCel As Range
Dim lngFirst As Long
Dim lngLast As Long
'***************************************************************
'Edit "Sheet1" in following line to your worksheet name
Set ws = Worksheets("Sheet1")
'Edit 2 in following line to the first row number of actual data
lngFirstDataRow = 2
'***************************************************************
lngLastRow = LastRowOrCol(ws, True)
With ws
For r = lngLastRow To lngFirstDataRow Step -1
If r <> lngFirstDataRow Then
If .Cells(r, "B").Value <> .Cells(r - 1, "B") Then
.Rows(r & ":" & r + 1).Insert Shift:=xlDown
End If
End If
Next r
lngLastRow = LastRowOrCol(ws, True) + 2
For r = lngFirstDataRow To lngLastRow
If r = lngFirstDataRow Then
lngFirst = r 'First row for Sum function
Else
If .Cells(r, "B") = "" Then 'Empty cell
lngLast = r - 1 'Last row for Sum function
End If
End If
If lngFirst > 0 And lngLast > 0 Then
.Cells(r, "F") = WorksheetFunction.Sum(.Range(.Cells(lngFirst, "F"), _
.Cells(lngLast, "F")))
.Cells(r, "G") = WorksheetFunction.Sum(.Range(.Cells(lngFirst, "G"), _
.Cells(lngLast, "G")))
.Cells(r, "H") = WorksheetFunction.Sum(.Range(.Cells(lngFirst, "H"), _
.Cells(lngLast, "H")))
.Cells(r, "I") = WorksheetFunction.Sum(.Range(.Cells(lngFirst, "I"), _
.Cells(lngLast, "I")))
.Cells(r, "J") = WorksheetFunction.Sum(.Range(.Cells(lngFirst, "J"), _
.Cells(lngLast, "J")))
.Cells(r, "E") = "SUBTOTAL"
.Range(.Cells(r, "E"), Cells(r, "J")).Font.Italic = True
.Range(.Cells(r, "E"), Cells(r, "J")).Font.Bold = True
.Range(.Cells(r, "E"), Cells(r, "J")).NumberFormat = "#,##0.00"
.Cells(r, "E").HorizontalAlignment = xlRight
r = r + 1 'Increment row number for total of subtotals
With .Range(.Cells(r, "F"), .Cells(r, "J")) 'Merge and centre cells
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
.Cells(r, "F") = WorksheetFunction.Sum(.Range(.Cells(r - 1, "F"), _
.Cells(r - 1, "J")))
.Cells(r, "E") = "TOTAL " & .Cells(r - 2, "B")
.Cells(r, "E").HorizontalAlignment = xlRight
.Range(.Cells(r, "E"), .Cells(r, "F")).Font.Italic = True
.Range(.Cells(r, "E"), .Cells(r, "F")).Font.Bold = True
.Range(.Cells(r, "E"), .Cells(r, "F")).NumberFormat = "#,##0.00"
r = r + 1 'Increment row number to start next group
lngFirst = r 'Set first row for Sum Function
lngLast = 0
End If
Next r
End With
End Sub
Function LastRowOrCol(ws As Worksheet, bolRowCol As Boolean, Optional rng As Range) As Long
'Finds the last used row or column in a worksheet
'First parameter is Worksheet
'Second parameter is True for Last Row or False for last Column
'Third parameter is optional. Use to find the last row or column in a specific range
Dim lngRowCol As Long
Dim rngToFind As Range
If rng Is Nothing Then
Set rng = ws.Cells
End If
If bolRowCol Then
lngRowCol = xlByRows
Else
lngRowCol = xlByColumns
End If
With ws
Set rngToFind = rng.Find(What:="*", _
LookIn:=xlFormulas, _
LookAt:=xlPart, _
SearchOrder:=lngRowCol, _
SearchDirection:=xlPrevious, _
MatchCase:=False)
End With
If Not rngToFind Is Nothing Then
If bolRowCol Then
LastRowOrCol = rngToFind.Row
Else
LastRowOrCol = rngToFind.Column
End If
End If
End Function