這裡介紹如何使用 Excel VBA 來控制活頁簿、工作表與儲存格的資料,用程式自動產生表格。
在開始之前,請先設定好 Excel VBA 的開發環境,啟用開發人員工具,並且開啟 Excel VBA 的程式編輯視窗。
儲存格
首先我們介紹如何在 VBA 中控制 Excel 的儲存格。
Range 物件
在 VBA 中我們可以透過 Range 物件來選取並操作儲存格,這個物件是 Excel VBA 最重要的物件之一,使用頻率相當高,以下是各種使用方式。
若要將目前工作表的 A1 儲存格的內容設為 Hello,可以這樣寫:
Range("A1").Value = "Hello"
Range 物件的第一個參數放置儲存格的位置,這樣就可以將這個位置的儲存格抓出來,而 Value 屬性就是這個儲存格的內容,直接將 Value 指定成新的資料就可以更新 Excel 儲存格內容。
我們可以自己新增一個副程式(Sub),把這一行指令放在裡面來執行:

執行之後,A1 儲存格的內容就會變成 Hello。

通常在開發 Excel VBA 程式的時候,都會同時開啟 Excel 與 VBA 的視窗,一邊開發程式一邊進行測試,而這樣的開發環境在每一台有安裝 Office 的電腦都有,不需要另外安裝,既方便又好用。

如果要一次更改多個連續的儲存格內容,可以在 Range 的參數中指定儲存格的範圍,例如:
Range("A1:A4").Value = 5
這樣就會把 A1 到 A4 儲存格的內容都更改為 5:

如果範圍不是連續的,也可以一次使用多個範圍來指定:
Range("A1:A2,B3:C4").Value = 10
這樣就可以更改任意範圍的儲存格內容:

Range 也可以用來處理自訂名稱的儲存格,只要在 Range 的參數中指定儲存格的名稱即可,例如:
Range("MyCell").Value = 123
這樣 MyCell 這個儲存格的內容就會被指定為 123:

Cells 物件
除了 Range 之外,Cells 也是一個可以用來操作儲存格的物件,其功能跟 Range 都差不多,只不過它是使用行與列的編號來指定儲存格,這種指定方式在撰寫自動化程式時會比較好用。
如果要使用 Cells 將第一行第一列的儲存格內容指定為 23,可以這樣寫:
Cells(1, 1).Value = 23
結果會像這樣:

如果要指定範圍,可以使用兩個 Cells 配合 Range,例如:
Range(Cells(1, 1), Cells(4, 2)).Value = 13
執行結果為:

使用 Range 或 Cells 所取出的儲存格,除了可以透過 Value 改變內容之外,也還有其他很多可用的操作。呼叫 Select 可以選取這些儲存格:
Range(Cells(1, 1), Cells(4, 2)).Select
這樣這些 Excel 上的儲存格就會變成選取的狀態:

如果要選擇整個行(row),可以使用 Rows 並指定行的編號:
Rows(3).Select
執行結果為:

列的話則使用 Columns:
Columns(2).Select
執行結果為:

複製與貼上
Excel VBA 也可以使用程式自動進行複製與貼上的動作,假設原本的 Excel 資料是這樣:

我們可以使用 Select 將要複製的範圍先選取起來:
Range("A1:A2").Select
當這些儲存格被選取之後,在 VBA 中就可以透過 Selection 物件來取得這些被選取的儲存格,接著就使用 Selection 物件的 Copy,將選取的儲存格複製起來:
Selection.Copy
複製好資料之後,接著再選擇要貼上的位置:
Range("C3").Select
然後呼叫 ActiveSheet 的 Paste 將資料貼上去:
ActiveSheet.Paste
這是貼上後的結果:

清除儲存格
若要清除儲存格中的資料,可以使用 ClearContents:
Range("A1:A2").ClearContents
或是直接將儲存格的內容指定為空字串亦可:
Range("A1").Value = ""
接下來要介紹工作表與活頁簿的操作方式,請繼續閱讀下一頁。
工作表
如果要對多張 Excel 工作表進行操作,可以使用 Worksheets 物件加上工作表的名稱來指定工作表:
Worksheets("工作表1").Range("A1").Value = "工作表1的A1"
Worksheets("工作表2").Range("A1").Value = "工作表2的A1"
這樣會分別改變工作表1與工作表2的 A1 儲存格,工作表1會變成這樣:

而工作表2會變成這樣:

Worksheets 物件也可以使用工作表的順序來指定工作表:
Worksheets(1).Range("A1").Value = "工作表1的A1"
Worksheets(2).Range("A1").Value = "工作表2的A1"
上面這兩行的作用會跟之前使用工作表名稱的方式相同。
如果要新增工作表,可以執行:
Worksheets.Add
這樣就會新增一個工作表:

新增的工作表預設會放在第一個位置,我們可以使用它的 Name 屬性來改變他的名稱:
Worksheets(1).Name = "新的工作表"
執行結果會像這樣:

Worksheets 的 Count 可以計算目前工作表的數量,MsgBox 可以跳出一個視窗顯示簡單的訊息:
MsgBox Worksheets.Count
執行結果為:

活頁簿
VBA 的 Workbooks 物件代表 Excel 目前開啟的活頁簿,如果需要在程式中同時處理多本活頁簿的資料時,就會需要用到它。例如要把活頁簿1中的第一張工作表的 A1 儲存格內容設定為 Hello,則執行:
Workbooks("活頁簿1").Worksheets(1).Range("A1").Value = "Hello"
這個用法跟之前工作表與儲存格的操作類似,只是在前面多加了一個 Workbooks 物件來指定活頁簿而已。同樣地 Workbooks 除了用名稱指定之外,也可以使用活頁簿的編號:
Workbooks(1).Worksheets(1).Range("A1").Value = "Hello"
若要查看目前的活頁簿數量,則可使用 Workbooks 的 Count:
MsgBox Workbooks.Count
活頁簿的名稱可以從 Name 取得:
MsgBox Workbooks(1).Name
如果要開啟活頁簿(開啟 Excel 檔),可以使用 Open:
Workbooks.Open "C:VBAdemo.xlsx"
若要儲存活頁簿(儲存 Excel 檔),則可使用 Save:
Workbooks("demo").Save
若要將活頁簿另存新檔,則可使用 SaveAs:
Workbooks("demo").SaveAs "C:VBAanother.xlsx"
Activate 可以指定當前活頁簿:
Workbooks("demo").Activate
若要關閉活頁簿,則可使用 Close:
Workbooks("demo").Close
如果要關閉所有的活頁簿,但留下主視窗,則可執行:
Workbooks.Close
若要關閉整個 Excel,可以執行:
Application.Quit
熟練了 Excel VBA 的活頁簿操作技巧之後,我們就可以很容易地開啟很多個 Excel 檔進行各種自動化的動作了。

最後補充一個小技巧,在撰寫完一個副程式(Sub)時,通常都會需要馬上執行,測試看看執行的結果如何。在工具列上有一個執行的按鈕,按下去就可以執行,而這時候如果游標沒有在任何一個副程式之內,那麼在按下執行按鈕時,就會跳出一個選擇視窗,詢問要執行的副程式,這樣會比較浪費時間。
如果想要加入開發的速度、節省時間,可以將滑鼠的游標放在要執行的副程式之內,然後按下執行的按鈕,這樣就可以馬上執行該副程式,在開發程式時會比較有效率。
