使用VBA删除Word中的空段落:并非所有空段落都已删除

使用VBA删除Word中的空段落:并非所有空段落都已删除,vba,ms-word,Vba,Ms Word,我编写了一个宏来删除文档中的所有空段落,但它表现出奇怪的行为:如果文档末尾有许多空段落,那么大约有一半被删除。反复运行宏逐渐消除空段落,直到只剩下一个空段落。即使有一个边界条件,所以我需要一行代码来删除最后一段,但我仍然不明白为什么最后只有一半的空段落被删除。有人能解释为什么会发生这种情况以及如何纠正这种行为吗?顺便说一句,我在网上搜索了很多关于检测段落标记的帖子(^p、^13等,但只有搜索vbCr有效,这是另一个小难题。) 此代码将删除所有空白段落 Sub RemoveBlankParas()

我编写了一个宏来删除文档中的所有空段落,但它表现出奇怪的行为:如果文档末尾有许多空段落,那么大约有一半被删除。反复运行宏逐渐消除空段落,直到只剩下一个空段落。即使有一个边界条件,所以我需要一行代码来删除最后一段,但我仍然不明白为什么最后只有一半的空段落被删除。有人能解释为什么会发生这种情况以及如何纠正这种行为吗?顺便说一句,我在网上搜索了很多关于检测段落标记的帖子(^p、^13等,但只有搜索vbCr有效,这是另一个小难题。)


此代码将删除所有空白段落

Sub RemoveBlankParas()
    Dim oDoc        As Word.Document
    Dim i           As Long
    Dim oRng        As Range
    Dim lParas      As Long

    Set oDoc = ActiveDocument
    lParas = oDoc.Paragraphs.Count          ' Total paragraph count
    Set oRng = ActiveDocument.Range

    For i = lParas To 1 Step -1
        oRng.Select
        lEnd = lEnd + oRng.Paragraphs.Count                         ' Keep track of how many processed
        If Len(ActiveDocument.Paragraphs(i).Range.Text) = 1 Then
            ActiveDocument.Paragraphs(i).Range.Delete
        End If
    Next i

    Set para = Nothing
    Set oDoc = Nothing
    Exit Sub
End Sub

此代码将删除所有空白段落

Sub RemoveBlankParas()
    Dim oDoc        As Word.Document
    Dim i           As Long
    Dim oRng        As Range
    Dim lParas      As Long

    Set oDoc = ActiveDocument
    lParas = oDoc.Paragraphs.Count          ' Total paragraph count
    Set oRng = ActiveDocument.Range

    For i = lParas To 1 Step -1
        oRng.Select
        lEnd = lEnd + oRng.Paragraphs.Count                         ' Keep track of how many processed
        If Len(ActiveDocument.Paragraphs(i).Range.Text) = 1 Then
            ActiveDocument.Paragraphs(i).Range.Delete
        End If
    Next i

    Set para = Nothing
    Set oDoc = Nothing
    Exit Sub
End Sub

您可以替换段落标记:

ActiveDocument.Range.Find.Execute FindText:="^p^p", ReplaceWith:="^p", Replace:=wdReplaceAll

ActiveDocument.Range.Find.Execute "^p^p", , , , , , , , , "^p", wdReplaceAll ' might be needed more than once 

您可以替换段落标记:

ActiveDocument.Range.Find.Execute FindText:="^p^p", ReplaceWith:="^p", Replace:=wdReplaceAll

ActiveDocument.Range.Find.Execute "^p^p", , , , , , , , , "^p", wdReplaceAll ' might be needed more than once 

这是因为您是自上而下,而不是自下而上,或者如果发生删除,代码不需要增加段落。想象一下顶部有十个空白段落。第一个被删除,现在变成2个1个。但你的指针现在显示#2。。。看到问题了吗?我已经通过使用num_of_deleted_paras变量说明了不增加的必要性。此外,如果在文档中间有一段空段落,似乎没有问题;特别是在最后,它提出了问题——其中一些实际上被删除了!您可以查看我编写的类似代码,该代码将删除页面顶部的空白段落。您所需要做的就是删除“Else Exit For”,这应该会起作用——假设其他项目都正常(空白页等):请参见:如果您的第一个段落是空白的,那么For循环的第二次迭代是3>没有总段落。您正在跳过第2段的处理。顺便说一句,使用
Find
删除段落比循环到段落要快。这是因为您是自上而下,而不是自下而上,或者如果发生删除,代码不需要增加段落。想象一下顶部有十个空白段落。第一个被删除,现在变成2个1个。但你的指针现在显示#2。。。看到问题了吗?我已经通过使用num_of_deleted_paras变量说明了不增加的必要性。此外,如果在文档中间有一段空段落,似乎没有问题;特别是在最后,它提出了问题——其中一些实际上被删除了!您可以查看我编写的类似代码,该代码将删除页面顶部的空白段落。您所需要做的就是删除“Else Exit For”,这应该会起作用——假设其他项目都正常(空白页等):请参见:如果您的第一个段落是空白的,那么For循环的第二次迭代是3>没有总段落。您正在从处理过程中跳过第2段。顺便说一句,使用
Find
删除第2段比循环到段落中更快。OP的问题可能与只包含空格的段落有关。如果在检查
文本长度之前对其进行LTrim,代码也会将其删除。也许OP的问题与只包含空格的段落有关。如果在检查
文本的长度之前对其进行LTrim,则代码也会将其删除。