Workbook_Open和Auto_Open都能實現在打開工作簿時自動運行自定義代碼的功能。Workbook_Open似乎要取代Auto_Open,而Auto_Open的存在似乎只是為了兼容以前的程序。然而,對于Excel開發人員來說,Auto_Open仍然很有用。
對于初學者來說,細致地了解Workbook_Open和Auto_Open,解開對這兩個過程的一些疑惑,有助于更好地學習或閱讀相關代碼,也能夠更好地在自已編寫的代碼中合理使用它們。
Workbook_Open和Auto_Open放置的位置不同
Workbook_Open必須位于ThisWorkbook模塊中,而Auto_Open必須放置在標準模塊中,如下圖所示。
在標準模塊中,必須手動輸入Sub Auto_Open()。
Application.EnableEvents事件的影響
Workbook_Open受Application.EnableEvents事件的影響,而Auto_Open不會。也就是說,當Application.EnableEvents事件設置為False后,Excel不會觸發Workbook_Open。因此,如果你擔心因Application.EnableEvents事件設置而影響打開工作簿時自動運行自定義的代碼,那么可以使用Auto_Open,這樣不管Application.EnableEvents事件的狀態如何,都能確保用戶打開工作簿時執行自定義代碼。
注:在打開工作簿的同時按住SHIFT鍵,會禁用Workbook_Open()和Auto_Open()。
使用代碼自動打開工作簿時的影響
如果使用代碼自動打開含有Workbook_Open或Auto_Open的工作簿,那么將不會觸發Auto_Open代碼但會觸發Workbook_Open代碼。因此,Auto_Open適合于由用戶自已打開的工作簿,而不適用于由編寫的代碼自動打開的工作簿。也就是說,如果您僅想讓用戶自已打開時執行自定義的代碼,那么使用Auto_Open。
如果想要在自動打開工作簿時禁用Workbook_Open,那么可以在打開該工作簿前設置Application.EnableEvents事件為False。
如果想要在自動打開工作簿時運行Auto_Open,那么可以使用Workbook.RunAutoMacros方法。
Workbook_Open和Auto_Open同時存在時的調用順序
如果某工作簿中同時存在Workbook_Open和Auto_Open,那么將首先調用Workbook_Open。在Workbook_Open和Auto_Open調用完后,再執行customUI_OnLoad()回調程序。即,工作簿打開時的調用順序:
Workbook_Open
Auto_Open
customUI_OnLoad()