這裡介紹 Excel VBA 事件功能的使用方式,並提供基本的範例程式碼。
當使用者在 Excel 中進行某些特定的操作時,就會觸發所謂的事件(events),例如當使用者選擇一張工作表時,就會觸發工作表選擇的事件,而像點選儲存格或儲存檔案等動作也都會觸發對應的事件。
我們可以針對不同的事件撰寫對應的處理子程序,也就是設定當事件發生時該執行的 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
這樣在點選儲存格之後,就會自動以背景顏色標示儲存格的位置。
更多關於 VBA 的教學文章,請參考 VBA 程式設計。