Причина, по которой код в вопросе зацикливается, заключается в том, что замена одного абзаца обработанным (обрезанным) текстом приводит к изменению коллекции абзацев.Таким образом, код будет постоянно обрабатывать один и тот же абзац в какой-то момент.
Это нормальное поведение с объектами, которые удаляются и воссоздаются "за сценой".Чтобы обойти это, нужно зациклить коллекцию от конца до фронта:
For i = ActiveDocument.Paragraphs.Count To 1 Step -1
Set p = ActiveDocument.Paragraphs(i)
p.Range.Text = Trim(p.Range.Text)
Next
Тем не менее, если абзацы в документе содержат какое-либо форматирование, это будет потеряно.Обработка строк не сохраняет форматирование.
Альтернативой может быть проверка первого символа каждого абзаца для типов символов, которые вы считаете «пробелами».Если есть, расширьте диапазон до тех пор, пока эти символы не будут обнаружены, и удалите.Это оставит форматирование без изменений.(Поскольку это не меняет весь абзац, работает «нормальный» цикл.)
Sub TestTrimParas()
Dim p As Word.Paragraph
Dim i As Long
Dim rng As Word.Range
For Each p In ActiveDocument.Paragraphs
Set rng = p.Range.Characters.First
'Test for a space or TAB character
If rng.Text = " " Or rng.Text = Chr(9) Then
i = rng.MoveEndWhile(" " + Chr(9))
Debug.Print i
rng.Delete
End If
Next p
End Sub