這裡介紹 Excel VBA 事件功能的使用方式,並提供基本的範例程式碼。

當使用者在 Excel 中進行某些特定的操作時,就會觸發所謂的事件(events),例如當使用者選擇一張工作表時,就會觸發工作表選擇的事件,而像點選儲存格或儲存檔案等動作也都會觸發對應的事件。


程式設計者可以靠著各種事件的的觸發來設計可以自動執行的 VBA 程式,例如在選擇工作表時,自動執行某些 VBA 程式等。以下介紹如何在 Excel VBA 中使用事件。

事件處理子程序

我們可以針對不同的事件撰寫對應的處理子程序,也就是設定當事件發生時該執行的 VBA 程式,事件的處理子程序跟一般自訂的子程序差不多,只是事件的處理子程序有比較特殊的名稱,在對應的事件被觸發時,就會連帶自動執行。

Step 1
在工具列中點選「Visual Basic」,開啟 Visual Basic 編輯器,或是直接使用快速鍵 Alt + F11 開啟。

開啟 Visual Basic 編輯器

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

程式碼編輯視窗

Step 3
選擇活頁簿(Workbook)。

選擇活頁簿

Step 4
這時候程式碼編輯視窗內會出現一個預設的 Workbook_Open 處理子程序,這個就是對應到活頁簿開啟事件(open event)的處理子程序,寫在這裡的程式碼就會在活頁簿開啟時自動執行。

在右上角的下拉式選單中可以選擇其他的事件,建立不同事件的處理子程序。這個例子我們先以 Workbook_Open 處理子程序做為示範。

選擇事件

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

MsgBox "Hello, Event."

Open 事件程式碼

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

Excel 儲存為「啟用巨集的活頁簿」

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

開啟 Excel 活頁簿

常用事件

這裡示範幾種 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 程式設計

參考資料:Excel EasytutorialspointExcelFunctions.net