這裡介紹 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
這樣在點選儲存格之後,就會自動以背景顏色標示儲存格的位置。
更多關於 VBA 的教學文章,請參考 VBA 程式設計。
參考資料:Excel Easy、tutorialspoint、ExcelFunctions.net
Eric
非常詳細的教學,期待看到更新的文章,感謝!!
Bing
期待15~19的後續內容,受益匪淺
G. T. Wang
由於最近剛好在忙著研究其他的技術,比較沒時間寫這部分,過一陣子應該會再找時間繼續把他寫完。 🙂
沈建國
1.請問於我有textbox1~10,我要如何利用for next 來使他看不見
2.如何於vba利用類似vlookup的功能查sheet的內容?謝謝您
Skyland
Thanks bro, your articles help me a lot
Thank you very much
Kan
嘗試學習VBA便出錯,導致不能顯示正常見面版面,請賜教如何解決。
Kan
Excel 點選「開發人員」再選「Visual Basic」便會出現見面畫面 (左方有些選項、右方灰色),我不知按錯甚麼鍵,導致只見灰色區而不見選擇項,請賜教如何恢復過來。
穆
可按 檢視>專案總管