首页 > 解决方案 > 查找和替换,带条件删除

问题描述

我试着

我得到了 500 多页从 PDF 转换而来的 Word 文档。在转换之前从未从这些文档中删除标题,因此我必须删除它们。有时它们落在段落之后,有时它们落在段落中间并将该段落分成两部分。

通过试验、错误和谷歌搜索,我设法编写了一些 VBA 来搜索这些标题并删除它们,但是我必须手动检查 a 段落是否被中断并修复它。条件 VBA 的细节和从我的光标位置检查缺少的句点超出了我的范围。

Sub Macro1()
    With Selection
    .Find.ClearFormatting
    .Find.Text = "thing"
    .Find.Execute
    .MoveLeft Unit:=wdCharacter, Count:=1
    .MoveDown Unit:=wdLine, Count:=1, Extend:=wdExtend
    .TypeBackspace
    End With
End Sub

该代码用于检查标题的任何实例——假设在这种情况下标题以“事物”开头——并删除该行。

如何检查前一段是否缺少句点或引号并执行几个退格?

标签: vbams-word

解决方案


将问题中的代码与描述进行比较,我假设“删除该行”意味着需要删除的“标题”在他们自己的段落中,而不仅仅是在“一行”中。这是 Word 中的一个重要区别,因为内容太长时会自动换行;段落是按下 ENTER 的位置,并且是一个单独的“实体”。

我从问题中的代码开始并以此为基础。请注意,首先,测试是否确实找到了某物:bFound = .Find.Execute. Execute返回 True 或 False。的值bFound经过测试,只有在 True 时,代码才会继续。

如果为 true,Range则将对象设置为包含找到的项目的整个段落。(想想像Range不可见的选择这样的对象。如果你知道如何,这些更容易使用,更重要的是,你可以根据需要使用任意数量的对象。总是只有一个 Selection。)

然后删除该段落,如果我正确地遵循了问题描述,则会留下两个相邻的段落(没有空的段落)。现在的问题是,前面的段落是否以 a?或 a结尾.

所以起点向后移动(想象它就像按住 Shift 的同时按下左箭头)直到找到 a.或 a ?;返回一个负数。如果移动的字符数为负三或更多,则一切正常。(三个或更多:段落标记是一个字符;可以想象,标点符号后面可能有一个空格;标点符号本身。)

如果移动是更多字符(负数),则该段落被分解。在这种情况下,将Range折叠到检查标点符号之前的位置(应该是找到的段落的开头),起点再次向后移动,但只有一个字符(应该是段落标记),然后删除。结果:合并找到的术语之前和之后的段落。

Sub FindCheckDocStructure()
    Dim rngFound As Word.Range
    Dim bFound As Boolean
    Dim countMoved As Long

    With Selection
        .Find.ClearFormatting
        .Find.Text = "thing"
        bFound = .Find.Execute
        If bFound Then
            Set rngFound = .Paragraphs(1).Range
            rngFound.Delete
            countMoved = rngFound.MoveStartUntil(".?", wdBackward)
            If countMoved >= -3 Then
                'OK, do nothing
                Debug.Print countMoved
            Else
                'Not OK
                Debug.Print countMoved
                'From the starting point after "found"
                rngFound.Collapse wdCollapseEnd
                rngFound.MoveStart wdCharacter, -1
                rngFound.Delete
            End If
        End If
    End With

End Sub

推荐阅读