用VBA自动更正错误的注释引用序号

embedded/2024/12/28 21:42:30/

将扫描pdf文件进行文字识别时,对带圈数字表示的注释引用和注释序号往往会将数字序号认错。例如下面的文件:

这个文件的段落十分有规律:每首诗的标题样式为标题3,标题下面的段落为诗的正文,下面有一个样式为标题4的段落,段落文本为【题解】,此段落下面有若干段落进行说明,接下来有一个样式为标题4的段落,段落文本为【校注】,此段落下面有若干个段落为注释,每条注释一段。针对这样布局的文件,可以用下面的VBA程序将注释引用和注释编号的位置全部修改正确:

Sub 更正注释引用与注释序号的编号()Dim regEx As Object, aPara As Paragraph, isBody As Boolean, isComm As BooleanDim matches, matche As Object, i%, j%Dim searchRange As Range, tmpRange As RangeSet regEx = CreateObject("VBScript.RegExp")' 之所以用正则表达式,是因为超过10的带圈数字序号在VBA编辑器中没法输入' 而Range.Find对象使用的通配符又不支持使用unicode编码With regEx.Pattern = "[\u2460-\u2473]" ' 1~20带圈数字序号.Global = True ' 查找所有匹配End Withi = 1DoSet aPara = ActiveDocument.Paragraphs(i)If aPara.Style = "标题 3" Then ' 遇到诗标题i = i + 1 ' 前进一段,进入诗正文' 设定查找区域为正文范围Set searchRange = ActiveDocument.Paragraphs(i).Range' 在正文范围内执行匹配Set matches = regEx.Execute(searchRange.Text)' 如果存在带圈数字序号,则遍历每一个带圈数字序号,替换为正确的序数If matches.Count > 0 ThenFor j = 0 To matches.Count - 1' 重置查找范围为调整后的范围Set tmpRange = searchRangeWith tmpRange.Find.Text = matches(j).Value.Wrap = 1 ' wdFindContinue.Execute ' 找到注释引用End With' 根据循环序数计算出正确的带圈数字序号并替换掉原来的文本tmpRange.Text = ChrW(j + 9312)' 为防止刚插入的正确带圈数字序号被重复匹配,将查找范围' 起始位置调整到刚插入的文本之后searchRange.SetRange tmpRange.End, searchRange.EndNext jEnd Ifi = i + 1' 如过遇到【校注】段落ElseIf aPara.Style = "标题 4" And Left(aPara.Range.Text, 4) = "【校注】" Then' 选择此段落ActiveDocument.Paragraphs(i).Range.Select' 利用Selection.Bookmarks("\headinglevel")取得此标题及所属段落作为查找区域Set searchRange = Selection.Bookmarks("\headinglevel").Range' 在该标题所属段落中进行全局查找Set matches = regEx.Execute(searchRange.Text)If matches.Count > 0 Then '以下操作与诗正文段落中的操作类似For j = 0 To matches.Count - 1Set tmpRange = searchRangeWith tmpRange.Find.Text = matches(j).Value.Wrap = 1 ' wdFindContinue.Execute ' 找到注释引用End WithtmpRange.Text = ChrW(j + 9312)searchRange.SetRange tmpRange.End, searchRange.End' 因为每条注释一个段落,所以完成一个匹配项替换应该将段落计数器加1i = i + 1Next j' 将标题段落的计数也加上i = i + 1End If' 碰上不是诗标题和注释区标题的段落,直接累加段落计数器。因为诗正文和' 注释段落已在前面处理,所以此处的段落实际上就是题注标题及其所属段落Elsei = i + 1End IfLoop While i < ActiveDocument.Paragraphs.Count '至全文最后一段终止
End Sub

以上代码通用性并不强,只能对特定结构的文档起作用,但仍然演示了正则表达式结合Range.Find进行查找并完成匹配内容定位、查找范围的调整、取得标题及其所属段落区域、数值1-20转换为带圈数字序号(更大的数值大多数字体没有对应的带圈数字序号)等技巧,因而有一定的参考价值。

根据人工智能Kimi的回答,获取标题及其所属段落的Range还有以下方法:

Sub GetTitleAndContentRange()Dim doc As DocumentDim titlePara As ParagraphDim titleRange As RangeDim contentRange As RangeSet doc = ActiveDocument' 获取第一个标题段落Set titlePara = doc.Paragraphs(1)' 获取标题段落的 RangeSet titleRange = titlePara.Range' 扩展范围以包含标题下的所有内容Set contentRange = titleRange.DuplicatecontentRange.Collapse Direction:=wdCollapseEndDo While contentRange.Paragraphs(1).Style <> titlePara.StylecontentRange.SetRange Start:=contentRange.Start, End:=contentRange.Paragraphs(1).Range.EndcontentRange.Collapse Direction:=wdCollapseEndLoop' 现在 titleRange 包含标题,contentRange 包含标题及其下的内容' 你可以对这些范围进行操作,例如复制、格式化等
End Sub

显然这个方法无论是复杂性还是执行效率都比不上选定标题段落后再使用“Selection.Bookmarks("\headinglevel").Range”获取。上文中要将标题段落本身剔除出searchRange,也只需要再添加一行代码(因为此时标题段落已经被选择):

searchRange.SetRange Selection.Range.End, searchRange.End


http://www.ppmy.cn/embedded/149563.html

相关文章

怎么配置每一次重启服务器后,自动启动Tocmat

前言 宝子们&#xff0c;今天来给大家详细讲讲服务器如何配置每次重启后自动启动 Tomcat&#xff0c;让你的服务器应用始终保持在线状态&#xff0c;高效运行&#xff01; windows版本 在 Windows 系统下&#xff0c;有两种常用的方法可以实现这个目标。 第一种方法是利用服…

SQL 实战:字符串处理函数 – 数据清洗与文本格式化

在数据分析和开发过程中&#xff0c;原始数据往往存在格式不统一、冗余字符等问题&#xff0c;直接影响查询和展示效果。SQL 提供了一系列强大的字符串处理函数&#xff0c;能够帮助开发者进行数据清洗和文本格式化操作&#xff0c;提高数据质量和查询效率。本文将通过多个实战…

Linux下Java通过JNI调用C++

以下为Demo流程 1.创建Java文件 public class HelloWord {// 声明本地方法public native void sayHello();static {// 加载本地库System.loadLibrary("hello");}public static void main(String[] args) {new HelloWord().sayHello();} } 2.编译生成.h头文件 在H…

5.npm包

文章目录 [TOC](文章目录) 3.npm与包3.1.包3.2.npm体验在项目中安装包的命令包管理配置文件一次性安装开发项目时安装的包如何从项目中卸载包devDependencies节点的作用解决下载包速度比较慢的问题nrm工具&#xff0c;利用其提供的终端命令&#xff0c;可以快速查看和切换下包的…

iPhone 17 :史诗级大改,120Hz 全面普及

资深果粉应该都听过一个说法&#xff1a;“iPhone 买单不买双”。这个“规律”似乎在iPhone 16上也得到了印证。 近段时间&#xff0c;各方消息都在指明一点&#xff1a;iPhone 16 只是大餐前的小菜&#xff0c;iPhone 17才是真正带来革命性提升的一代神机。下一代 iPhone 17&…

阿里云人工智能ACP(一)——人工智能与人工智能技术概述

一、人工智能概述 1. 人工智能的定义 人工智能 是利用数字计算机或者由数字计算机控制的机器&#xff0c;模拟、延伸和扩展人类的智能&#xff0c;感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术和应用系统。 2. 人工智能的发展 3. 人工智能的分类 4. 人工智能…

网站前端优化

网站前端优化 主要是介绍了这几个规则。 第一&#xff1a;减少HTTP请求 1: 将超链接关联到图片上&#xff0c;例如在导航栏按钮中。如果是以这种形式关联多个带有超链接的图片&#xff0c;使用图片地图这种方式既能减少HTTP请求&#xff0c;有无需改变页面外观感受。图片地…

Vue.js 高级组件开发:抽象与高性能架构

Vue.js 高级组件开发&#xff1a;抽象与高性能架构 引言一、动态组件与依赖注入1. 动态组件场景 二、高可扩展性的抽象组件模式1. 设计思路2. 案例&#xff1a;抽象数据表组件 三、复杂场景下的异步操作管理1. 使用 Vue Composition API 管理异步逻辑 四、渲染优化与框架底层钩…