快速定位Word文档中特殊符号之间的文本(1/2)

实例需求:Word文档如下图中左侧所示,现需要修改手工换行符和段落符之间文字的字体为蓝色,如右图所示。

  • 在Word中使用【Shift+Enter】输入手工换行符,也称为软回车,其ASCII值为11,在文档中显示为向下的灰色箭头,如文档截图中第一行行尾所示
  • 在Word中使用【Enter】输入段落符,也称为硬回车,其ASCII值为13,在文档中显示为转角向左的灰色箭头,如文档截图中第二行行尾所示
  • 修改字体颜色时,应避免影响项目编号、项目符号的字体样式

在这里插入图片描述

示例代码如下。

Sub RestoreColor()
    ActiveDocument.Range.Font.Fill.ForeColor.RGB = VBA.RGB(0, 0, 0)
End Sub
【代码解析】
此代码过程用于恢复文档中字体样式(字体颜色为黑色),调试代码过程中,首先运行此过程,可以确保文档初始状态是一致的。

Word中提供了强大的查找替换功能,使用通配符可以查找特殊字符。

```vb
Sub ChangeColor1()
    Dim r As Range
    Call RestoreColor
    With ActiveDocument.Range.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = "^11?{1,}^13"
        .Forward = True
        .MatchWildcards = True
        .Wrap = wdFindStop
        Do While .Execute
            Set r = .Parent
            r.MoveStart Word.wdCharacter, 1
            r.MoveEnd Word.wdCharacter, -1
            r.Font.Fill.ForeColor.RGB = VBA.RGB(0, 0, 255)
            r.Collapse wdCollapseEnd
        Loop
    End With
End Sub

【代码解析】
第2行代码声明r为Range对象变量。
第3行代码调用RestoreColor过程,用于恢复文档颜色。
第4行代码使用With语句块操作 Find 对象,用于查找文档内容。
第5行代码清除Find对象的查找格式。
第6行代码清除Find对象的替换格式。
第7行代码设置Find对象的查找文本为通配符表达式 “11?{1,}13”,查找特定格式的文本行 (需要验证表达式的准确含义)。

  • ^11代表软回车
  • ?{1,}代表一个或者多个任意字符
  • ^13代表硬回车

第8行代码设置Find对象的查找方向为向前。
第9行代码设置Find对象启用通配符查找。
第10行代码设置Find对象的查找环绕方式为停止环绕。
第11行代码循环查找。
第12行代码设置r为Find对象找到的文本的父对象,即Range对象。
第13行代码将r起始位置后移一个字符 (排除行软回车)。
第14行代码将r结束位置前移一个字符 (排除行硬回车)。
第15行代码设置r对象的字体填充前景色为蓝色。
第16行代码折叠Range对象r到结束位置,为下次查找准备。
第17行代码循环结束。

运行示例代码,结果如下图所示。似乎结果并不完全正确,不难发现表格部分单元格中最后一个组被遗漏了,例如:第一个单元格中的Test6。其原因在于表格的特殊格式,虽然单元格中最后一个字符显示为段落符,但是Find无法定位到该字符。

在这里插入图片描述

变通一下实现方法,使用多次查找进行定位。

Sub ChangeColor2()
    Dim Doc As Range: Set Doc = ActiveDocument.Range
    Dim targetRng As Range, iEnd As Long
    Call RestoreColor
    Do While Doc.Find.Execute(Chr(11))
        Set targetRng = Doc.Duplicate
        iEnd = 100000000#
        If targetRng.Information(wdWithInTable) Then
            iEnd = targetRng.Cells(1).Range.End
        End If
        targetRng.MoveStart Word.wdCharacter, 1
        Doc.Collapse wdCollapseEnd
        If Doc.Find.Execute(Chr(13)) Then
            If Doc.End < iEnd Then
                targetRng.End = Doc.Start
            Else
                targetRng.End = iEnd - 1
            End If
            targetRng.Font.Color = wdColorBlue
            targetRng.Collapse wdCollapseEnd
            Set Doc = targetRng
        End If
    Loop
End Sub

【代码解析】
第2行代码声明Doc为Range对象变量并设置为当前文档范围。
第3行代码声明targetRng为Range对象变量,声明iEnd为Long类型变量。
第4行代码调用RestoreColor过程,用于恢复文档字体颜色。
第5行代码循环查找软回车。
第6行代码复制Doc范围赋值给变量targetRng,第二次查找(第13行代码)将改变Doc对象,此处需要先备份。
第7行代码设置iEnd为一个较大数值。
第8行代码判断targetRng是否在表格内。
如果targetRng在表格内,则第9行代码设置iEnd为targetRng所在单元格的末尾位置。
第11行代码targetRng起始位置后移一个字符(跳过软回车)。
第12行代码折叠Doc范围到末尾。
第13行代码查找段落标记,如果找到段落标记则继续执行。
第14行代码如果Doc范围末尾小于iEnd,则执行第15行代码,设置targetRng的结束位置为Doc范围的起始位置。否则执行第17行代码,设置targetRng的结束位置为iEnd减1(表格单元格最后字符)。
第19行代码设置targetRng字体颜色为蓝色。
第20行代码折叠targetRng范围到末尾。
第21行代码设置Doc范围为targetRng范围,为下次循环准备。

运行示例代码ChangeColor2可以完美实现需求,没有任何遗漏。Word中的Find具备强大的功能,而且有多种实现形式,希望各位小伙伴能够根据不同应用场景,灵活使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值