In that case, you would need something like:
Note: I've run the loops backwards and used indices to allow for the possibility that one might want to extract the content then delete the shapes.Dim i As Long, j As Long With ActiveDocument For i = .Shapes.Count To 1 Step -1 With .Shapes(i) If .TextFrame.HasText Then MsgBox .TextFrame.TextRange.Text ElseIf .Type = msoGroup Then For j = .GroupItems.Count To 1 Step -1 If .GroupItems(j).TextFrame.HasText Then MsgBox .TextFrame.TextRange.Text End If Next End If End With Next End With