《VBA中類的解讀及應用》教程【10165646】是我推出的第五套教程,目前已經是第一版修訂了。這套教程定位于最高級,是學完初級,中級后的教程。
類,是非常抽象的,更具研究的價值。隨著我們學習、應用VBA的深入,有必要理解這些抽象的理論知識。對象,類,過程,方法,屬性,事件,接口,接口如何實現等等。掌握了這些理論,不僅對于VBA這種寄生語言的實質有所深入的理解,也對自然界的很多事物將同樣有所感悟。目前,這套教程程序文件已經通過32位,64位兩種office系統測試。
這套教程共兩冊,八十四講,今后一段時間會給大家陸續推出修訂后的教程內容。今日的內容是:VBA中類的解讀及應用第二十五講:把源數據賦給類,然后利用類完成查找的方案-4
【分享成果,隨喜正能量】223 善良的人,總是有福。利己則生,利他則久。心存善良的幫助他人,不是一時興起,而是要堅持不懈的從實際出發,看到他人所需,切實的幫助到他人。
第二十六講 把源數據賦給類,然后利用類完成查找的方案-4
大家好,今日我們繼續講解利用類來進行查找的方案。在之前的第23到25講中我們講了建立一個類,這個類的功能是根據輸入的內容定位要返回的內容,當我們把這個類的魂賦給某個對象后就可以實現查找了。
8 mydyg類的改進分析
在上面的三講中利用的類是mydyg,在利用輸入的單元格進行判斷時,對于每次輸入的值都要進行相同重復的數據讀取:
那么有沒有辦法只進行一次數據的讀取,然后在讀取的數據中進行提取必要的值呢?如果這種方案能實現的話可以大大的提高程序的運行效率。我今日就來講解這種一次讀取數據的方案。當然,也是利用的類模塊。這種方案需要用到動態數組了。
9 類MYNEWDYG的構建
我們先來看類模塊的過程:我們首先建立一個類模塊MYNEWDYG,下面是相應的代碼:
Private rngsA
Private rngsB
Public TJ
Private A()
Property Get QSA()
For i = 1 To UBound(A())
RR = Left(A(i), InStr(A(i), "#") - 1)
If Trim(RR) = Trim(TJ) Then
rngsA = Mid(A(i), InStr(A(i), "#") + 1, InStr(A(i), "@") - InStr(A(i), "#") - 1)
Exit For
End If
Next
QSA = rngsA
End Property
Property Get QSB()
For i = 1 To UBound(A())
RR = Left(A(i), InStr(A(i), "#") - 1)
If Trim(RR) = Trim(TJ) Then
rngsB = Mid(A(i), InStr(A(i), "@") + 1, Len(A(i)) - InStr(A(i), "@"))
Exit For
End If
Next
QSB = rngsB
End Property
Property Set DYGB(rng As Range)
ReDim Preserve A(rng.Row)
A(rng.Row) = Cells(rng.Row, 1) & "#" & Cells(rng.Row, 2) & "@" & Cells(rng.Row, 3)
kk = 1
End Property
代碼的截圖:
10 類MYNEWDYG的代碼分析
下面我們分析一下類模塊的過程:這個過程中建立了類的屬性有TJ,QSA,QSB,DYGB四個屬性,這四個屬性的作用各有不同。同時在類模塊中還有兩個數據的傳遞變量rngsA和rngsB,這兩個變量是屬性QSA和QSB的“宿主”(還是用這個詞吧,比較好理解)。下面我們將就每個過程進行分析,
1) 對于傳入數據的處理
Property Set DYGB(rng As Range)
ReDim Preserve A(rng.Row)
A(rng.Row) = Cells(rng.Row, 1) & "#" & Cells(rng.Row, 2) & "@" & Cells(rng.Row, 3)
kk = 1
End Property
當有數據(單元格)輸入的時候,會將這個單元格及之后的幾個數據提取分別以"#"和"@" 進行分隔,一共分成三個部分。
2) rngsA數據的獲得
Property Get QSA()
For i = 1 To UBound(A())
RR = Left(A(i), InStr(A(i), "#") - 1)
If Trim(RR) = Trim(TJ) Then
rngsA = Mid(A(i), InStr(A(i), "#") + 1, InStr(A(i), "@") - InStr(A(i), "#") - 1)
Exit For
End If
Next
QSA = rngsA
End Property
提取rngsA數據時根據第一個字段的內容提取出相應的第二段的內容。
3) rngsB數據的獲得
Property Get QSB()
For i = 1 To UBound(A())
RR = Left(A(i), InStr(A(i), "#") - 1)
If Trim(RR) = Trim(TJ) Then
rngsB = Mid(A(i), InStr(A(i), "@") + 1, Len(A(i)) - InStr(A(i), "@"))
Exit For
End If
Next
QSB = rngsB
End Property
提取rngsB數據時根據第一個字段的內容提取出相應的第三段的內容。
我們再來回顧一下上面類模塊的作用,當輸入數據時,會把這些數據首先放到一個數組中,當提取時可以根據某個字段的內容進行有選擇的提取。
這就是類模塊,實現了一個較為完整的過程。在下一講我們會講到如何利用這個類模塊來完成我們的具體工作了。
到這里大家基本能了解類模塊應用的思路了,要首先搭建一個類,相當于要建立一個虛無的魂,再在主程序中將這個魂賦給某個具體的對象,讓這個對象去完成我們實際的工作,這或許是VBA中的機器人吧。
本講內容參考程序文件:VBA-CLASS(1-28).xlsm
我20多年的VBA實踐經驗,全部濃縮在下面的各個教程中: