电竞比分网-中国电竞赛事及体育赛事平台

分享

WithEvents

 yuzhoushenling 2014-03-21
關(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過程,然后改變工作簿的大小,就會彈出提示框。

代碼:
  1. Option Explicit

  2. Private WithEvents app As Application ‘ 定義對象變量

  3. Sub test()
  4.   Set app = Application ‘將Application對象的引用賦值給對象變量app:
  5. End Sub

  6. ‘編寫事件過程
  7. Private Sub app_WindowResize(ByVal Wb As Workbook, ByVal Wn As Window)
  8.   MsgBox "你改變了工作薄窗口的大小"
  9. End Sub
復(fù)制代碼


5. WithEvents應(yīng)用范例2一為多個模塊編寫通用事件

例子說明:建立一個窗體,里面放了四個CommandButton控件,點擊控件,彈出CommandButton的Catpion名,本來應(yīng)該為每個CommandButton事件編寫一個事件過程,現(xiàn)在只要編寫一個事件過程即可。


代碼分為兩部分,一個是窗體模塊UserForm1的代碼,一個是類模塊MyClass的代碼:

(1)類模塊代碼與解釋(類模塊名:MyClass)
  1. Option Explicit
  2. ‘ 定義CommandButton的對象變量cmd,使用WithEvents關(guān)鍵字,用來引用CommandButton對象的事件,cmd變量作為MyClass的屬性
  3. Public WithEvents cmd As CommandButton

  4. ‘ 為cmd對象編寫Click事件過程(這里就是編寫的通用事件)
  5. Private Sub cmd_Click()
  6.   MsgBox cmd.Caption  ‘彈出對話框,顯示cmd對象的Caption名
  7. End Sub
復(fù)制代碼


(2)窗體模塊代碼與解釋(窗體名UserForm1)
  1. Option Explicit
  2. ‘ 定義MyClass類的數(shù)組對象變量
  3. Dim cls(1 To 4) As New MyClass

  4. ‘ 在窗體初始化中編寫代碼
  5. Private Sub UserForm_Initialize()
  6.   Dim i As Integer
  7.   Dim ct As MSForms.Control  ‘ 定義MSForms.Control類的對象變量ct
  8.   i = 1

  9. ‘ 利用Controls集合,遍歷窗體中每個控件
  10.   For Each ct In Me.Controls ‘在這里,me代表窗體對象UserForm1   
復(fù)制代碼


6. WithEvents應(yīng)用范例2—在一個對象中為另一個對象編寫事件


這一個實例個人感覺有些牽強,因為我也不知道什么地方會用到他。所以我也不解釋太多,只貼出代碼與大家共享。


例子說明:在Sheet2模塊中編寫Sheet1的Activate事件,運行Sheet2里面的過程后,再激活Sheet1表,彈出Msgbox消息框。


代碼與簡單解釋如下(在Sheet2表中):


Option Explicit
‘ 定義WorkSheet類的對象變量sh1,利用WithEvents關(guān)鍵字,可以引用WorkSheet對象的事件
Dim WithEvents sh1 As Worksheet

‘ 編寫一個過程,將對Sheet1對象的引用賦值給對象變量Sh1,因為定義WithEvents的時候使用了WithEvents關(guān)鍵字,所以這個過程編寫完后,在代碼編輯器的對象和事件下拉列表框中可以找到Sheet1的事件
Sub test()
  Set sh1 = Sheet1
End Sub

‘為Sheet1對象的Activate事件過程編寫代碼
Private Sub sh1_Activate()
  MsgBox "我是通過Sheet2表編寫的事件激活的"
End Sub

我們可以看出來,這些代碼都是寫在了Sheet2模塊中,但確實實現(xiàn)了為Sheet1對象編寫事件過程的功能。

















































    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多