使用VBA編程實現法律文書批量生成

律師工作中,經常遇到使用相同模板制作大量同類型文件的場景,例如群體性訴訟案件的法律文書,或某些非訴訟業務中合同、通知、回執之類文件。

在文件結構完全一致,僅有特定位置的信息、數據不同的情況下,利用Office組件的郵件合并功能,可以實現文件的快速批量生成。就此,已經有一些高手的教程流傳,比如下面兩篇:

手動填寫out!法律文書批量自動生成?

如何批量生成法律文書?

郵件合并功能其實是Office中宏的一種具體應用,直接被作為預置功能固化在軟件中。而宏是基于VBA(Visual Basic for Applications)實現的。對于略有基礎的應用者,直接采用編程方式實現與預置組件類同的功能目標,有時會更加簡單直接、靈活高效。

下面就介紹利用簡單編程,實現與郵件合并相似的文本置換效果,從而批量生成法律文書的方法。


任務設定

某國企改制程序中,需根據職工安置方案設定的條件,生成全部職工的安置補償合同,合同格式均相同,僅個人信息、數據不同。

軟件環境

Windows 10, Office2016(Excel+Word)

操作步驟

1. 新建一個文件夾,隨便命名,比如“VBA”。 打開文件夾,在根目錄下新建一個docx文檔,命名為“模板”;新建一個xlsx文檔,隨便命名,比如“批量生成”。

2. ?編輯docx文檔,起草模板的文本內容。這里的關鍵在于,每份文件之間的差異化信息,要用特定的字符標記出來,便于后面執行自動查找和替換。

這個文檔中選擇采用英文標記,因為這是一份純中文的文件,英文單詞在其中具有特異性,不會與文檔中其他部分文字混淆,從而避免“誤傷”的可能。舉個例子:假定某份模板文檔中用“工資”兩個漢字作為待替換標記,由于它本身是一個常用詞,如果在文檔內其他(不需要替換的)文字內容中出現了這兩個字,在自動生成的文件中也會被一并替換,造成錯誤。

完成后關閉文檔。后面的自動生成步驟中,如果文檔處于打開狀態,可能無法被調用。

提示:示例文件內容亂寫的,不要借鑒,否則造成執業事故后果自負……

3. 打開xlsx文檔,在第一張表(sheet1)中編輯數據。數據列的內容與文檔中需要替換的內容分別對應。

注意:第一行不要填有效數據,可以寫標題,空著也行。因為后面的代碼設定從第二行開始提取數據。

提示:這個示例表中D、E列的數值相同,是前面B、C兩列的數據乘積,直接用公式生成;大小寫的標準寫法可以通過單元格格式設置實現。都是Excel的常規應用。

4. 切到“視圖”菜單,點擊“宏”標簽。

5. 在彈出的對話框中給項目命名,隨便填。然后點擊“創建”。

6. 編程界面,右邊紅框內就是代碼編輯區域。接下來,讓我們一行一行寫代碼……

7. ——怎么可能。厚道如筆者,當然已經把代碼準備好了。如下(重點部分加了詳細注釋,不再另外說明):

Sub production()

Dim mypath, docname, i, wApp? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '定義變量

MkDir ThisWorkbook.Path & "\批量生成"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '在當前路徑下創建名為“批量生成”的文件夾,用于存放生成的文件

mypath = ThisWorkbook.Path & "\批量生成\"? ? ? ? ? ? ? ? ? ? ? ? '指定“mypath”(本例定義的工作路徑)為“批量生成”文件夾

For i = 2 To [a1048576].End(xlUp).Row? ? ? ? ? ? ? ? ? ? ? ? ? '指定后面執行的循環范圍,從第2行開始,到最后一個非空單元格為止

docname = "補償協議-" & Range("A" & i) & ".docx"? ? ? ? ? ? ? ? '定義自動生成的文件名為“補償協議-”+“A列i行的值(相應的姓名)”+“.docx”

FileCopy ThisWorkbook.Path & "\" & "模板.docx", mypath & docname? '復制當前路徑下的“模板.docx”文件到指定路徑(就是“批量生成”文件夾),并按上述規則重命名

Set wApp = CreateObject("word.application")? ? ? ? ? ? ? ? ? ? ? ? '調用word程序打開文件,執行后面操作

With wApp

.Visible = False

.Documents.Open mypath & docname? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '打開上面復制并重命名的文件

Do While .Selection.Find.Execute("name")? ? ? ? ? ? ? ? ? ? ? '在文件中檢索“name”字符串

.Selection.Text = Range("A" & i).Text? ? ? ? ? ? ? ? ? ? ? '使用表格A列i行的值(即相應的姓名)替換找到的“name”字符串

.Selection.HomeKey Unit:=6? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '光標置于文件開頭

Loop? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '循環

'(直到找不到“name”為止,當前文檔中所有“name”字符串都已被替換)

Do While .Selection.Find.Execute("seniority")? ? ? ? ? ? ? ? ? '(下面都是一樣的結構,就是分別用相應列中提取出來i行的值,替換各個預設的字符串,不重復)

.Selection.Text = Range("B" & i).Text

.Selection.HomeKey Unit:=6

Loop

Do While .Selection.Find.Execute("unit")

.Selection.Text = Range("C" & i).Text

.Selection.HomeKey Unit:=6

Loop

Do While .Selection.Find.Execute("compensation")

.Selection.Text = Range("D" & i).Text

.Selection.HomeKey Unit:=6

Loop

Do While .Selection.Find.Execute("inwords")

.Selection.Text = Range("E" & i).Text

.Selection.HomeKey Unit:=6

Loop

Do While .Selection.Find.Execute("status")

.Selection.Text = Range("F" & i).Text

.Selection.HomeKey Unit:=6

Loop

Do While .Selection.Find.Execute("id")

.Selection.Text = Range("G" & i).Text

.Selection.HomeKey Unit:=6

Loop

Do While .Selection.Find.Execute("phone")

.Selection.Text = Range("H" & i).Text

.Selection.HomeKey Unit:=6

Loop

Do While .Selection.Find.Execute("address")

.Selection.Text = Range("I" & i).Text

.Selection.HomeKey Unit:=6

Loop

Do While .Selection.Find.Execute("bank")

.Selection.Text = Range("J" & i).Text

.Selection.HomeKey Unit:=6

Loop

Do While .Selection.Find.Execute("account")

.Selection.Text = Range("K" & i).Text

.Selection.HomeKey Unit:=6

Loop

.Documents.Save

.Quit

End With

Next

Set wApp = Nothing

End Sub

復制以上代碼,粘貼到代碼編輯器內,替換原有全部內容。

8. 點擊“保存”按鈕,對當前工作存檔。結果彈出一個對話框。

這是創建文件時的一個疏忽:默認的xlsx格式不支持在文件中保存宏。這畢竟是可執行的代碼,有安全風險。早些年大名鼎鼎的“宏病毒”很多人應該還有印象,雖然如今已經不多見了。

也沒關系,保存為支持宏的格式就行了。點擊上面對話框中的“否”,在“保存類型”下拉選單中選擇“Excel 啟用宏的工作簿”,保存即可。

文件已經另存為支持宏的格式(擴展名為xlsm)。

9. 打開新保存的“批量生成.xlsm”文件。同樣,點開“宏”標簽,選定剛才創建的項目,點擊“執行”按鈕,代碼開始運行。等上一會兒。

10. 運行完畢。當前路徑下出現了“批量生成”文件夾。

打開新的文件夾,表格里共有10個人的數據,生成10份文檔,都在這里。

隨便打開一份,核對信息,無誤。

擴展提示

實現特定字符串查找和替換功能的模塊如圖所示。

每個紅框內是一個字符串的替換模塊,藍色下劃線標出的是需改動的值。如果需要增加、減少、調整替換目標和內容,對代碼做相應修改即可。

總結

重復一遍,這種方法的優點是:在文檔和數據處理的直觀性、便捷性方面表現更好(比如,像本例中這樣自定義規則給批量生成的文件命名,用郵件合并似乎就實現不了),特別是需要替換的內容較多時,優勢可能更為明顯。

另外,如有能力增加或修訂代碼,還可以實現更多、更精確、更靈活的定制功能。


最后附上涉及的兩個文件模板(無毒)。如果打開Excel表時,程序提示宏已被禁用,點擊啟用即可。

文件模板??


謝謝觀賞(業界良心,此處可以有掌聲)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容