VBA的最強大的實務功能莫過於協助我們解決繁冗重複的工作,讓我們空出頭腦去處理更多更有意義的事情,好比說是換個公司名號、改個日期,發送通知信件等等。一直點擊EXCEL名單,在WORD裡面COPY AND PASTE,每天重覆千萬次相同操作,可以說是痛苦兼無聊。
所以,接下來,讓我們看看怎樣可以試著偷偷地終結這種無聊生活吧,為什麼要偷偷地呢?因為你要是讓其它人知道,你的工作量就會被編程加重哦。
開個玩笑,我們正式進入主題之前,最好要先有點VBA的基礎,可以參考<Excel VBA的自學心得分享>。
記得,開始之前一定要在VBA裡面的工具–>設定引用項目–>勾選Microsoft Office 14.0 Object Library。
內容目錄
啟動、關閉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之間的地方加入以下語法
‘在段落開頭插入文字
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文件 然後關閉
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?》這篇。