目 录
(一)打开Word【查找替换】对话框的【查找】选项,输入相应匹配模式
一、应用场景
一般在排版要求比较严格的中文文档时,包括各种括号在内的标点要求区分好中英文标点(更准确即全半角标点)。有的文档既有中文又有英文(如英文摘要等等),还不能通篇全选一次性操作完成。针对这些问题如果用VBA进行自动化操作,就需要了解Word通配符查找一些运用方法和技巧。
二、推荐的手动操作步骤
(一)打开Word【查找替换】对话框的【查找】选项,输入相应匹配模式
例如:
查找:[,;:\(\)\?\!""“”。]
勾选【使用通配符】
如果事先选择了有效范围,可点击【在以下项中查找】-【当前所选内容】;否则可选【主文档】(对所有文档内容进行匹配)
注意:如果要查找英文括号“(”需要进行相应转义,即“\(”,可自行了解详细内容。
(二)第(一)步完成,符合匹配模式的地方就被选中了
注意:在VBA代码执行中,是不会选中的。(可以实现此功能,但用了编程思路就不推荐此方法,因为如果数据量过大,会非常卡顿;另外,全选原本也是给手工操作准备的)
(三)点击【字体】-【转换】选项-【全角】,即可完成转换
(四)手工操作完成,效果如下
三、VBA程序代码示例(有详细注释)
Sub 半角转全角()
Dim fw As Range '此变量确定需要将半角字符替换成全角字符的文档范围
Dim ks As Long 'ks和js分别表示需要查找范围的开始和结束字符的下标
Dim js As Long
Dim s As String 's用于放需要被替换的(多个)段落样式名字符串(之间以“、”连接)
Dim arr 'arr用于存放s被“、”分割后的数组(即s中的每一个样式名)
Dim sty 'sty是循环遍历arr中的每一个元素(样式名)
Dim i As Long, j As Long
Rem 确定操作范围,默认是所选区域
Set fw = Selection.Range
Rem 如果所选区域长度为0,即未选择有效区域,则将范围确定为整个当前文档区域
If fw.Start = fw.End Then Set fw = ActiveDocument.Range
Application.ScreenUpdating = False '关闭屏幕刷新,尽可能提高执行效率
ks = fw.Start: js = fw.End '将所确定范围的开始和结束位置赋值给两个变量,方便后面约束程序执行范围
Rem 用户输入需要对所选区域执行操作的文字的样式(可以是多个,因为文档英文部分通常不用转成全角,一般提前用不同样式区分好)
s = InputBox("请输入需要半角转全角的样式,中间【、】分隔:", "半角转全角", "摘要内容、正文1、正文 致谢")
arr = Split(s, "、") '样式分割赋值给数组arr
On Error Resume Next '防止出错(如样式名写错导致的错误),避免程序中断
For Each sty In arr '遍历上面数组的每个样式名
With fw.Find '用Word里的查找功能进行替换操作,但不是直接用替换功能,因为全半角比较特殊,直接替换并不能完成很多操作
.ClearFormatting '清空查找框格式
.Forward = True '向下查找
.Wrap = wdFindContinue '查找文本循环需要选此循环模式(查找了一个继续下一个,但选定区域查找完成后,区域外的其他部分也会被查找,所以需要注意下面范围限定条件);如果不用此模式,每次执行程序只会替换一处(亲自反复测试证明;然而当仅查格式如粗体或高亮时不指定也行)
.MatchWildcards = True '开户通配符查找模式(可以一次查找多种可能性,节约时间,提高效率,减少代码)
.Style = ActiveDocument.Styles(sty) '查找框里限定样式
.Text = "[,:;""“”\(\)\?\!" & ChrW(-156) & ChrW(-159) & "]" '查找的字符串(如半角的句号、逗号、问题、括号等,根据自己的需要确定;注意特殊字符需要转义)
Do While .Execute() = True And fw.Start >= ks And fw.End <= js
'【.Execute() = True】表示查找到了
'重要:【And fw.Start >= ks And fw.End】将执行范围确定在所选范围,表示查找到符合要求的字符(串)的开始位置在事先所确定的查找范围的开头后面(包含) 且 该字符(串)的结位置在范围结束位置的前面,即只对事先确定范围内符合要求的字符(串)执行操作
'如果满足上述两组条件或三个条件,用Do While...Loop方法循环继续操作
i = fw.Start '查找到内容的开始位置
fw.CharacterWidth = wdWidthFullWidth '将查找到的字符(串)用Word【字体】选项卡的【全半角】功能里的转全角方法,将找到的字符(串)转换为全角格式
If j >= i Then Exit Do 'j记录上一次i(查找到的开始位置),因为向下查找,如果j的位置在i后面,说明已经从头循环完一遍,此时应该退出Do循环
j = i '这次查找的位置赋值给j,方便下次和最新查找的位置对比大小关系(位置关系)
Loop
End With
Next
On Error GoTo 0
Application.ScreenUpdating = True '执行完成,打开屏幕刷新
Set fw = Nothing
End Sub