vba - 查找和替换,带条件删除
问题描述
我试着
- 在 Word 文档中搜索特定术语,然后删除显示该术语的行。
- 检查上一段是否以句点或引号结尾,如果是,请按两次删除键(将上一段连接到后面的一段)。
我得到了 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
该代码用于检查标题的任何实例——假设在这种情况下标题以“事物”开头——并删除该行。
如何检查前一段是否缺少句点或引号并执行几个退格?
解决方案
将问题中的代码与描述进行比较,我假设“删除该行”意味着需要删除的“标题”在他们自己的段落中,而不仅仅是在“一行”中。这是 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
推荐阅读
- actions-on-google - 创建自定义 Google 智能家居操作
- angular - Angular HttpInterceptor 缓存未触发更改检测
- html - 我怎么能有这样的div?
- javascript - 有人可以解释如何确定我的父文件以解除状态吗?
- css - 相同宽度的 SVG 线条呈现不一致
- php - 无法从 PHP 中的 JSON 中删除特定的键和值
- swift - 访问 CollectionView 单元格内容(更改内部视图的宽度)
- php - 如何制作动态路由 PHP MVC
- python - Pandas:从具有多个字典列表的列中提取值并将值拆分为多个列
- php - 如何使用 Api-Platform 保存空数据?