本文将实现三种批量处理 Word 文档的能力:1)文本替换+带格式,2)删除最后一页,3)文末添加内容。⚠️:使用之前一定记得备份,记得备份,记得备份!
周末早上☀️,发现女朋友在电脑💻面前 Emo,我望向她👀,她欲言又止🤭,似乎想让我陪她一起加班😭。
但是,作为一个程序员,我又能帮这位女律师👩🏻💼做些什么呢?
女朋友终于开口🎙️了:“我们老板让我们把这几百个 Word 里,这个替换成这个,这个替换成这个,这个格式要改成这个,这个格式要改成这个,然后最后一页的内容也不要,再换成其他内容...”
我:哦?这似乎是苦力活🧱?怎么能让你们做呢?让我来!
需求分析
背景:女律师需要对几百个 Word 文档进行有规律可循的处理,说好的周末一起爬山即将泡汤?
需求:
- 批量处理:不用一个一个手动打开 Word 文档;
- 文本替换:A→B;
- 删除最后一页;
- 文末添加内容。
解决方案
拿出尘封已久的 Windows 电脑,打开 Word。
结合「第三方工具」和「自己编写 VBA」两种方式,最终圆满完成本次任务。✅ ✅ ✅
前置知识:VBA
要实现批量处理,首先需要了解 VBA:
Visual Basic for Applications(VBA)是Visual Basic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化任务的编程语言,常用来扩展 Microsoft Office 软件的功能。
我们可以基于 Word 自带的「开发工具」来编写 VBA 宏。这个开发工具的入口在这里:
如果你没有这个选项卡,则需要通过 Word > 文件 > 选项 > 自定义功能区来添加该选项卡:
接下来我们就可以通过开发工具 > 代码部分来编写 VBA 了~
关于录制宏的作用:如果您不确定要使用哪种Visual Basic或属性,可以通过录制宏,将在 Word 中手动执行的操作,自动转换成 Visual Basic 代码,然后再稍微调整代码来明确所需的操作即可。具体步骤可参考官方文档—— Microsoft 技术文档: 通过录制宏生成代码。
第三方工具:WordSR
且慢,「批量进行文本替换」这么通用的功能一定有人已经实现了,果然,Funduc Software 公司开发了一款软件,叫 Word Search and Replace 2.40,它还有图形界面:(该公司还开发了升级款,Replace Studio Pro、Replace Studio Business Edition、Search and Replace 三兄弟,但是对中文文档查找都存在乱码情况,亲试,感兴趣的可以去研究研究)
类似 Word 的查找替换功能,但增加了多文件选择能力。
1)第一个输入框:填写要搜索的内容;
2)第二个输入框:输入替换后的内容;
3)第三个输入框:输入要批量处理的文件路径,注意,*.doc
代表将要处理文件夹下所有 .doc
文件,*.doc*
则还会处理 *.docs
文件。
PS:它也支持正则匹配,记得勾选“Use Pattern Matching”;如果文件夹下面子文件夹里的文档也需要替换,记得勾选“Search Subdirectories”。
使用步骤:
⚠️:使用前记得备份,记得备份,记得备份。
1)进入 http://www.funduc.com/word_sr.htm 网页,下载软件压缩包。
2)解压后如下图,双击打开 WordSR_240_64bit.docm 文件(根据系统和 Office 版本选择,现在我们使用的电脑一般都是 64bit 系统)。
3)双击 Double Click Here To Run Word Search and Replace 文本(如果 Word 弹出安全警告:宏已被禁用,则先点击启用内容),然后就可以愉快的使用了~
注:上面这个文档里也有详细的使用说明,遇到不懂的可以浏览一番;通过点击开发工具 > Visual Basic,我们还可以查看它的源码,它的本质也是 VBA。
好了😊,通过这个第三方工具,我已经帮女律师完成了大部分的替换工作,但还有一些定制化的需求,比如一些特定文本需要加粗或者加下划线,该怎么实现呢?自己动手,丰衣足食。
定制化功能
定制化需求有:1)带格式的文本替换;2)删除最后一页;3)文末添加内容
0)批量处理
首先,实现这些需求最重要的其实是批量处理的能力,也就是实现循环遍历文件夹的能力⭐️。
代码如下:(代码我已经加了一些注释,方便理解,也方便你按需修改。)
Sub 循环遍历文件夹()
'
' 循环遍历文件夹 宏
'
'
On Error Resume Next '当宏内出现"运行时错误"时,程序会继续运行,不中断
'Dim声明变量,As后指定类型,如果不指定,默认为Variant类型
'$是As String的简写,&是As Long的缩写
Dim objShell As Object, objFolder As Object, pPath$, f As Object, fd As Object, fso As Object, Stack$(), top&, n&, stxt$, doc As Document, x&
'Set用来分配对象引用,也就是设值
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(0, "请选择要进行批量处理的文件夹!", 0, 0)
If (objFolder Is Nothing) Then Exit Sub '如果选择了Cancel,则直接退出
'获取文件夹路径
pPath = objFolder.self.Path & ""
Set objShell = Nothing
Set objFolder = Nothing
Set fso = CreateObject("Scripting.FileSystemObject")
top = 1
ReDim Stack(0 To top)
'遍历文件夹,包括子文件夹(利用栈结构记录)
Do While top >= 1
For Each f In fso.GetFolder(pPath).Files
n = n + 1
stxt = f.Path
'处理.doc和.docs文件
If stxt Like "*.doc*" Then
Set doc = Documents.Open(FileName:=stxt, Visible:=True) 'Visible设为True,有的操作需要可见才生效
Call 文本替换 '【单个文档的处理方式】请选择任意宏使用!
doc.Close SaveChanges:=wdSaveChanges ':=用于给参数赋值
x = x + 1
End If
Next
For Each fd In fso.GetFolder(pPath).SubFolders
Stack(top) = fd.Path
top = top + 1
If top > UBound(Stack) Then ReDim Preserve Stack(0 To top)
Next
If top > 0 Then pPath = Stack(top - 1): top = top - 1 '":"用于连接两个语句
Loop
Set f = Nothing
Set fd = Nothing
Set fso = Nothing
'若不使用函数的返回值,则不需要括号,否则需要将参数包含在括号中
MsgBox "文件夹包含 " & n & " 个文件!" & vbCr & "共处理 Word 文档(*.docx/*.doc) " & x & " 个!", 0 + 48
End Sub
这个代码实现了遍历某一个文件夹,并对里面的每一个文件进行相同的处理,这个处理方式取决于 Call 文本替换
这一行代码。
而 文本替换
就是下面编写好的一个宏,也可以理解为一个函数。
1)带格式的文本替换
代码如下:(同样我也写好了注释,里面的格式你可以按需修改)
Sub 文本替换()
'
' 文本替换 宏
'
'
With ActiveDocument.Content.Find
.ClearFormatting
With .Replacement
.ClearFormatting
.Font.Bold = True '字体加粗
.Font.Underline = wdUnderlineSingle '添加单下划线
End With
'执行查找并替换:'FindText是要查找的文本,ReplaceWith是替换后的文本,Format为True表示带格式
'"_"用来分行
.Execute _
FindText:="公众号", _
ReplaceWith:="Bo2SS", _
Format:=True, _
Replace:=wdReplaceAll 'wdReplaceAll替换所有,wdReplaceOne只替换一次
End With
End Sub
2)删除最后一页
代码如下:(详见注释)
Sub 删除最后一页()
'
' 删除最后一页 宏
'
'
Dim pageNum As Long, StartPage As Long, EndPage As Long
'获取总页数
pageNum = Word.ActiveDocument.Range.Information(wdNumberOfPagesInDocument)
'确定最后一页的起始范围,并选中
StartPage = Selection.GoTo(What:=wdGoToPage, Which:=wdGoToNext, Count:=pageNum - 1).Start
EndPage = ActiveDocument.Content.End
ActiveDocument.Range(StartPage, EndPage).Select
'删除选中内容
Selection.Delete
End Sub
批量处理代码中,Call 文本替换
替换成 Call 删除最后一页
即可使用。
3)文末添加内容
代码如下:(详见注释)
Sub 文末添加内容()
'
' 文末添加内容 宏
'
'
Dim oRng As Range, oDoc As Document
Set oDoc = Word.ActiveDocument
Set oRng = oDoc.Content
With oRng
'在文档的末尾插入字符,如Chr(10)则添加换行、"你好"则添加你好
.InsertAfter Chr(10)
'.InsertAfter "你好"
End With
End Sub
批量处理代码中,Call 文本替换
替换成 Call 文末添加内容
即可使用。
🔎 具体使用步骤
⚠️:使用前记得备份,记得备份,记得备份。
a) 选择开发工具 > 点击宏 > 输入宏名 > 点击创建;
b)在打开的 VBA 编辑器里拷贝上面的 4 段代码;
c)将光标移至「循环遍历文件夹」宏中,按 F5 运行,弹出文件夹选择窗口,选择文件夹后将对里面的每个文件进行相应的处理了!
Tips
- 强制停止宏运行:Ctrl + break。
- 当你对 VBA 有一些不明白的用法时,首先去 Microsoft 技术文档: Word VBA 参考 中寻找答案吧!
- VScode 里有一个插件叫 VSCode VBA,借助它编写 VBA 更养眼~
怎么样?是不是真正感受到了 Word 哥的可玩性了呢!
Microsoft,Respect!
至此,女朋友也早早的完成了任务,然后我们一起愉快的去爬山了,这次推送的封面也就是本次任务的奖励之一了👀~