合併具有文字框的Word文件:VBA程式碼批次操作

疯狂学习GIS發表於2024-11-16

  本文介紹基於VBA語言,對大量含有圖片、文字框與表格的Word文件加以批次自動合併,並在每一次合併時新增分頁符的方法。

  在我們之前的文章中,介紹過基於Python語言的python-docxdocx)模組與docxcompose模組,對大量Word文件加以合併的方法;但是,基於這種方法,我們無法對具有非明確大小的文字框Word加以合併,因為python-docx無法處理含有這種元素的Word檔案。最近,一位老哥提出了合併含有文字框Word的需求,所以就嘗試用VBA來實現這一操作,這裡就介紹一下具體的方法。

  其中,VBA是Visual Basic for Applications的縮寫,其是基於Visual Basic語言的一種擴充套件,主要應用於微軟Office套件中各種應用程式,例如WordExcelPowerPoint等;其允許使用者建立自定義的宏和應用程式來自動執行各種任務,從而提高工作效率。目前,VBA主要就是應用於需要批次操作Office檔案的各類場景中。

  本文的需求如下。現在有一個資料夾,其中包含大量文件檔案,如下圖所示;其中,每一個文件中,都包含圖片、表格、文字框等較為複雜的元素

image

  我們現在希望,可以批次將資料夾中大量文件檔案加以合併;並且在合併時,每次都需要在新的1頁中合併下一個檔案(也就是,不同檔案的內容不要出現在1頁中)。

  明確了需求,即可開始程式碼撰寫。本文所需程式碼如下。

Sub merge_word()
    Dim time_start As Single: time_start = Timer
    Dim word_result As Document
    Dim word_temp As Document
    Dim file_dialog As FileDialog
    Dim str As String
    Dim file
    Dim num As Long
    
    Set word_result = ActiveDocument
    Set file_dialog = Application.FileDialog(msoFileDialogFilePicker)
    
    With file_dialog
        .AllowMultiSelect = True
        .Title = "請選擇【一個或多個】需要與當前文件合併的檔案"
        With .Filters
            .Clear
            .Add "Word檔案", "*.doc*;*.dot*;*.wps"
            .Add "所有檔案", "*.*"
        End With
        If .Show Then
            Application.ScreenUpdating = False
            num = .SelectedItems.count
            For Each file In .SelectedItems
                Set word_temp = Documents.Open(file)
                word_temp.Range.Copy
                
                word_result.Range(word_result.Range.End - 1, word_result.Range.End).Select
                
                DoEvents
                Selection.Paste
                Selection.InsertBreak
                
                word_temp.Close wdDoNotSaveChanges
            Next
            
            Application.ScreenUpdating = True
        End If
    End With
    
    Set word_result = Nothing
    Set word_temp = Nothing
    Set file_dialog = Nothing
    
    str = Format(Timer - time_start, "均已成功合併;共用時0秒!")
    str = Format(num, "您選擇合併0個檔案,") & str
    MsgBox str, vbInformation, "檔案合併結果"
End Sub

  上述程式碼中,我們首先進行變數宣告time_start是一個Single型別的變數,用以記錄程式碼開始執行的時間;Timer函式返回一個單精度浮點數,表示從計算機啟動到現在經過的秒數。word_result是一個Document型別的變數,用以儲存當前開啟的Word文件。word_temp是另一個Document型別的變數,用以臨時儲存要合併的其他Word文件。file_dialog是一個FileDialog型別的變數,用以儲存檔案選擇對話方塊物件。str是一個字串型別的變數,用以儲存最終要顯示在訊息框中的合併結果資訊。file用以在迴圈中儲存使用者選擇的每個檔案路徑。num是一個長整型變數,用以儲存使用者選擇的檔案數量。

  隨後,我們獲取當前文件。將當前正在編輯的Word文件賦值給word_result變數,這個文件就是要合併其他文件內容的結果文件。

  接下來,我們開啟檔案選擇對話方塊。建立一個檔案選擇對話方塊物件,並逐一設定對話方塊的屬性;其中,允許使用者選擇多個檔案,自定義對話方塊標題,並設定檔案型別過濾器,其中第一個表示只顯示Word文件檔案,第二個則表示顯示所有型別的檔案。

  緊接著,透過If .Show Then語句,判斷使用者在對話方塊中是否選擇了檔案。如果是的話,執行合併操作。其中,首先獲取使用者選擇的檔案數量;隨後,迴圈遍歷每個選擇的檔案——開啟每個選擇的檔案作為臨時文件,將臨時文件的全部內容複製到剪貼簿;將游標定位到目標文件(也就是結果檔案)的最後一個字元處,並將剪貼簿中的內容貼上到目標文件的末尾,同時在貼上的內容後插入一個分頁符;最後,關閉臨時文件而不儲存更改。接下來,進行下一次遍歷。其中需要注意,這裡如果我們不新增DoEvents這句程式碼,會導致其下方的Selection.Paste這句程式碼報錯(雖然會報錯,但其實選擇除錯後繼續按下F5,程式也還是可以執行)。

  最後,即可清理變數引用,並計算合併操作的耗時,將結果資訊顯示在訊息框中。

  程式碼的執行方法如下。首先,在任意路徑建立一個空白的Word文件,作為我們的結果檔案。隨後,在這個文件中,同時按下Alt鍵與F11鍵,進入VBA宏介面,如下圖所示。

  隨後,在左上角的Normal處右鍵,選擇“插入”→“模組”,如下圖所示。

  隨後,在彈出的視窗中,複製前述程式碼,如下圖所示。

  接下來,按下F5鍵,即可開始執行程式碼。其中,首先彈出一個選擇檔案的視窗,我們選擇待合併的檔案即可;如下圖所示。

  隨後,點選“確定”,即可開始合併檔案。稍等片刻,合併完成,並將彈出如下所示介面。

  此時,回到我們開啟的Word檔案中,即可看到檔案已經被合併在內了。

  其中,上圖中紫色框所示區域,就是我這裡待合併檔案的開頭部分(紫色框內紅色的兩段線僅僅是為了遮擋檔案中的部分資訊,沒有別的含義,大家理解即可)——可以看到,每一次新的檔案合併時,都是在新的一頁操作的,符合我們的需求。

  至此,大功告成。

相關文章