实例需求: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
具备强大的功能,而且有多种实现形式,希望各位小伙伴能够根据不同应用场景,灵活使用。