首页 > 解决方案 > 遍历 MS Word 中的段落和修剪空格

问题描述

我需要创建一个宏来删除活动 MS Word 文档中所有段落之前的空格和缩进。我试过以下:

For Each p In ActiveDocument.Paragraphs
    p.Range.Text = Trim(p.range.Text)
Next p

它将宏设置为永恒循环。如果我尝试将字符串文字分配给段落,vba 总是只创建 1 个段落:

For Each p In ActiveDocument.Paragraphs
    p.Range.Text = "test"
Next p

我想我对段落对象有一个普遍的误解。我将不胜感激有关该主题的任何启示。

标签: vbams-word

解决方案


问题中的代码循环的原因是用已处理(修剪)的文本替换一个段落正在更改段落集合。所以代码会在某个时候不断地处理同一个段落。

这是在“幕后”被删除和重新创建的对象的正常行为。解决它的方法是将集合从末端循环到前面:

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

推荐阅读