農林漁牧網

您現在的位置是:首頁 > 農業

自定義事件帶引數的觸發過程

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_Selection​Change(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人,

暗夜中,悄聲尋夢,盼卻天明。

怎無憑!

分享成果,隨喜正能量