Well, let me ask the question the other way: if I only keep the first part (If Shp.TextFrame.HasText Or Shp.Type = msoTextBox Then), would it also work in grouped shapes? Indeed, shapes may happen to be grouped, I have no control on this. So I need to make sure the loop is processing them as well. If you tell me that the code below is enough to cover all cases, I don't need to do anything else...

For Each oSection In ActiveDocument.Sections 
        For Each oHF In oSection.Headers 
            With oHF 
                If .LinkToPrevious = False Or oSection.Index = 1 Then 'Header not linked to the previous one
                    For Each Shp In oHF.Range.ShapeRange 'There is a big difference between .Range.Shapes.Count and .ShapeRange
                        If Shp.Type = msoTextBox Or Shp.TextFrame.HasText Then