單一動作,例如從一個物件的控制點移動到另一個控制點,可能會觸發多個不同事件,這些事件會在特定序列中發生。 了解事件發生的時間及其發生的順序非常重要,因為這可能會影響您的巨集或事件程序執行的方式和時機。 例如,如果有兩個要以特定順序執行的事件程序,您要確認其相關聯的事件是否以該相同順序發生。
本文內容
表單控制項的事件順序
當你將焦點移到某個控制項,以及變更和更新控制項資料時,表單上的控制項會發生事件。
注意
Microsoft Office Access 在 Visual Basic 編輯器中顯示的事件名稱與在屬性表和巨集建立器中顯示的事件名稱稍有不同。 例如,在表單的屬性表和巨集建立器中,名為 On Got Focus 的事件在 Visual Basic 編輯器中名為 GotFocus。 本文中的範例會將 Visual Basic for Applications (VBA) 格式用於事件名稱。
將焦點移到控制項
當您將焦點移到表單上的控制項 (例如,透過開啟包含一個或多個作用中控制項的表單,或透過將焦點移至相同表單上的另一個控制項) 時,Enter 和 GotFocus 事件發生的順序如下︰
這時,箭
GotFocus 登場
當您開啟表單時,Enter 和 GotFocus 事件會在與開啟表單相關聯的事件之後發生 (例如Open、Activate 及 Current),如下所示︰
打開 ()
啟動 ()
頭 目前 ()
頭 進入 (控制
GotFocus (控制)
當焦點離開表單上的控制項 (例如,當您關閉包含一個或多個作用中控制項的表單時,或當您移至相同表單上的另一個控制項時) 時,Exit 和 LostFocus 事件發生的順序如下︰
退出
LostFocus
當您關閉表單時,Exit 和 LostFocus 事件會在與關閉表單相關聯的事件之前發生 (例如 Unload、Deactivate 及 Close),如下所示︰
退出 (控制)
迷失焦點 (控制)
卸載 裝載 ()
停用 ()
關閉 ()
變更和更新控制項中的資料
當您在表單上輸入或變更控制項中的資料,然後將焦點移到另一個控制項時,BeforeUpdate 和 AfterUpdate 事件發生的順序如下︰
更新前 箭
更新後更新
對於其值變更的控制項而言,Exit 和 LostFocus 事件會發生在 BeforeUpdate 和 AfterUpdate 事件之後:
之前 更新
更新後
退出
迷失焦點
當您變更文字方塊中的文字或下拉式方塊的文字方塊區段中的文字時,會發生 Change 事件。 每當控制項的內容變更時,但在您將焦點移到不同的控制項或記錄之前 (因此是在 BeforeUpdate 和 AfterUpdate 事件發生之前),就會發生此事件。 對於您在文字方塊或在下拉式方塊的文字方塊區段中按下的每個按鍵,會發生以下的事件順序︰
按鍵箭
按鍵
髒
變更
按鍵
當您在下拉式方塊中輸入下拉式方塊清單中找不到的值,然後嘗試將焦點移至另一個控制項或記錄之後,便會發生 NotInList 事件。 NotInList 事件會發生在下拉式方塊的 keyboard 事件和 Change 事件之後,但是在其他任何控制項或表單的事件之前。 如果組合框的 LimitToList 屬性設為 Yes,表單的 錯誤 事件會緊接著 NotInList 事件發生:
按鍵箭
按鍵
髒
變更
按鍵
NotInList
錯誤
表單記錄的事件順序
當您將焦點移到其他紀錄、更新紀錄中的資料、刪除現有紀錄或建立新紀錄時,表單上的紀錄會發生事件。
將焦點移至記錄以及更新記錄中的資料
當您將焦點移至表單上現有的記錄、輸入或變更記錄中的資料,然後將焦點移至另一筆記錄時,會發生以下的表單事件順序︰
目前 (表格)
之前更新 (表格)
之後更新 (表格)
目前 (表格)
當您離開其資料已變更的記錄時,但是在您輸入下一筆記錄之前,焦點所在的控制項會發生 Exit 和 LostFocus 事件。 這些事件會在表單的 BeforeUpdate 和 AfterUpdate 事件之後發生,如下所示︰
之前 更新 ()
後更新 ()
退出 (控制)
迷失焦點 (控制
目前 (形)
在表單上的控制項之間移動焦點時,會發生每個控制項的事件。 例如,當您執行下列操作時,會發生以下的事件順序︰
- 開啟表單,並變更控制項中的資料︰
目前 ()
輸入 (控制)
GotFocus (控制)
之前 更新 (控制)
後 更新 ( 控制) - 將焦點移至另一個控制項︰
退出 (控制1)
失去焦點 (控制1)
進入 (控制2)
GetFocus (控制2) - 將焦點移至另一筆記錄︰
之前 更新 ()
的形態 之後 更新 ()
的形態 退出 (control2)
迷失焦點 (control2)
目前 ()
刪除記錄
當您刪除記錄時,會發生下列表單事件,而且 Microsoft Office Access 會顯示一個對話方塊,要求您確認刪除︰
刪除
DelConfirm 箭
頭 DelConfirm 之後
如果您取消 Delete 事件,就不會發生 BeforeDelConfirm 和 AfterDelConfirm 事件,而且不會顯示該對話方塊。
建立新記錄
當您將焦點移至表單上的新 (空白) 記錄,然後在控制項中輸入資料來建立新記錄時,就會發生以下的事件順序︰
目前 ()
輸入 (控制)
GotFocus (控制
前插入 (
後插入 ()
BeforeInsert (表單) 事件會在你開始輸入控制項時觸發。 AfterInsert (表單) 事件會在你離開記錄後觸發。
表單控制項以及新記錄的 BeforeUpdate 和 AfterUpdate 事件會發生在 BeforeInsert 事件之後以及 AfterInsert 事件之前。
表單和子表單的事件順序
當您開啟或關閉表單、在表單之間移動,或使用表單或子表單上的資料時,會發生表單事件。
開啟和關閉表單
當您開啟表單時,會發生以下的表單事件順序︰
開啟
載入
調整箭頭
大小 啟動
目前
如果表單上沒有作用中的控制項,表單的 GotFocus 事件會發生在 Activate 事件之後,但是在 Current 事件之前。
當您關閉表單時,會發生以下的表單事件順序︰
卸下
關閉
頭 關閉
若表單上沒有啟用控制項,則在卸載事件後但停用事件之前,表單會發生 LostFocus 事件。
在表單之間移動
當您在兩個開啟的表單之間切換時,第一個表單 Deactivate 事件,而第二個表單會發生 Activate 事件︰
關閉 (形態1)
,啟動 (形態2)
當您在 Access 中,從表單切換到另一個物件索引標籤時,也會發生表單的 Deactivate 事件。 不過,當您切換到對話方塊、其 PopUp 屬性設定為 Yes 的表單,或是另一個程式中的視窗時,則不會發生 Deactivate 事件。
注意
如果您將焦點移至已開啟的表單,即使您透過執行 OpenForm 動作將焦點移至該表單,還是不會發生 Open 事件。
使用表單上的資料
當您在表單中的記錄之間移動,並變更資料時,會發生表單和控制項事件。 例如,當您第一次開啟表單時,會發生以下的事件順序︰
打開 ()
載入 ()
調整大小 ()
形狀 啟動 ()
目前 (形狀)
進入 (控制
GotFocus (控制)
同樣地,當您關閉表單時,會發生以下的事件順序︰
退出 (控制)
迷失焦點 (控制)
卸載 裝載 ()
停用 ()
關閉 ()
如果您已變更控制項中的資料,則控制項和表單的 BeforeUpdate 和 AfterUpdate 事件會發生在控制項的 Exit 事件之前。
使用子表單
當您開啟包含子表單的表單時,也會在主表單之前載入子表單及其記錄。 因此,子表單及其控制項的事件 (例如 Open、Current、Enter 及 GotFocus) 會發生在表單的事件之前。 但是,不會發生子表單的 Activate 事件。 因此,開啟主表單僅會觸發主表單的 Activate 事件。
同樣地,當您關閉包含子表單的表單時,子表單及其記錄會在表單之後卸載。 而且不會發生子表單的 Deactivate 事件。 因此,關閉主表單僅會觸發主表單的 Deactivate 事件。 控制項、表單及子表單的事件發生順序如下:
- 子表單控制項的事件 (例如 Exit 和 LostFocus)
- 表單控制項的事件 (包括子表單控制項)
- 表單的事件 (例如 Deactivate 和 Close)
- 子表單的事件
注意
由於子表單的事件會在主表單關閉之後發生,因此將不會發生從子表單中的事件取消關閉主表單之類的特定事件。 您可能需要將這些類型的驗證測試移至主表單上的事件。
按鍵輸入和按一下滑鼠的事件順序
鍵盤事件發生在表單和控制項中,當你按下鍵盤或發送按鍵時,而該焦點在表單或控制項上。 如果您在滑鼠指標位於表單、區段或控制項上時按一下滑鼠按鈕,則會發生表單、表單區段和表單上控制項的滑鼠事件。 當您將滑鼠指標移動到表單、區段或控制項上時,也會發生滑鼠事件。
鍵盤事件
當你在表單上的控制項 (焦點時按下並放開按鍵,或使用 SendKeys 動作或語句發送按鍵) ,會發生以下事件序列:
按鍵下
按鍵鍵 按鍵 按鍵
當你在 ANSI 字元集中按下並放開按鍵或發送按鍵時, KeyDown、 KeyPress 和 KeyUp 事件都會發生。 如果您按下並按住 ANSI 鍵,KeyDown 和 KeyPress 事件會重複交替發生 (KeyDown、KeyPress、KeyDown、KeyPress,依此類推),直到您放開按鍵為止,然後才會發生 KeyUp 事件。
如果您按下並放開非 ANSI 鍵,則會發生 KeyDown 和 KeyUp 事件。 如果您按下並按住非 ANSI 鍵,KeyDown 事件會重複發生,直到您放開按鍵為止,然後才會發生 KeyUp 事件。
如果按下按鍵會觸發控制項的另一個事件,則該事件會發生在 KeyPress 事件之後,但是在 KeyUp 事件之前。 例如,如果某個按鍵變更文字方塊中觸發 Change 事件的文字,則會發生以下的事件順序︰
按鍵按
按
鍵
鍵 鍵
如果某個按鍵使焦點從一個控制項移到另一個控制項,則第一個控制項會發生 KeyDown 事件,而第二個控制項會發生 KeyPress 和 KeyUp 事件。 例如,如果您變更控制項中的資料,然後按 TAB 鍵,移至下一個控制項,會發生以下的事件順序︰
- 第一個控制項:
按鍵按
前進 更新
後 更新 箭
退出
迷失焦點 - 第二個控制項:
輸入
GotFocus
KeyPress
KeyUp
滑鼠事件
如果您在滑鼠指標位於表單上的控制項時按一下並放開滑鼠按鈕,會發生以下的控制項事件順序︰
滑鼠向下
滑鼠上方
點擊
如果焦點在控制項上,而且您按一下另一個控制項,將焦點移到這個第二個控制項,則會發生以下的事件順序︰
- 第一個控制項:
退出
LostFocus - 第二個控制項:
輸入
GotFocus
滑鼠下
滑鼠上箭
點擊
如果您移到另一筆記錄,然後按一下某個控制項,表單的 Current 事件也會發生在控制項的 Enter 事件之前。
按兩下某個控制項可使 Click 和 DblClick 事件同時發生。 例如,當您按兩下命令按鈕以外的控制項時,便會發生以下的控制項事件順序:
滑鼠下
滑鼠上箭
點擊
DblClick
滑鼠上行
當您按兩下命令按鈕時,會發生上述的事件順序,後面緊接著另一個 Click 事件。
當您將滑鼠指標移動到表單、區段或控制項上時,會發生表單、區段或控制項的 MouseMove 事件。 此事件與其他滑鼠事件無關。
報表及報表區段的事件順序
當您開啟報表來列印或預覽時,或關閉報表時,會發生報表和報表區段的事件。
報表的事件
當您開啟報表來列印或預覽,之後再關閉報表或移到 Access 中的另一個物件索引標籤時,會發生以下的報表事件順序︰
開啟
載入
啟動
關閉
停用
當您在兩個開啟的報表之間切換時,第一個報表會發生 Deactivate 事件,而第二個報表會發生 Activate 事件︰
關閉 (report1)
啟動 (report2)
當您在 Access 中,從報表切換到另一個物件索引標籤時,也會發生報表的 Deactivate 事件。 不過,當您切換到對話方塊、其 PopUp 屬性設定為 Yes 的表單,或是另一個程式中的視窗時,則不會發生 Deactivate 事件。
當您開啟以查詢為基礎的報表時,Access 會先觸發報表的 Open 事件,然後再執行基礎查詢。 因此,您可以使用回應 Open 事件的巨集或事件程序來設定報表的準則。 例如,巨集或事件程序可以開啟自訂對話方塊,讓您在其中輸入報表準則。
報表區段的事件
當您列印或預覽報表時,報表區段的 Format 和 Print 事件會發生在報表的 Open 和 Activate 事件之後,以及報表的 Close 或 Deactivate 事件之前︰
開啟 ()
舉報 載入 (舉報)
啟動 ( 舉
格式化 (舉報區)
列印 (舉報區)
關閉 (舉
檢舉 ()
安全性 您可以使用報表檢視來啟用 使用者對報表的篩選功能。 但與列印預覽不同的是,任何區塊的 格式 與 列印 事件都不會發生在報告檢視中。 這同樣適用於 VBA 功能結果及使用者定義的程序,這些程序會在控制 (中顯示,例如標籤標題、顯示狀態、條件格式、控制項大小調整等,這些) 事件中會顯示。 因此,請勿在此事件中使用程式碼格式化、隱藏或列印機密資料,以免資料暴露。 我們建議預先篩選資料,或透過將 AllowReportView 屬性設為 No(編號)來關閉報表預覽。
此外,下列事件可能會在格式設定期間或之後,但在 Print 事件之前發生︰
- 當 Access 在報表格式設定期間傳回上一個區段時,會發生 Retreat 事件。
- 如果報表沒有顯示任何記錄,就會發生 NoData 事件。
- Page 事件會在格式設定之後,但在列印之前發生。 您可以使用此事件自訂列印報表的外觀。