前面幾期,我們已經(jīng)和大家一起學(xué)過了Excel中 VBA對象的屬性和方法以及它們的簡單應(yīng)用, 相信大家通過學(xué)習(xí)已經(jīng)有了不小的收獲。Excel中的各類VBA方案都是建立在工作薄和工作表事件的基礎(chǔ)上的,熟練地運(yùn)用Excel事件編程可以靈活地控制工作薄和工作表。 如何為工作薄和工作表對象指定事件 在VBE編輯器窗口左側(cè)的工程資源管理器中,雙擊其中的Thisworkbook(當(dāng)前工作?。┗?/span>Sheet1、Sheet2(工作表)等對象,打開相應(yīng)的代碼窗口(如圖1),在代碼窗口中單擊“對象框”右側(cè)的下拉按鈕,從對象列表中可找到當(dāng)前的工作?。?/span>Workbook)或工作表(Worksheet)對象。當(dāng)用戶選擇相應(yīng)對象時,代碼窗口中會自動出現(xiàn)工作薄或工作表對象的默認(rèn)事件程序,這些代碼均以“Private sub”開頭,以“End Sub”結(jié)尾。其中工作薄默認(rèn)的事件為“Open”事件,工作表默認(rèn)的事件為“SelectionChange”事件,如果用戶需要對當(dāng)前對象的其它事件進(jìn)行編程,可單擊“過程/事件框”列表右側(cè)的下拉按鈕,從事件列表框中找到需要編寫的事件,如選擇工作薄的“BeforeClose”事件,此時系統(tǒng)會自動列出“Private Sub Workbook_BeforeClose(Cancel As Boolean)”和“End Sub”,然后就可以在這兩行語句間編寫有關(guān)的程序代碼了,最后將不需要的事件程序刪除即可。 工作薄事件編程應(yīng)用 當(dāng)我們每次打開、保存工作薄、更改工作薄中的任何工作表,加載宏等等操作的時候,在不經(jīng)意間已經(jīng)觸發(fā)了工作薄的各種事件,只不過是因為用戶沒有為這些事件編寫相應(yīng)的程序罷了。工作薄對象的事件有二十個多,在這些事件中最常用的有Open、BeforeClose、BeforSave、Activate、Deactivate等事件。 1、Open事件是工作薄對象的默認(rèn)事件,當(dāng)用戶打開工作薄文件時,這個事件就被激活,這樣我們就可以把創(chuàng)建過程(如檢查用戶的合法性、是否創(chuàng)建自定義菜單或添加工具欄按鈕等等)的代碼放到這個事件中,讓系統(tǒng)自動執(zhí)行從而達(dá)到我們需求。下面的例子是在打開工作薄時系統(tǒng)檢查用戶的合法性,如果密碼正確,文檔就可以被打開,否則強(qiáng)制退出Excel程序。 Private Sub Workbook_Open() Dim pwd pwd = InputBox("請輸入打開文件的密碼:", "密碼框") If pwd <> "12345" Then MsgBox "非法用戶,你無權(quán)使用本程序!", vbOKOnly Application.Quit End If
End
Sub 2、BeforeClose事件在工作薄被關(guān)閉時自動觸發(fā),利用該事件可以刪除用戶的自定義菜單和工具欄等設(shè)置。下面的代碼可實現(xiàn)工作薄在關(guān)閉時自動刪除“分表工具”工具欄: Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.CommandBars("分表工具").Delete End Sub 如果在該事件中寫入代碼“Cancel = True”將會阻止文檔的關(guān)閉。 3、BeforeSave事件發(fā)生在工作薄執(zhí)行保存操作時,如果我們希望工作薄在保存時提示用戶是否進(jìn)行保存操作可使用下面的代碼: Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim rel rel = MsgBox("你確認(rèn)要進(jìn)行保存操作嗎?", vbYesNo) If rel = vbNo Then Cancel = True End Sub 代碼中的“Cancel = True”將阻止工作薄執(zhí)行保存操作。 4、Activate事件發(fā)生在工作薄對象被激活時,此時可根據(jù)需要自動切換到該工作薄中的某張工作表或顯示自定義菜單以及打開指定窗體等操作。下面的代碼可在工作薄被激活時自動切換到Sheet2,并在A1中顯示“Welcome Back”: Private Sub Workbook_Activate() Sheet2.Activate Cells(1, 1) = "Welcome Back" End Sub 5、Deactivate事件將在工作薄由活動狀態(tài)轉(zhuǎn)變?yōu)榉腔顒訝顟B(tài)時激活。下面的代碼可在工作薄成為非活動狀態(tài)時自動保存工作薄中的數(shù)據(jù): Private Sub Workbook_Deactivate() ThisWorkbook.Save End Sub 這樣在多個工作薄之間操作時就不要擔(dān)心數(shù)據(jù)的丟失了,系統(tǒng)會自動保存用戶數(shù)據(jù)的修改。 工作表事件編程應(yīng)用 工作表事件的編程應(yīng)用也是我們學(xué)習(xí)VBA編程的重點,當(dāng)工作表被激活、選中某個單元格或單元格區(qū)域、更改工作表中的數(shù)據(jù)、重新計算工作表等操作時都會觸發(fā)工作表事件。在VBE編輯器提供了9個工作表事件,其中用得較多的是:Activate、Deactivate 、Calculate、Change、SelectionChange等事件。 1、Activate事件:當(dāng)工作表對象被激活時將引發(fā)該事件。如激活某工作表時顯示當(dāng)前工作工作表中已有的記錄數(shù),并詢問用戶是否打印這些數(shù)據(jù)。 Private Sub Worksheet_Activate() Dim rel, icount
icount = [a65536].End(xlUp).Row - 1 rel = MsgBox("已成功錄入" + Str(icount) + "個用戶記錄,立即打印嗎?", vbYesNo) If rel = vbYes Then ActiveSheet.PrintOut Else Cancel = True End Sub 2、Deactivate事件:當(dāng)工作表對象由活動狀態(tài)轉(zhuǎn)變?yōu)榉腔顒訝顟B(tài)時觸發(fā)該事件(即工作表失去焦點)。下面的例子就是當(dāng)某工作表(如分表數(shù)據(jù))轉(zhuǎn)變?yōu)榉腔顒訝顟B(tài)時自動隱藏同時強(qiáng)制激活“總表”數(shù)據(jù)所在的工作表。 Private Sub Worksheet_Deactivate() Worksheets("分表").Visible = False Worksheets("總表").Activate End Sub 3、Calculate事件:當(dāng)工作表重新計算時將觸發(fā)該事件。如當(dāng)工作表進(jìn)行重新計算操作時自動調(diào)整表格中的列寬和行高到最合適的大?。?/span> Private Sub Worksheet_Calculate() ActiveSheet.Columns.AutoFit ActiveSheet.Rows.AutoFit End Sub 4、Change事件:當(dāng)用戶更改單元格中的數(shù)據(jù)或外部鏈接引起單元格發(fā)生數(shù)值變化將會引發(fā)該事件。下面的例子是當(dāng)用戶在第2列(即B列)中輸入數(shù)據(jù)時,如果輸入的是數(shù)字“ 1”將自動轉(zhuǎn)換為文字“男”,輸入其它內(nèi)容全部變?yōu)槲淖帧芭薄?/span> Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 And Target.Value = 1 Then Target.Value = "男" Else If Target.Value <> 1 And Target.Value <> "男" Then Target.Value = "女" End If End Sub 5、SelectionChange事件:當(dāng)工作表中的選定區(qū)域發(fā)生變化時將觸發(fā)該事件,它是工作表的默認(rèn)事件。下面的例子可以實現(xiàn)單擊某行時給當(dāng)前行設(shè)置一個填充色,再次單擊時取消該行填充色的顯示,可用于表格數(shù)據(jù)的瀏覽。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.EntireRow.Interior.ColorIndex <> 18 Then Target.EntireRow.Interior.ColorIndex = 18 Else Target.EntireRow.Interior.ColorIndex = 0 End If End Sub 與Change事件不同的是,SelectionChange事件是在選中某個單元格或單元格區(qū)域時觸發(fā),而Change事件是單元格或單元格區(qū)域的內(nèi)容發(fā)生改變以后才會觸發(fā)。 事實上,工作薄和工作表的事件及其應(yīng)用遠(yuǎn)不止這些,我們給大家介紹的這些事件以及范例都是很常見、很實用的,通過這些范例的學(xué)習(xí)大家可以舉一反三,從而能設(shè)計出更加便捷、實用的應(yīng)用程序來。 |
|