自定義事件帶引數的觸發過程
2022-06-11由 VBA語言專家 發表于 農業
什麼是帶引數的例行程式
(接上講)
這一講我們先繼續上一講類模組程式碼的講解:
6 Private Sub mySht_Change(ByVal Target As Range)
RaiseEvent mySelectRanA(myHS, myLS)
End Sub
這段程式碼是一個Change過程,這個也就是說當響應類物件的mySht發生改變時將要執行這個過程,這個過程的執行中會有一個引數傳遞進來,這個引數就是Target ,是一個按照值來傳遞的單元格。
在執行這個過程中會觸發mySelectRanA事件。關鍵字是RaiseEvent,就是觸發事件。觸發這個事件的時候,同時會傳遞兩個引數myHS, myLS。關於這個事件的詳細講解會在之後進行,我現在先把每個過程給大家講一下。
7 Private Sub mySht_SelectionChange(ByVal Target As Range)
myHS = Target。Row
myLS = Target。Column
If Mid(Target。Address, 2, 1) = “A” Then
RaiseEvent mySelectRan
End If
End Sub
這個過程和上一個過程相類似,是一個工作表發生改變時候將要執行的過程,這個過程中會有兩個動作:
第一 給宿主引數賦值myHS = Target。Row myLS = Target。Column。myHS和myLS是類屬性的兩個宿主,在這裡當工作表發生改變時,給這兩個宿主賦值,賦值的意義就是取得當前點選單元格的行數和列數。
第二 觸發mySelectRan事件。觸發這個mySelectRan事件是有條件的,就是Mid(Target。Address, 2, 1) = “A”,這個條件如何理解呢?就是點選的是A列的單元格,由於Target。Address返回的單元格地址是一個絕對的引用,所以我們用的是Mid(Target。Address, 2, 1),當然,這裡的邏輯不是十分的嚴謹,當單擊“AB”單元格時也會同樣認為是A列的單元格,大家可以想一想有沒有更好的方法,精確地返回A列,對的,只要再加上一個判斷條件,判斷一下第三個字元應該是“$”即可。觸發這個事件是沒有引數傳遞的。
8 Public Property Get HS() As Integer ‘屬性: 讀
HS = myHS
End Property
Public Property Get LS() As Integer ’屬性: 讀
LS = myLS
End Property
上面的過程是一個屬性值的讀取過程,也就是將宿主的值傳遞給屬性值。這個過程是比較容易理解的,不再多說了。
到這裡,整個類模組的內容就講解完成了,下面我們要讓類模組發揮作用了。類的作用是什麼呢?我們在之前的講解中講過,類是一個魂,是沒有肉身的,只有具有了肉身即例項化之後,才能佔用記憶體。那麼類的魂是如何賦給肉身呢?
看我們的工作表程式碼,首先看工作表“51”的程式碼:
Private WithEvents MyS As mysheet
Private Sub MyS_mySelectRan()
MsgBox “你單擊了A列單元格”
End Sub
Private Sub Worksheet_Activate()
Set MyS = New mysheet
Set MyS。mySht = Sheets(“51”)
End Sub
Private Sub Worksheet_Deactivate()
Set MyS = Nothing
End Sub
程式碼的截圖:
程式碼講解,大家要留意我上面程式碼過程中圈的重點:
1 程式碼是寫在了工作表的程式碼中,是這個工作表的私有程式碼,所以每個過程都有標識Private Sub。
2 程式碼的頭部即宣告部分我給出了一個非常重要的宣告:
Private WithEvents MyS As mysheet
這個宣告是什麼意義呢?我來給大家詳細地分析。這裡的關鍵字是WithEvents,這個關鍵字是說將要宣告一個物件用來響應我們的mysheet類的事件,什麼物件呢?就是MyS ,將這個物件宣告為什麼呢?要宣告為mysheet類。大家要留意這種寫法。
(待續,下一講我們繼續講解)
今日內容迴向
:
1 觸發事件的關鍵字是什麼?
2 宣告物件相應類事件的關鍵字是什麼?
備註:本講程式碼參考程式檔案:VBA-CLASS(下51-56)。xlsm
在取代OFFICE新的辦公軟體沒有到來之前,誰能在資料處理方面做到極致,誰就是王者。其中登峰至極的技能非VBA莫屬!眾鳥高飛盡,孤雲獨去閒。相看兩不厭,只有敬亭山。
學習VBA是個過程,這個過程是自己忍受孤獨的過程。
“水善利萬物而不爭”,你看她綿綿密密,微處則無聲,巨則洶湧。學習亦如此,把握現在,為達千里,需要默默耕耘,知道什麼是自己所需要的,不要蜷縮在一小塊自認為天堂的世界裡,待到暮年時去自欺欺人。要在當下,用一顆充滿生機的心靈,努力提高自己,這才是進取。越是有意義的事情,困難會越多。願力決定始終,智慧決定成敗。不管遇到什麼,都是風景。看淡紛爭,看輕得失。一杯茶,滿也好,少也好,不要去計較;濃也好,淡也好,其中都有值得品的味道。去感悟真實的時間,靜下心,多學習,積累福報。而不是天天混日子,也不是天天熬日子。一切眾生的心都在變化,像時間一樣,永遠不會停留,把握現在就是福報。
VBA是利用Office實現自己小型辦公自動化的有效手段,我記得20年前自己初學VBA時,那時的資料甚少,只能看原始碼自己琢磨,真的很難。20年過去了,為了不讓學習VBA的朋友重複我之前的經歷,我根據自己多年VBA實際利用經驗,推出了五部VBA專門教程,迴向給需要學習的朋友:
第一
套
:
VBA
程式碼解決方案
是VBA中各個知識點的講解,覆蓋絕大多數的VBA知識點,初學必備;
第二
套
:
VBA
資料庫解決方案
資料庫是資料處理的專業利器,教程中詳細介紹了利用ADO連線ACCDB和EXCEL的方法和例項操作。
第三
套
:
VBA
陣列與字典解決方案
陣列和字典是VBA的精華,字典是VBA程式碼水平提高的有效手段,值得深入的學習。
第四
套
:
VBA
程式碼解決方案之影片
是專門面向初學者的影片講解,可以快速入門,更快的掌握這門技能。
第五
套
:
VBA
中類的解讀和利用
這
是一部高階教程,講解類的虛無與肉身的度化,可以對促進自己理論的提高。
學習的過程也是修心的過程,修一個平靜的心。在程式碼的世界中,心平靜了,心情好了,身體自然而然就好。心靜則正,內心裡沒有那麼多邪知邪見,也就沒有那麼多妄想。在平靜中積累自己的財富。我的上述教程是我多的經驗的傳遞,大家可以根據1,3,2,5或者是4,3,2,5的順序逐漸深入的逐漸學習。
最後將一闕詞送給致力於VBA學習的朋友:
浮雲掠過,暗語無聲,
唯有清風,驚了夢中啼鶯。
望星,疏移北斗,
奈將往事雁同行。
阡陌人,昏燈明暗,忍顧長亭。
多少VBA人,
暗夜中,悄聲尋夢,盼卻天明。
怎無憑!
分享成果,隨喜正能量