本文將實現三種批量處理 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!
至此,女朋友也早早的完成了任務,然後我們一起愉快的去爬山了,這次推送的封面也就是本次任務的獎勵之一了👀~