這裡介紹如何使用 Excel VBA 來控制活頁簿、工作表與儲存格的資料,用程式自動產生表格。

在開始之前,請先設定好 Excel VBA 的開發環境,啟用開發人員工具,並且開啟 Excel VBA 的程式編輯視窗。

儲存格

首先我們介紹如何在 VBA 中控制 Excel 的儲存格。

Range 物件

在 VBA 中我們可以透過 Range 物件來選取並操作儲存格,這個物件是 Excel VBA 最重要的物件之一,使用頻率相當高,以下是各種使用方式。

若要將目前工作表的 A1 儲存格的內容設為 Hello,可以這樣寫:

Range("A1").Value = "Hello"

Range 物件的第一個參數放置儲存格的位置,這樣就可以將這個位置的儲存格抓出來,而 Value 屬性就是這個儲存格的內容,直接將 Value 指定成新的資料就可以更新 Excel 儲存格內容。

我們可以自己新增一個副程式(Sub),把這一行指令放在裡面來執行:

VBA 副程式(Sub)

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

執行結果

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

Excel 與 VBA 視窗

如果要一次更改多個連續的儲存格內容,可以在 Range 的參數中指定儲存格的範圍,例如:

Range("A1:A4").Value = 5

這樣就會把 A1A4 儲存格的內容都更改為 5

Excel 活頁簿

如果範圍不是連續的,也可以一次使用多個範圍來指定:

Range("A1:A2,B3:C4").Value = 10

這樣就可以更改任意範圍的儲存格內容:

Excel 活頁簿

Range 也可以用來處理自訂名稱的儲存格,只要在 Range 的參數中指定儲存格的名稱即可,例如:

Range("MyCell").Value = 123

這樣 MyCell 這個儲存格的內容就會被指定為 123

Excel 活頁簿

Cells 物件

除了 Range 之外,Cells 也是一個可以用來操作儲存格的物件,其功能跟 Range 都差不多,只不過它是使用行與列的編號來指定儲存格,這種指定方式在撰寫自動化程式時會比較好用。

如果要使用 Cells 將第一行第一列的儲存格內容指定為 23,可以這樣寫:

Cells(1, 1).Value = 23

結果會像這樣:

Excel 活頁簿

如果要指定範圍,可以使用兩個 Cells 配合 Range,例如:

Range(Cells(1, 1), Cells(4, 2)).Value = 13

執行結果為:

Excel 活頁簿

使用 RangeCells 所取出的儲存格,除了可以透過 Value 改變內容之外,也還有其他很多可用的操作。呼叫 Select 可以選取這些儲存格:

Range(Cells(1, 1), Cells(4, 2)).Select

這樣這些 Excel 上的儲存格就會變成選取的狀態:

Excel 活頁簿

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

Rows(3).Select

執行結果為:

Excel 活頁簿

列的話則使用 Columns

Columns(2).Select

執行結果為:

Excel 活頁簿

複製與貼上

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

Excel 活頁簿

我們可以使用 Select 將要複製的範圍先選取起來:

Range("A1:A2").Select

當這些儲存格被選取之後,在 VBA 中就可以透過 Selection 物件來取得這些被選取的儲存格,接著就使用 Selection 物件的 Copy,將選取的儲存格複製起來:

Selection.Copy

複製好資料之後,接著再選擇要貼上的位置:

Range("C3").Select

然後呼叫 ActiveSheetPaste 將資料貼上去:

ActiveSheet.Paste

這是貼上後的結果:

Excel 活頁簿

清除儲存格

若要清除儲存格中的資料,可以使用 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工作表2A1 儲存格,工作表1會變成這樣:

Excel 活頁簿

工作表2會變成這樣:

Excel 活頁簿

Worksheets 物件也可以使用工作表的順序來指定工作表:

Worksheets(1).Range("A1").Value = "工作表1的A1"
Worksheets(2).Range("A1").Value = "工作表2的A1"

上面這兩行的作用會跟之前使用工作表名稱的方式相同。

如果要新增工作表,可以執行:

Worksheets.Add

這樣就會新增一個工作表:

Excel 活頁簿

新增的工作表預設會放在第一個位置,我們可以使用它的 Name 屬性來改變他的名稱:

Worksheets(1).Name = "新的工作表"

執行結果會像這樣:

Excel 活頁簿

WorksheetsCount 可以計算目前工作表的數量,MsgBox 可以跳出一個視窗顯示簡單的訊息:

MsgBox Worksheets.Count

執行結果為:

Excel 活頁簿

活頁簿

VBA 的 Workbooks 物件代表 Excel 目前開啟的活頁簿,如果需要在程式中同時處理多本活頁簿的資料時,就會需要用到它。例如要把活頁簿1中的第一張工作表的 A1 儲存格內容設定為 Hello,則執行:

Workbooks("活頁簿1").Worksheets(1).Range("A1").Value = "Hello"

這個用法跟之前工作表與儲存格的操作類似,只是在前面多加了一個 Workbooks 物件來指定活頁簿而已。同樣地 Workbooks 除了用名稱指定之外,也可以使用活頁簿的編號:

Workbooks(1).Worksheets(1).Range("A1").Value = "Hello"

若要查看目前的活頁簿數量,則可使用 WorkbooksCount

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 檔進行各種自動化的動作了。

Excel VBA 操作多個活頁簿

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

如果想要加入開發的速度、節省時間,可以將滑鼠的游標放在要執行的副程式之內,然後按下執行的按鈕,這樣就可以馬上執行該副程式,在開發程式時會比較有效率。

Excel VBA 視窗