Excel VBA 基礎(05.1) - 事件

Excel VBA 基礎(05.1) - 事件

來自專欄財務自動化利器-從VBA到d3js

基礎第四部分我們介紹了常用的擴展庫,已經足夠處理日常的絕大多數需求。剩下還有一些 VBA中的黑科技,比如與其他MS Office交互,從VBA調用Javascript以及 調用工作表文件的SQL介面等等,根據大家反饋相應地在 實戰部分進行介紹。

進入第五部分之前,請嘗試如下練習,

1、寫出 匹配身份證號碼的正則表達式Pattern。

2、將指定路徑以及其子路徑下的文件名逐行遞歸填充於指定工作表各行的第一個單元格中。

第五部分,我們來談一談 VBA的事件 以及異常處理 最後來介紹一下 圖形界面部分以及用戶表單。

首先來說一說,事件(Event),

還記得對象瀏覽器裡面 閃電形狀的小圖標么。

與用戶交互的過程中,程序會根據用戶的操作進行相應的反饋。以網頁編程以及JS為例,當用戶單擊某個按鈕時會彈出相應提示窗口,此時 單擊 這個用戶操作 觸發(evoke) 了 單擊事件(onclick-Event)。回到VBA, 上圖中Worksheet中有Activate事件,同理,可以理解為 用戶激活該工作表時 會觸發的激活工作表事件。

事件觸發後,系統會調用 對應該事件的 回調函數(callback) 或 鉤子函數(hook),例如單擊所對應的彈窗函數為回調函數。

普通函數的調用完全由用戶自定義,所謂回調函數可以理解為,以該事件發生為條件由系統自動調用的函數。因為與用戶交互的過程中某個事件的發生與不發生,無法在程序編寫時預先判斷。但是 事先為 工作表激活事件 綁定 回調函數,系統會 監聽 用戶行為,一旦出現工作表激活事件,則會自動調用 預先定義的回調函數。

示例 5.1.1 , 萬惡的 Worksheet.activate

編寫VBA程序實現下列需求

1、有兩張工作表 分別為 targ以及src,當前工作表為targ

2、實現如下數據保護,如果嘗試激活src,則自動退出當前工作簿

3、在存在上述數據保護機制的前提下,將src工作表中第一行 第一列的數據複製到targ中

分析業務邏輯, 在src工作表 激活事件下定義 關閉工作簿的函數即可。

手上沒有中文Excel請見諒。

VBA工程窗口,可以看到當前工作簿以及工作表的對象,雙擊 src工作表,右邊的窗口的下拉列表會顯示所有系統定義的工作表事件

選中相應事件 會自動生成指定事件的回調函數簽名

我們需要 編寫 激活 事件的回調函數。

Private Sub Worksheet_Activate() ThisWorkbook.Close False End Sub

此時我們在普通模塊中編寫複製數據的程序,

Option ExplicitSub main() Worksheets("targ").Cells(1, 1).Value = Worksheets("src").Cells(1, 1).ValueEnd SubSub main_active() Worksheets("src").Activate Dim tmp tmp = Cells(1, 1).Value Worksheets("targ").Activate Cells(1, 1).Value = tmpEnd Sub

兩種寫法,第二種寫法為諸多黑教程所推崇,此時程序被事件所阻斷,激活時即退出工作簿。

通過上述例子想說明如下觀點,

1、編寫程序時,一定要避免多餘操作,因為與此相關的副作用有時候不可預計。

2、陌生的工作簿打開時一定要注意,如果工作簿開啟的回調函數設定為清空電腦儲存或是讀取並發送重要文件(殺毒軟體也無法識別為病毒),後果不堪設想。

有些事件的回調函數帶有參數,例如

Private Sub Worksheet_Change(ByVal Target As Range)

改變工作表中某個單元格的數值, 此時 Target為 發生變動單元格對象

具體內容請參考對象瀏覽器以及API文檔。

示例 5.1.2 年度預算工具

制定企業年度預算的時候,我們通常需要將年度數據按一定方式分攤到每個月或是從上月數據基礎上計算得出下月數據,通常的推導模式有如下三種,

與上月相同,在上月的基礎上按一定比例或某一絕對數額增減,依收入變動而變動。

為了達到上述效果,請實現如下需求,

1、如果在匯總欄填入數據時, 則將數據自動平分到各個月份,如 在N2 填寫 120,則B2 到M2各列中自動生成數值 10;如果填入 形如 總和數字#百分比 時, 則表示 將總和分攤到各月,並且各月的變動比例為#號之後的百分比 例如 填入120#10% 時, 自動生成如下結果

2、如果在月度欄填入相應數值,該月以及之後的月份固定為當前數值,如在H4填入10, 則從H4到M4數值均為10, 如果填入 形如 數字#百分比 時, 則表示 當前月份值為該數字,並且各月的變動比例為#號之後的百分比。

實踐中功能比上例更加複雜,但是基本實現原理一樣。有興趣可以自己實現 等差累加 以及 與收入列等比例變動。

在程序的世界裡面,能夠限制你的只有你的想像力。

動態演示如上圖。

http://qiou.eu/xl/Case_5.1.xlsm?

qiou.eu

附上本期示例文件。

有任何問題請在下方留言。

本專欄所有文章著作權歸屬本人。未經本人書面許可,除知乎日報外,任何人不得轉載。


推薦閱讀:

Excel 2007 插入折線圖時,由於數據太多,導致線堆疊過於緊密。請問是否有辦法讓每條線錯開,並展示在一個圖表裡?
請問這樣的圖用excel可以做么?
Excel數據透視表有什麼用途?
excel中vba是否能夠將數據填充到網頁中?
為什麼excel不能正確處理utf8 csv?

TAG:VBA | MicrosoftExcel | 財務分析 |