亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

集合類:VBA集合對象的安全包裝

2019-11-18 17:55:24
字體:
來源:轉載
供稿:網友
你遲早都要管理一組由VBA類模塊創建的自定義對象,VBACollection對象是實現這一目的的理想工具。我們在該雜志的
當然,如果你能保證每個對象都具有相同得類型,并且具有相同得屬性何方法的話,那么在Collection中處理對象就變得異常簡單。例如,作為本月范例
ExcelVBA項目的組成部分,我們創建一個自定義的File類來代表一個磁盤文件。這個File類有幾個屬性,其中包括Path,Size,和ShortName。如果你創建了一個File對象的Collection,那么你將希望這個Collection中的每個對象都具有這些屬性。你可以毫無異議地使用與下面類似的代碼:


'PrintthesizeofthefirstfileintheCollection.
Debug.PrintcolFiles.Item(1).Size


但是,如果colFilesCollection中的第一個對象不是File,將會出現什么情況呢?如果它是一個Form或Control對象,又會怎樣呢?如果它根本就不是一個對象呢?當然,當它試圖執行該代碼的時候,VBA將生成運行時間錯誤。




圖1(左)VBACollection對象可以容納任何類型的對象



圖2(右)創建一個Collection類來防止不想要的對象進入集合


輸入Collection類


Collection類可以充當Collection對象的過濾器,限制你可以在里面存儲的對象類型(如圖2所示)。通過與你的應用程序中的Collection類(二不是Collection對象本身)的互相作用,你可以防止不想要的對象的進入。創建和使用Collection類允許你擴展Collection對象的屬性和方法(后面我們將舉例說明)。


為了說明Collection類以及如何創建一個Collection類,我們將使用帶有通過掃描磁盤目錄創建的文件集合的Excel97項目。圖3顯示了一個表單,它用你選擇了路徑之后存儲在自定義Collection類中的文件信息使得列表框通俗化。


這個表單使用一個叫做Files的Collection類來通俗化列表框。在創建Collection的時候,以向你的VBA項目添加一個新的類模塊作為開始,然后在這個新模塊的聲明段聲明一個PrivateCollection對象。下面是來自Files類模塊的聲明:


'Collectionoffiles.
PrivatepcolFilesAsNewCollection


為了將Collection對象與外界"隔絕",并阻止程序的其他部分用無用的東西填充它,必須將Collection對象聲明為Private。


復制所需要的方法


當然,一旦你已經將Collection對象聲明為Private,那么對于任何過程都沒有辦法向其中添加項目或從中刪除項目了。因而,下一步就是復制Collection對象的標準方法了。盡管聽起來象是做了大量額外的工作,實際上仍然在做我們前面所提及的"過濾"工作。


請記住,內建的Collection對象具有Add方法,該方法接受對象引用和獨特的、包括文字與數字的標識符。如果你的應用程序正在直接使用Collection對象,那么它將極有可能創建對象的一個新的實例,并將其添加到Collection本身。


'Createanewinstanceofanobject.
DimobjFileAsNewFile
objFile.Path="C:AUTOEXEC.BAT"

'AddtoaCollectionobject.
colFiles.AddobjFile,objFile.ShortName

應用Collection類,應用程序調用該類的Add方法,傳遞任何必需的信息。請將先前的代碼與Files類的Add方法做一比較:

WithaCollectionclass,theapplicationcallstheAddmethodoftheclass,passinganyrequiredinformation.ContrastthepreviouscodewiththeAddmethodoftheFilesclass:

PublicFunctionAdd(PathAsString)AsFile

DimobjFileAsFile

'CreatethenewFileobject.
SetobjFile=NewFile
objFile.Path=Path

'AddittothePrivatecollection.
pcolFiles.AddobjFile,objFile.ShortName

'Returnapointertothenewobject.
SetAdd=objFile

EndFunction

在本例中,到Collection的對象創建和添加發生在Add方法內部;而類則保留了完整的控制。任何必需的信息(例如文件的路徑)是作為參數向方法提供的。由應用程序調用將文件添加到Collection的代碼然后可以簡化為:

'Addafiletothecollection.
colFiles.Add"C:AUTOEXEC.BAT"
InadditiontotheAddmethod,theCollectionclassshouldalsoimplementtheItemandRemovemethods,aswellasaCountproperty:

PublicFunctionItem(KeyAsVariant)AsFile
'Returnaniteminthecollection.
SetItem=pcolFiles.Item(Key)
EndFunction

PublicSubRemove(KeyAsVariant)
'Removeanitemfromthecollection.
pcolFiles.RemoveKey
EndSub

PropertyGetCount()AsLong
'Returnthenumberofitems.
Count=pcolFiles.Count
EndProperty

請注意,在這三種方法中,我們省略了錯誤處理--有些事情你是從來都不應該做的!至少應該包括一個錯誤處理器,通過使用Err對象的Raise方法來將錯誤傳遞、給調用過程。

圖3這個表單通過顯示文件信息來說明Collection類

'Privatevariabletostorepath.
PrivatepstrPathAsString

PropertyGetPath()AsString
'Returnstoredpathvalue.
Path=pstrPath
EndProperty

PropertyLetPath(strPathAsString)

DimstrFileAsString

'Clearthecollection.
SetpcolFiles=NewCollection

'Makesurethere'sabackslash.
IfRight(strPath,1)<>""Then
strPath=strPath&""
EndIf

'Getthefirstfile.
strFile=Dir(strPath&"*.*",_
vbReadOnlyOrvbHiddenOrvbArchiveOrvbSystem)
DoUntilLen(strFile)=0
'Addittothecollection.
CallAdd(strPath&strFile)
'Getthenextfile.
strFile=Dir()
Loop

'Savethepath.
pstrPath=strPath

EndProperty

圖4向Collection類添加Path屬性。將該屬性和類設置為掃描目錄并將所找到的每個文件添加到私有Collection對象。

擴展Collection類

現在,你可以通過聲明Files類的一個實例來使用它了,并為曾經由Dir函數找到的每個文件反復調用該類的Add方法。但這不是我們的例子要完成的工作。為什么不是呢?使用Collection類的一個優點是你可以通過添加更多的屬性和方法來擴展它的功能;不僅僅限于Add,Remove,Item,和Count。

在我們的Files類的情形中,它難道不對在類本身,而不是使用該類的每個應用程序里面,放置掃描目錄的代碼做更多的檢測嗎?這是面向對象設計的一個指導原則:將代碼放在最靠近需要它的地方。

為了闡述這個概念,我們向Collection類添加了一個Path屬性。當你設置這個屬性的時候,這個類將對目錄進行掃描,并向Collection對象添加它所找到的每個文件(見圖4)。

當一個過程改變該類的Path屬性的時候,將觸發PropertyLet過程。在我們的例子中,它發生在你從瀏覽器對話框選擇了一個路徑之后。這里是完成用文件列表填充Collection任務的簡單代碼。

'Reinitializethecollection.
SetmobjFiles=NewFiles

'Setthepathproperty.
mobjFiles.Path=strPath

一旦設置了Path屬性,Files類就將通俗化它自己的Collection,并且使它可以提供給應用程序。這已經是另一個例子了,在這個例子里面,過程的"guts"存在于類自己內部(你可以證明類已不再需要它的Add和Remove方法了。在有些應用程序中,可能確實是這樣,但為了達到說明的目的,我們已經選擇了留下它們作為該類的一部分)。

一些不利之處

使用VBACollection類的生活并不總是美酒和玫瑰。當你使用Collection類代替Collection對象時,必須放棄兩樣東西。第一樣是Collection對象的默認方法,Item。默認的方法允許你從你的代碼中省略單詞"Item"。例如,如下兩條語句是一樣的,都是假定colFiles引用一個Collection對象。

Debug.PrintcolFiles.Item(1).Size
Debug.PrintcolFiles(1).Size

除非你正在使用的是VisualBasic5.0,否則沒有辦法為一個類指定默認的方法。因而,你必須總是顯式調用Item方法。

Collection類的第二個主要的不足之處是不能創建列舉函數。列舉類就是可以使ForEach循環工作的類。如果你想重復Collection中的每一個項目,那么就必須用老式的方法來完成,也就是使用Count屬性和ForNext循環。例如,下面的代碼可以通俗化列表框:

'Fillthelistboxwithinfo.
lstFiles.Clear
ForlngCount=1TomobjFiles.Count
WithmobjFiles.Item(lngCount)
lstFiles.AddItem.ShortName&_
Space(12-Len(.ShortName))&_
vbTab&.AttributeString&_
vbTab&.Size
EndWith
Next

請注意該過程是如何使用


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品美女久久久久久免费| 日本精品va在线观看| 最近免费中文字幕视频2019| 亚洲国产中文字幕久久网| 国产成人在线一区| 91色在线视频| 亚洲另类欧美自拍| 亚洲第一精品电影| 国内精品久久久久久久| 国产精品美女免费| 日韩中文娱乐网| 久久久久免费精品国产| 欧美激情免费观看| 国产欧美日韩丝袜精品一区| 亚洲男人天堂手机在线| 尤物yw午夜国产精品视频明星| 45www国产精品网站| 国产视频精品va久久久久久| 亚洲精品国产精品国产自| 97精品一区二区视频在线观看| 欧美夜福利tv在线| 亚洲精品视频免费| 欧美一级免费看| 成人网址在线观看| 国产日韩欧美视频| 一本色道久久88综合日韩精品| 成人精品视频99在线观看免费| 日韩在线视频免费观看| 欧美激情亚洲激情| 国产九九精品视频| 国外成人在线直播| 2019最新中文字幕| 日韩av毛片网| 亚洲人成在线观看| 国外日韩电影在线观看| 亚洲一区二区三区乱码aⅴ| 欧美日韩在线观看视频小说| 九九视频这里只有精品| 国产亚洲精品久久久优势| 国产在线精品成人一区二区三区| 久久久久久久久综合| 欧美黄色片在线观看| 国产人妖伪娘一区91| 日韩中文理论片| 色婷婷综合久久久久| 午夜精品福利在线观看| 国产精品久久久91| 国产成人精品电影久久久| 欧美日韩亚洲天堂| 国产91色在线|| 亚洲国产精品va在看黑人| 精品福利在线视频| 欧美日韩午夜剧场| 国产欧美va欧美va香蕉在| 国产自产女人91一区在线观看| 91亚洲国产成人久久精品网站| 成人精品视频在线| 亚洲欧美在线x视频| 日韩精品在线观看视频| 日韩黄色高清视频| 国产精品亚洲网站| 日韩www在线| 91精品久久久久久久久久久久久| 亚洲欧美国产日韩中文字幕| 亚洲3p在线观看| 夜夜嗨av一区二区三区免费区| 国产精品国内视频| 久久精品影视伊人网| 欧美黑人国产人伦爽爽爽| 国产一区二区三区在线免费观看| 91在线网站视频| 国产精品视频男人的天堂| 日韩福利视频在线观看| 欧美裸体xxxx| 成人h视频在线观看播放| 国产精品丝袜一区二区三区| 久久久久久久久久国产精品| 国产精品久久久久福利| 91精品视频专区| 91精品久久久久久久久不口人| 精品久久香蕉国产线看观看亚洲| 亚洲天堂色网站| 国产日韩欧美夫妻视频在线观看| 国产精品爱久久久久久久| 九九视频直播综合网| 在线观看欧美日韩国产| 亚洲色图第三页| 两个人的视频www国产精品| 国产一区深夜福利| 欧美国产视频日韩| 亚洲午夜精品久久久久久久久久久久| 国产欧美日韩91| 日本中文字幕久久看| 国产精品第8页| 久久91超碰青草是什么| 欧洲中文字幕国产精品| 国产精品视频内| 日韩在线国产精品| 欧美国产激情18| 成人黄色免费看| 国产成人福利视频| 精品亚洲va在线va天堂资源站| 国产成人精品999| 精品中文字幕在线| 国产日韩中文字幕| 欧美精品久久一区二区| 久久久亚洲影院| 久久精品视频播放| 欧美激情在线视频二区| 日本精品视频在线播放| 综合网中文字幕| 日韩成人激情视频| 久久这里只有精品视频首页| 日韩精品亚洲元码| 正在播放欧美一区| 国产成+人+综合+亚洲欧洲| 亚洲国产精品久久久久秋霞蜜臀| 91视频-88av| 色综合视频一区中文字幕| 一区二区国产精品视频| 欧美日韩在线视频首页| 亚洲白拍色综合图区| 久久久精品一区二区三区| 日韩中文字幕在线精品| 97香蕉久久超级碰碰高清版| 国产日韩欧美另类| 成人在线小视频| 欧美最近摘花xxxx摘花| 91中文字幕在线观看| 第一福利永久视频精品| 久久精品视频免费播放| 亚洲欧洲国产伦综合| 91av在线播放视频| 国产亚洲精品91在线| 久久777国产线看观看精品| 奇米成人av国产一区二区三区| 亚洲欧洲在线观看| 亚洲国产精品va在看黑人| 欧美电影免费观看网站| 亚洲美女视频网站| 国产精品亚洲美女av网站| 亚洲日本欧美中文幕| 欧美亚洲激情视频| 久久中文字幕在线| 亚洲娇小xxxx欧美娇小| 国产亚洲欧美视频| 亚洲国产成人爱av在线播放| 亚洲а∨天堂久久精品9966| 成人a在线视频| 成人黄在线观看| 欧美激情一二三| 日韩中文在线中文网在线观看| 国产精品精品视频一区二区三区| 91在线视频成人| 一本色道久久88综合日韩精品| 成人福利在线观看| 国内精品小视频| 亚洲日韩第一页| 黑人巨大精品欧美一区二区一视频| 日韩免费在线播放| 国产精品手机播放| 亚洲天堂网在线观看| 国产精品中文字幕久久久| 日韩一级裸体免费视频|