Eu acredito que isso vai fazer o que você está procurando. É quase o mesmo que o original, mas acrescentei alguns detalhes para torná-lo mais compreensível e fácil de modificar.
Sub CombineRowsRevisited()
Dim c As Range
Dim i As Integer
Dim PersonID, REAScore, WRTScore, startDate, courseID as integer
'Columns as I understand them (subtracting one from the actual column in the sheet)
PersonID = 0 'personid is in column 1 etc..
'...
startDate = 1
courseID = 2
REAScore = 3
WRTScore = 4
ESSScore = 5
'Looping through each record
For Each c In Range("A2", Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
'If personID on this record is the same as the personID on the next record
If c.Offset(0, PersonID ) = c.Offset(1, PersonID ) Then
'blindly overwrite startDate and courseID with the value from the next row
c.offset(1, startDate ) = c.Offset(0, startDate)
c.offset(1, courseID) = c.offset(0, courseID)
'only copy the scores if they are not null
if c.offset(0, REAScore).value <> vbNull then c.offset(1, REAScore) = c.offset(0, REAScore)
if c.offset(0, WRTScore).value <> vbNull then c.offset(1, WRTScore) = c.offset(0, WRTScore)
if c.offset(0, ESSScore).value <> vbNull then c.offset(1, ESSScore) = c.offset(0, ESSScore)
'Just added this to delete the next row when a match is found
c.entireRow.Delete
End If
Next
End Sub