來源和處理程式

什麼是活動?

VBA 是事件驅動的 :VBA 程式碼執行以響應主機應用程式或主機文件引發的事件 - 瞭解事件是理解 VBA 的基礎。

API 通常會公開引發響應各種狀態的大量事件的物件。例如,只要建立,開啟,啟用或關閉新工作簿,Excel.Application 物件就會引發事件。或者每當計算工作表時。或者在檔案儲存之前。或者之後立即。當使用者點選它時,表單上的按鈕會引發 Click 事件,使用者表單本身會在啟用後立即引發一個事件,而另一個事件在它關閉之前引發。

從 API 的角度來看,事件是擴充套件點 :客戶端程式碼可以選擇實現處理這些事件的程式碼,並在觸發這些事件時執行自定義程式碼:這就是每次選擇在任何工作表上發生更改時自動執行自定義程式碼的方式 - 通過處理在任何工作表上選擇更改時觸發的事件。

公開事件的物件是事件源。處理事件的方法是處理程式

處理程式

VBA 文件模組(例如 ThisDocumentThisWorkbookSheet1 等)和 UserForm 模組是類模組,它們實現了暴露大量事件的特殊介面。你可以在程式碼窗格頂部的左側下拉選單中瀏覽這些介面:

ThisWorkbook 模組實現 Workbook 事件

右側下拉選單列出了左側下拉選單中所選介面的成員:

工作表模組可以處理 Worksheet 事件

當在右側列表中選擇專案時,VBE 自動生成事件處理程式存根,或者如果存在處理程式,則在那裡導航。

你可以在任何模組中定義模組範圍的 WithEvents 變數:

Private WithEvents Foo As Workbook
Private WithEvents Bar As Worksheet

每個 WithEvents 宣告都可以從左側下拉選單中進行選擇。在右側下拉選單中選擇事件時,VBE 會生成一個以 WithEvents 物件命名的事件處理程式存根以及事件名稱,並使用下劃線連線:

Private WithEvents Foo As Workbook
Private WithEvents Bar As Worksheet

Private Sub Foo_Open()

End Sub

Private Sub Bar_SelectionChange(ByVal Target As Range)

End Sub

只有暴露至少一個事件的型別才能與 WithEvents 一起使用,並且 WithEvents 宣告不能使用 New 關鍵字在現場分配參考。此程式碼是非法的:

Private WithEvents Foo As New Workbook 'illegal

物件引用必須是 Set 顯式; 在類模組中,通常在 Class_Initialize 處理程式中執行此操作的好地方,因為只要該例項存在,該類就會處理該物件的事件。

來源

任何類模組(或文件模組或使用者表單)都可以是事件源。使用 Event 關鍵字在模組的宣告部分中定義事件的簽名 : **

Public Event SomethingHappened(ByVal something As String)

事件的簽名決定了事件的引發方式以及事件處理程式的外觀。

事件只能在它們定義的類中引發 - 客戶端程式碼只能處理它們。使用 RaiseEvent 關鍵字引發事件; 此時提供了事件的引數:

Public Sub DoSomething()
    RaiseEvent SomethingHappened("hello")
End Sub

如果沒有處理 SomethingHappened 事件的程式碼,執行 DoSomething 程式仍會引發事件,但不會發生任何事情。假設事件源是名為 Something 的類中的上述程式碼,ThisWorkbook 中的此程式碼將在 test.DoSomething 被呼叫時顯示一個訊息框,顯示 hello

Private WithEvents test As Something

Private Sub Workbook_Open()
    Set test = New Something
    test.DoSomething
End Sub

Private Sub test_SomethingHappened(ByVal bar As String)
'this procedure runs whenever 'test' raises the 'SomethingHappened' event
    MsgBox bar
End Sub