這裡介紹 Excel VBA 事件功能的使用方式,並提供基本的範例程式碼。
當使用者在 Excel 中進行某些特定的操作時,就會觸發所謂的事件(events),例如當使用者選擇一張工作表時,就會觸發工作表選擇的事件,而像點選儲存格或儲存檔案等動作也都會觸發對應的事件。
程式設計者可以靠著各種事件的的觸發來設計可以自動執行的 VBA 程式,例如在選擇工作表時,自動執行某些 VBA 程式等。以下介紹如何在 Excel VBA 中使用事件。
事件處理子程序
我們可以針對不同的事件撰寫對應的處理子程序,也就是設定當事件發生時該執行的 VBA 程式,事件的處理子程序跟一般自訂的子程序差不多,只是事件的處理子程序有比較特殊的名稱,在對應的事件被觸發時,就會連帶自動執行。
Step 1
在工具列中點選「Visual Basic」,開啟 Visual Basic 編輯器,或是直接使用快速鍵 Alt + F11 開啟。

Step 2
如果要處理活頁簿的事件,就要把事件處理子程序寫在活頁簿中,若是要處理單張工作表的事件,就放在對應的工作表中。這裡我們以活頁簿事件來作為示範,點擊兩下活頁簿,開啟程式碼編輯視窗。

Step 3
選擇活頁簿(Workbook)。

Step 4
這時候程式碼編輯視窗內會出現一個預設的 Workbook_Open 處理子程序,這個就是對應到活頁簿開啟事件(open event)的處理子程序,寫在這裡的程式碼就會在活頁簿開啟時自動執行。
在右上角的下拉式選單中可以選擇其他的事件,建立不同事件的處理子程序。這個例子我們先以 Workbook_Open 處理子程序做為示範。

Step 5
在 Workbook_Open 子程序中,填入當活頁簿開啟時所要執行的程式碼,這裡我以一行簡單的 MsgBox 輸出訊息作為示範。
MsgBox "Hello, Event."

Step 6
編輯好 VBA 程式碼之後,接著將 Excel 活頁簿存檔。為了使 Excel 活頁簿中的 VBA 程式碼可以正常執行,在儲存時要選擇以「啟用巨集的活頁簿」來儲存。

Step 7
存檔之後,先將 Excel 檔案關閉,再重新打開,而開啟時 Workbook_Open 處理子程序中的 VBA 程式就會自動被執行,所以就會看到我們剛剛寫的提示訊息。

常用事件
這裡示範幾種 Excel 中常用的事件用法。
儲存格變更事件
當任何的 Excel 儲存格內容有變動時,就會觸發活頁簿的 SheetChange 事件,我們可以用 Workbook_SheetChange 來處理:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
MsgBox "儲存格 (" & Target.Row & "," & Target.Column _
& ") 更新為 " & Target.Value
End Sub

設定 Workbook_SheetChange 這個事件處理子程序之後,接下來只要有任何的儲存格內容有變動,就會顯示這樣的訊息。

活頁簿的 Workbook_SheetChange 會接收任何工作表所觸發的 SheetChange 事件 ,如果要判斷是哪一張工作表所產生的事件,可以從 Workbook_SheetChange 子程序的第一個傳入參數來判斷。
如果只要處理特定工作表中的儲存格變更事件,也可以把事件處理子程序寫在對應的工作表中,而工作表的儲存格變更事件是以 Worksheet_Change 來處理的,使用方式大同小異:
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "儲存格 (" & Target.Row & "," & Target.Column _
& ") 更新為 " & Target.Value
End Sub

選擇儲存格事件
只要當工作表中選擇的儲存格範圍有改變時(用滑鼠或鍵盤等方式),就會觸發 SelectionChange 這個工作表的儲存格選擇變更事件,這個事件可以使用工作表的 Worksheet_SelectionChange 子程序來處理。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "選擇儲存格 (" & Target.Row & "," & Target.Column & ")"
End Sub

建立了這個工作表的選擇儲存格事件處理子程序之後,只要當工作表中選擇的儲存格範圍有改變,就會自動顯示目前選擇的儲存格資訊。

點擊兩下儲存格事件
若使用滑鼠在 Excel 儲存格中連續點擊兩下,就會觸發 DoubleClick 事件,此事件可用 Worksheet_BeforeDoubleClick 來處理。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If (Target.Font.Color = vbBlack) Then
' 把黑色文字改為紅色
Target.Font.Color = vbRed
Else
' 把紅色文字改為黑色
Target.Font.Color = vbBlack
End If
' 關閉 Excel 預設動作
Cancel = True
End Sub
Worksheet_BeforeDoubleClick 第一個傳入參數是點擊的儲存格,而第二個參數 Cancel 是一個布林值,代表是否要將 Excel 預設的動作關閉。
這個例子是設計讓使用者在點擊儲存格之後,可讓儲存格的文字顏色在黑色與紅色之間切換,在預設的狀況下,當使用者連續點擊兩次儲存格時,會讓儲存格轉為編輯模式(就是出現游標,可以輸入文字的狀態),若不要讓儲存格轉為編輯模式,可將 Cancel 設為 True,這樣 Excel 就只會執行我們的 VBA 程式碼,而不會讓儲存格轉為編輯模式。

執行之後,我們只要在儲存格上面點兩下,它的文字就會變成紅色,再點兩下的話又會變回黑色。

應用範例
我們可以將任何的 VBA 程式碼放進各種事件的處理子程序中,這樣就可以讓 Excel VBA 程式自動處理各式各樣的問題,以下是一些簡單的應用範例。
標示選擇的儲存格
這個範例是透過改變背景顏色的方式,將目前作用中的儲存格位置標示出來,清楚顯示儲存格的行與列。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rowNumberValue As Integer, columnNumberValue As Integer
Dim i As Integer, j As Integer
' 清除所有儲存格的背景顏色
Cells.Interior.ColorIndex = 0
' 取得目前作用中的儲存格
rowNumberValue = ActiveCell.Row
columnNumberValue = ActiveCell.Column
' 以背景顏色標示儲存格
For i = 1 To rowNumberValue
Cells(i, columnNumberValue).Interior.ColorIndex = 37
Next i
For j = 1 To columnNumberValue
Cells(rowNumberValue, j).Interior.ColorIndex = 37
Next j
End Sub

這樣在點選儲存格之後,就會自動以背景顏色標示儲存格的位置。

