|
關(guān)于WithEvents關(guān)鍵字,VBA的幫助非常簡單,雖然翻閱了不少資料,但是對WithEvents的理解還是似懂非懂,理解的很不透徹。在這里我僅僅把這些天來的學(xué)習(xí)心得與大家分享,拋磚引玉,如果您對WithEvents有深層次的理解,也請您一同分享,向您學(xué)習(xí)。 廢話少說,言歸正傳。 1.WithEvents關(guān)鍵字用于哪些語句? 通過VBA幫助,我們知道WithEvents只用于聲明變量的語句: WithEvents 關(guān)鍵字用于下列上下文: Dim 語句 Private 語句 Public 語句 這三個語句都是用來聲明變量的,我們知道了WithEvents關(guān)鍵字肯定是與定義變量有關(guān)。 2.WithEvents關(guān)鍵字是干什么用的? WithEvents,從這個單詞本身上看,應(yīng)該是“和事件有關(guān)”的意思(嘿嘿,我猜的?。?。一提到事件,我們就會聯(lián)想到對象;既然WithEvents關(guān)鍵字用于Dim,Private,Public語句,那就肯定與變量有關(guān)系;以上兩點結(jié)合到一起,肯定WithEvents關(guān)鍵字是和對象變量有關(guān)系啦。 我的理解是這樣的: 當(dāng)你需要使用某個對象的事件時,定義對象變量的時候,就要用到WithEvents關(guān)鍵字。 舉個例子: Dim app as Application(無法使用application對象事件) Dim WithEvents app as Application(可以使用application對象事件) 3.使用 WithEvents 關(guān)鍵字的限制條件: (1)WithEvents 變量不能是派生對象變量。也就是說,不能把它聲明為 As Object(當(dāng)聲明該變量時必須指定類名)。 舉個例子 錯誤的寫法:Dim WithEvents app as Object 正確的寫法:Dim WithEvents app as Application (2)不能把 WithEvents 變量聲明為 As New。必須明確地創(chuàng)建事件源對象,并將它賦給 WithEvents 變量。 舉個例子 假設(shè)已經(jīng)定義了一個叫做MyClass的類模塊 錯誤的寫法: Dim WithEvents cls as New MyClass 正確的寫法:Dim WithEvents cls as MyClass Set cls=New MyClass (3)不能在標準模塊中聲明 WithEvents 變量。只能在類模塊、窗體模塊以及其它定義類的模塊中聲明。 VBA工程中包含的模塊,除了標準模塊,剩下的都可以看做是類模塊(包括窗體模塊,ThisWorkbook,Sheet,類模塊等等)。所以說我們只要記住,在標準模塊中,不能使用WithEvents關(guān)鍵字就行。 (4)雖然WithEvents是Dim,Public,Private語句的關(guān)鍵字,但是,一定要記住,不要在過程里面中用WithEvents關(guān)鍵字進行對象變量的聲明,因為微軟絕對不會同意,呵呵。 4.WithEvents應(yīng)用范例1一顯式使用對象事件 我們知道,Excel可以監(jiān)視不少對象的事件,如Workbook,Worksheet,UserFrom等等,通常輸入事件過程的代碼時,首先從代碼編輯器的左邊下拉列表中選擇對象,然后從代碼編輯器右邊下拉列表中選擇事件,如下圖所示。 但是有些對象,如Application對象,是無法這樣輸入事件過程的,只有使用了WithEvents定義了對象變量,然后將Application對象引用賦值給對象變量之后,才可以像上圖一樣使用。下面我們舉個例子來說明一下。 例子說明:利用Application的WindowResize事件,當(dāng)我們調(diào)整工作薄窗口大小的時候,彈出對話框。 代碼編寫位置:我們在Sheet1文檔模塊中編寫(你也可以在Sheet2,Sheet3,ThisWorkbook等模塊中編寫,效果是一樣的) 編寫過程: (1)聲明變量,定義對象變量app: Private WithEvents app As Application (2)聲明過程,將Application對象的引用賦值給app: Sub test() Set app = ApplicationEnd Sub 這個時候,我們就可以通過代碼編輯器的左右下拉列表框選擇Application對象的事件過程啦(不過是以app對象變量的形式出現(xiàn)的),如下圖所示: (3)編寫事件過程代碼: Private Sub app_WindowResize(ByVal Wb As Workbook, ByVal Wn As Window) MsgBox "你改變了工作薄窗口的大小" End Sub 運行方法:運行test過程,然后改變工作簿的大小,就會彈出提示框。 代碼:
5. WithEvents應(yīng)用范例2一為多個模塊編寫通用事件 例子說明:建立一個窗體,里面放了四個CommandButton控件,點擊控件,彈出CommandButton的Catpion名,本來應(yīng)該為每個CommandButton事件編寫一個事件過程,現(xiàn)在只要編寫一個事件過程即可。 代碼分為兩部分,一個是窗體模塊UserForm1的代碼,一個是類模塊MyClass的代碼: (1)類模塊代碼與解釋(類模塊名:MyClass)
(2)窗體模塊代碼與解釋(窗體名UserForm1)
6. WithEvents應(yīng)用范例2—在一個對象中為另一個對象編寫事件 這一個實例個人感覺有些牽強,因為我也不知道什么地方會用到他。所以我也不解釋太多,只貼出代碼與大家共享。 例子說明:在Sheet2模塊中編寫Sheet1的Activate事件,運行Sheet2里面的過程后,再激活Sheet1表,彈出Msgbox消息框。 代碼與簡單解釋如下(在Sheet2表中): Option Explicit 我們可以看出來,這些代碼都是寫在了Sheet2模塊中,但確實實現(xiàn)了為Sheet1對象編寫事件過程的功能。 |
|
|
來自: yuzhoushenling > 《VBA》