VBA的最強大的實務功能莫過於協助我們解決繁冗重複的工作,讓我們空出頭腦去處理更多更有意義的事情,好比說是換個公司名號、改個日期,發送通知信件等等。一直點擊EXCEL名單,在WORD裡面COPY AND PASTE,每天重覆千萬次相同操作,可以說是痛苦兼無聊。

所以,接下來,讓我們看看怎樣可以試著偷偷地終結這種無聊生活吧,為什麼要偷偷地呢?因為你要是讓其它人知道,你的工作量就會被編程加重哦。

開個玩笑,我們正式進入主題之前,最好要先有點VBA的基礎,可以參考<Excel VBA的自學心得分享>

記得,開始之前一定要在VBA裡面的工具–>設定引用項目–>勾選Microsoft Office 14.0 Object Library。

自學VBA WORD

內容目錄

啟動、關閉Word應用程式

‘啟動Word 然後關閉

Sub launchWord()

      ‘宣告儲存Word的變數

      Dim wdApp As Word.Application

      ‘對wdapp這個對象賦值

      Set wdApp = New Word.Application

      ‘顯示Word

      wdApp.Visible = True

      MsgBox  “OPEN WORD”

     ‘關閉Word

     wdApp.Quit

     ‘物件不參照任何內容

     Set wdApp = Nothing

End Sub

Set的物件變數

關於Set的物件變數,如果已經了解Set的朋友,可以跳過。

剛才的例子執行了三個動作:1) 打開word。2) 輸出訊息方塊。 3) 關閉word。

整個程式碼大概就只有Set的用法比較難理解,下面我們再舉個例子來解釋Set。

‘不使用set物件變數

Sub controlWorksheet()

‘輸出工作表名稱

MsgBox Worksheets(“sheet1”).Name

‘將工作表複製到右側

Worksheets(“sheet1”).Copy After:=Worksheets(“sheet1”)

End Sub

執行了兩個動作:1)輸出工作表名稱的訊息方塊。2) 將工作表複製到右側。我們可以看到Worksheets(“sheet1”)重複了三次,重複的程式寫法,會降低程式的可讀性和可維護性,下面我們可以用Set來解決重複編寫的問題。

‘使用set物件變數

Sub controlWorksheet2()

‘宣告Worksheet型的物件變數

Dim ws As Worksheet

‘將工作表Sheet1儲存在變數

Set ws = Worksheets(“sheet1”)

‘輸出工作表名稱

MsgBox ws.Name

‘將工作表複製到右側

ws.Copy After:=ws

End Sub

我們大概可以歸納出Set跟我們通常對變數賦值有點不一樣,再舉個例子,

例子1) 如果儲存格”A1”的值為1,

我們用set rng=range(“A1”) ,這個時候rng的值會參照range(“A1”)的值,

我們寫rng = 2,儲存格range(“A1”)等於2。

例子2) 如果儲存格”A1”的值為1,

我們不用set直接賦值給rng, rng=range(“A1”),這時候rng等於1,

我們寫rng = 2,這時候,儲存格range(“A1”)仍然等於1。

這就是rng作為變數直接賦值以及rng作為對象賦予一個參照的不同地方。以後只要關於對象的操作,Set就會經常出現在各種地方,所以為什麼我會花這麼多篇幅去解釋。

下面我們再回到Word的操作。

開啟指定路徑的Word文件

‘打開指定路徑的Word文件 然後關閉

Sub openWord()

‘—啟動Word應用程式—

      Dim wdApp As Word.Application

      Set wdApp = New Word.Application

      wdApp.Visible = True

‘—打開Word文件—

      ‘打開文件的路徑

      Dim path As String

      path = “C:\openword”

      ‘打開文件

      Dim wdDoc As Word.Document

      Set wdDoc = wdApp.Documents.Open(path & “\word.docx”)

      MsgBox “文件已打開”

     ‘關閉Word

     wdDoc.Close

     ‘物件不參照任何內容

     Set wdDoc = Nothing

‘—關閉Word應用程式—

     wdApp.Quit

     Set wdApp = Nothing

End Sub


打開指定文件的寫法跟最開始的launchWord()一樣,只是多了一個指定路徑文件的操作,當然,在此之前,請不忘記要先預備好指定路徑的檔案才能夠打開,我們隨便加上一些字以及表格作為標誌。

Word檔的原始檔內容

正式開始對Word文件的操作

在打開與關閉Word之間的地方加入以下語法

     ‘在段落開頭插入文字

      wdDoc.Paragraphs(1).Range.InsertBefore “2020年1月1日”

      wdDoc.Paragraphs(3).Range.InsertBefore “A公司”

      ‘將字串插入表格內的儲存格

      wdDoc.Tables(1).Cell(Row:=1, Column:=1).Range.InsertBefore “你好”

      wdDoc.Tables(2).Cell(Row:=1, Column:=1).Range.InsertBefore “感謝支持”

主要的寫法是在段落加入文字或者在表格加入文字,用表格的用處很多,只要框線無色就不會顯示是表格,而且表格可以固定位置,即使插入多行文字,也不會影響後面的段落。

跑程式後的結果

自學VBA-練習實作

下面我們動手動作實作一下,打開指定路徑的Word文件,然後添加Excel裡面的資訊,再另存新檔,關閉Word。

Word檔的原始檔內容
Excel檔的原始檔內容

‘打開指定路徑的Word文件 然後關閉

Sub openExample()

‘—啟動Word應用程式—

      Dim wdApp As Word.Application

      Set wdApp = New Word.Application

      wdApp.Visible = True

‘—打開Word文件—

      ‘打開文件的路徑

      Dim path As String

      path = “C:\openword”

      ‘打開文件

      Dim wdDoc As Word.Document

      Set wdDoc = wdApp.Documents.Open(path & “\example.docx”)

      ‘MsgBox “文件已打開”

      ‘在段落開頭插入文字

      wdDoc.Paragraphs(1).Range.InsertBefore Format(Now, “yyyy年m月d日”)

      wdDoc.Paragraphs(5).Range.InsertBefore Cells(1, 1)

      ‘將字串插入表格內的儲存格

      wdDoc.Tables(1).Cell(Row:=1, Column:=1).Range.InsertBefore Cells(1, 2) & Cells(1, 3)

      ‘使用其它名稱儲存檔案

      wdDoc.SaveAs path & “\” & Cells(1, 1).Value & “.docx”

      ‘關閉Word

      wdDoc.Close savechanges:=wdDoNotSaveChanges

      ‘物件不參照任何內容

      Set wdDoc = Nothing

‘—關閉Word應用程式—

     wdApp.Quit

     Set wdApp = Nothing

End Sub

跑程式後的結果

這個例子再加上Excel裡面儲存格的值,最後再加上特定名字儲存起來。

如果要做N次的話,各位朋友應該知道怎麼做了吧。

就是寫個FOR NEXT,然後將cells(i , j) 放入適當的變數就可以囉。

Dim i As Long 

‘有多少筆資料迴圈多少次

Dim maxRow As Long

  maxRow = Cells(Rows.Count, 1).End(xlUp).row

  For i = 1 to maxrRow

  …………….

  Next i

如果需要學習vba對outlook的操作,可以參考《自學Excel VBA系列-如何用VBA控制OutLook?》這篇。

03/13/2026 如果你學習VBA的終極目的是要減輕辦公室工作的壓力,請參考《Excel VBA 自動化教學完整指南:從入門到辦公室自動化應用》,又如果你想分享你的自動化需求,尋求意見,可以透過主頁的「與我聯絡」聯絡我,要聯絡我應該只剩下那個地方了,我真的很樂意為你解答。