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

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

集合類:VBA集合對(duì)象的安全包裝

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


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


但是,如果colFilesCollection中的第一個(gè)對(duì)象不是File,將會(huì)出現(xiàn)什么情況呢?如果它是一個(gè)Form或Control對(duì)象,又會(huì)怎樣呢?如果它根本就不是一個(gè)對(duì)象呢?當(dāng)然,當(dāng)它試圖執(zhí)行該代碼的時(shí)候,VBA將生成運(yùn)行時(shí)間錯(cuò)誤。




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



圖2(右)創(chuàng)建一個(gè)Collection類來(lái)防止不想要的對(duì)象進(jìn)入集合


輸入Collection類


Collection類可以充當(dāng)Collection對(duì)象的過(guò)濾器,限制你可以在里面存儲(chǔ)的對(duì)象類型(如圖2所示)。通過(guò)與你的應(yīng)用程序中的Collection類(二不是Collection對(duì)象本身)的互相作用,你可以防止不想要的對(duì)象的進(jìn)入。創(chuàng)建和使用Collection類允許你擴(kuò)展Collection對(duì)象的屬性和方法(后面我們將舉例說(shuō)明)。


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


這個(gè)表單使用一個(gè)叫做Files的Collection類來(lái)通俗化列表框。在創(chuàng)建Collection的時(shí)候,以向你的VBA項(xiàng)目添加一個(gè)新的類模塊作為開始,然后在這個(gè)新模塊的聲明段聲明一個(gè)PrivateCollection對(duì)象。下面是來(lái)自Files類模塊的聲明:


'Collectionoffiles.
PrivatepcolFilesAsNewCollection


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


復(fù)制所需要的方法


當(dāng)然,一旦你已經(jīng)將Collection對(duì)象聲明為Private,那么對(duì)于任何過(guò)程都沒(méi)有辦法向其中添加項(xiàng)目或從中刪除項(xiàng)目了。因而,下一步就是復(fù)制Collection對(duì)象的標(biāo)準(zhǔn)方法了。盡管聽(tīng)起來(lái)象是做了大量額外的工作,實(shí)際上仍然在做我們前面所提及的"過(guò)濾"工作。


請(qǐng)記住,內(nèi)建的Collection對(duì)象具有Add方法,該方法接受對(duì)象引用和獨(dú)特的、包括文字與數(shù)字的標(biāo)識(shí)符。如果你的應(yīng)用程序正在直接使用Collection對(duì)象,那么它將極有可能創(chuàng)建對(duì)象的一個(gè)新的實(shí)例,并將其添加到Collection本身。


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

'AddtoaCollectionobject.
colFiles.AddobjFile,objFile.ShortName

應(yīng)用Collection類,應(yīng)用程序調(diào)用該類的Add方法,傳遞任何必需的信息。請(qǐng)將先前的代碼與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的對(duì)象創(chuàng)建和添加發(fā)生在Add方法內(nèi)部;而類則保留了完整的控制。任何必需的信息(例如文件的路徑)是作為參數(shù)向方法提供的。由應(yīng)用程序調(diào)用將文件添加到Collection的代碼然后可以簡(jiǎn)化為:

'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

請(qǐng)注意,在這三種方法中,我們省略了錯(cuò)誤處理--有些事情你是從來(lái)都不應(yīng)該做的!至少應(yīng)該包括一個(gè)錯(cuò)誤處理器,通過(guò)使用Err對(duì)象的Raise方法來(lái)將錯(cuò)誤傳遞、給調(diào)用過(guò)程。

圖3這個(gè)表單通過(guò)顯示文件信息來(lái)說(shuō)明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屬性。將該屬性和類設(shè)置為掃描目錄并將所找到的每個(gè)文件添加到私有Collection對(duì)象。

擴(kuò)展Collection類

現(xiàn)在,你可以通過(guò)聲明Files類的一個(gè)實(shí)例來(lái)使用它了,并為曾經(jīng)由Dir函數(shù)找到的每個(gè)文件反復(fù)調(diào)用該類的Add方法。但這不是我們的例子要完成的工作。為什么不是呢?使用Collection類的一個(gè)優(yōu)點(diǎn)是你可以通過(guò)添加更多的屬性和方法來(lái)擴(kuò)展它的功能;不僅僅限于Add,Remove,Item,和Count。

在我們的Files類的情形中,它難道不對(duì)在類本身,而不是使用該類的每個(gè)應(yīng)用程序里面,放置掃描目錄的代碼做更多的檢測(cè)嗎?這是面向?qū)ο笤O(shè)計(jì)的一個(gè)指導(dǎo)原則:將代碼放在最靠近需要它的地方。

為了闡述這個(gè)概念,我們向Collection類添加了一個(gè)Path屬性。當(dāng)你設(shè)置這個(gè)屬性的時(shí)候,這個(gè)類將對(duì)目錄進(jìn)行掃描,并向Collection對(duì)象添加它所找到的每個(gè)文件(見(jiàn)圖4)。

當(dāng)一個(gè)過(guò)程改變?cè)擃惖腜ath屬性的時(shí)候,將觸發(fā)PropertyLet過(guò)程。在我們的例子中,它發(fā)生在你從瀏覽器對(duì)話框選擇了一個(gè)路徑之后。這里是完成用文件列表填充Collection任務(wù)的簡(jiǎn)單代碼。

'Reinitializethecollection.
SetmobjFiles=NewFiles

'Setthepathproperty.
mobjFiles.Path=strPath

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

一些不利之處

使用VBACollection類的生活并不總是美酒和玫瑰。當(dāng)你使用Collection類代替Collection對(duì)象時(shí),必須放棄兩樣?xùn)|西。第一樣是Collection對(duì)象的默認(rèn)方法,Item。默認(rèn)的方法允許你從你的代碼中省略單詞"Item"。例如,如下兩條語(yǔ)句是一樣的,都是假定colFiles引用一個(gè)Collection對(duì)象。

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

除非你正在使用的是VisualBasic5.0,否則沒(méi)有辦法為一個(gè)類指定默認(rèn)的方法。因而,你必須總是顯式調(diào)用Item方法。

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

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

請(qǐng)注意該過(guò)程是如何使用


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
色先锋资源久久综合5566| 国产精品久久久久野外| 亚洲自拍偷拍一区二区| 黄一区二区三区| 免费的黄网站在线观看| 国产成人在线一区二区| 一级淫片免费看| 视频国产一区二区三区| 亚洲永久免费精品| 国产麻豆乱码精品一区二区三区| 一区二区三区四区五区精品| 欧美高清性粉嫩交| 久久久美女毛片| 大桥未久女教师av一区二区| eeuss影院95999部| 99成人在线视频| 亚洲福利视频网| 国内一区二区在线视频观看| 9l视频白拍9色9l视频| 精品少妇一区二区三区免费观| 国产毛片精品国产一区二区三区| 免费看h的网站| 欧美激情综合五月色丁香小说| 99久久精品免费精品国产| 视频一区三区| 国产做受高潮漫动| 国产黄色免费| 日韩一区二区不卡| 久久国产福利国产秒拍| 久久大香伊蕉在人线观看热2| 欧美日韩一级黄| 欧美色手机在线观看| 实拍女处破www免费看| 99久久99热这里只有精品| 欧美大黄免费观看| 日本xxxx高清色视频| 免费无码毛片一区二三区| 91视频国产一区| julia一区二区中文久久94| 黄色成人羞羞视频| 国产精品视频麻豆| 自拍偷在线精品自拍偷无码专区| 国产精品88a∨| 成人羞羞视频播放网站| www夜片内射视频日韩精品成人| 国偷自产视频一区二区久| 国产免费视频传媒| 国产中年熟女高潮大集合| 国产一区欧美二区| jizzjizzjizz亚洲日本| 97国产真实伦对白精彩视频8| 欧美一区二区视频在线播放| 成人线上播放| www.com日本| 亚洲精品aa| 精品美女在线观看| 欧美艳星kaydenkross| 亚洲第一黄色网| 日本一级黄色录像| 麻豆成人在线观看| 免费视频成人| 国产精品精华液网站| 柠檬福利视频导航| 深夜福利视频网站| chinese麻豆新拍video| 日韩美女精品在线| 极品一线天粉嫩虎白馒头| 欧美日韩国产精品综合| 一级黄色性视频| 少妇高潮一区二区三区喷水| 亚洲天堂久久久| 欧美激情在线免费观看| 日韩欧美一区二区三区免费观看| 国产精品zjzjzj在线观看| 亚洲色图欧美制服丝袜另类第一页| 国产福利久久久| 中文字幕视频在线免费观看| 在线综合视频播放| 久久国产成人精品国产成人亚洲| 亚洲成人在线观看视频| 成熟了的熟妇毛茸茸| 欧美日韩中文在线| 可以免费在线看黄的网站| 国产美女视频一区二区二三区| jizz18女人高潮| av中文在线资源库| 欧美成人一区二区三区片免费| 国产精品久久久久久久久借妻| 亚洲自拍在线观看| 波多野结衣av一区二区全免费观看| 人人在草线视频在线观看| 亚洲人成精品久久久久久| 日韩专区一区二区| 操碰免费视频| 色偷偷av一区二区三区乱| 欧美系列在线观看| 欧美激情成人在线| 成人做爰69片免网站| 中文字幕在线看视频国产欧美在线看完整| 在线精品国精品国产尤物884a| 精品免费视频123区| 欧美一级视频精品观看| 99久久久国产精品免费蜜臀| 久久国产精品久久精品国产| 欧美重口乱码一区二区| 懂色aⅴ精品一区二区三区蜜月| 国产有色视频色综合| 亚洲午夜精品国产| 亚洲欧美日韩国产中文专区| 黄色网页在线播放| 在线视频你懂得| 欧美日韩精品一区| 亚洲高清视频免费| 韩日成人av| 久久久久久久999| 欧美视频一区| 另类一区二区三区| 色久综合一二码| 国产精品看片资源| 日韩av在线一区| 久久视频在线观看中文字幕| 日韩视频中文字幕在线观看| 国产在亚洲线视频观看| 成人性生交大片免费看视频在线| 91亚洲国产成人久久精品| 无码少妇一区二区三区芒果| 欧美sm美女调教| 亚洲福利专区| 亚洲第一天堂影院| 一级做a爰片久久毛片| 国产高清一区二区| 超碰中文字幕在线| 国产精品天天狠天天看| 精品国产露脸精彩对白| 国产精品一区二区久久国产| 伦理电影国产精品| 国产精品国模大尺度私拍| 欧美日韩国产综合草草| 欧美成人a视频| 国产精品㊣新片速递bt| 国产成人久久777777| 日韩在线视频在线| 蜜桃伊人久久| 色视频免费版高清在线观看| 在线视频一二三区| 在线观看欧美日韩电影| 中文字幕久久久久久久| 久久综合色综合88| 国产精品久久久久一区| 国产精品成人av在线| 精品美女国产在线| 一区二区三区视频免费| 天天综合在线观看| 久久久久久成人精品| 国产精品一区二区视频| 欧美3p在线观看| 成人精品视频99在线观看免费| 美国毛片一区二区三区| www.色综合.com| 日韩欧美一卡二卡| 美女100%露胸无遮挡| jizzjizzjizz孕妇| 欧美一激情一区二区三区| 欧美在线首页| 手机在线色视频| 日本aaa在线观看| 麻豆国产欧美一区二区三区| 超碰在线中文字幕| 综合色中文字幕| 久久艹这里只有精品| 国产精品欧美精品| 97超碰人人爱| 激情图片qvod| 久久久男人的天堂| 三上悠亚在线一区| 亚洲va国产va天堂va久久| 国产视频一区二区不卡| 亚洲精品亚洲人成在线| 久久96国产精品久久99软件| 亚洲美女屁股眼交| 亚洲欧美国产高清| 欧美精品一区免费| 国产黄色一区二区三区| 日本不卡免费高清视频| 国产极品一区二区三区| 欧美激情性爽国产精品17p| 欧美绝顶高潮抽搐喷水合集| 日韩一卡二卡在线| 9999在线观看| 国产精品欧美精品| 成人频在线观看| 在线播放国产一区中文字幕剧情欧美| 亚洲第一精品自拍| 国产精品久久久久久免费观看| 日本婷婷久久久久久久久一区二区| 91网站免费看| 国产九九在线观看| 97影院秋霞午夜在线观看| 草莓污污视频在线观看| 美女日韩欧美| 午夜日韩福利| 毛片毛片毛片毛片毛片毛片| 狠狠躁夜夜躁人人爽天天高潮| 91看片免费| 欧美成年人视频网站| 亚洲一区欧美在线| 男女猛烈激情xx00免费视频| 欧美tk—视频vk| 涩涩视频在线观看下载| 美女啪啪无遮挡免费久久网站| 午夜视频在线观看免费视频| 久久99国产精品久久99小说| 岛国av在线一区| 青青草视频在线免费观看| 色窝窝无码一区二区三区| 欧美xxx黑人xxx水蜜桃| 韩国主播福利视频一区二区三区| 在线播放国产精品| 国产精品露脸av在线| 国产igao激情在线入口| 中文字幕精品—区二区四季| 亚洲精品一区二区精华| 久久久电影免费观看完整版| 45www国产精品网站| 91在线国产福利| 欧美三级电影网站| 国产亚洲成av人片在线观黄桃| 国内国产区免费视频| 最近免费观看高清韩国日本大全| 糖心vlog免费在线观看| 久久九九免费| 四虎国产精品免费| 成人中文字幕+乱码+中文字幕| 亚洲国产精品视频| 久久久久久国产视频| 领导边摸边吃奶边做爽在线观看| 91香蕉视频在线| 日本一区二区三区精品| 未来日记在线观看| 国产激情在线观看| 欧美成aaa人片在线观看蜜臀| 国产精品一区二区在线观看| 国产精品久久久久久久久图文区| 日本少妇激情舌吻| 美女视频一区| 亚洲茄子视频| 亚洲欧美另类动漫| 久久久久中文字幕| 亚洲欧美强伦一区二区| 丰满大乳国产精品| www.激情网.com| 亚洲新中文字幕| 天堂网在线.www天堂在线| 欧美aaaaaaaa牛牛影院| 悠悠资源av网站| 亚洲欧美另类自拍| 日本高清久久一区二区三区| 日韩欧美亚洲成人| 日本毛片在线观看| 男人天堂中文字幕| 国产精品―色哟哟| 动漫性做爰视频| 中国av一区二区三区| 91肉色超薄丝袜脚交一区二区| 无码av免费一区二区三区试看| 黄色片一区二区三区| 中文在线а天堂av| 成人av在线天堂| 理论片在线观看理伦片| 96成人在线视频| 极品尤物一区二区| 5月婷婷6月丁香| 亚洲欧洲另类| 少妇丰满尤物大尺度写真| 亚洲专区免费| 欧美自拍丝袜亚洲| 国产午夜精品一区二区| 久久一级电影| 欧美性三三影院| 国产高清在线视频| 久久99热精品这里久久精品| 久久综合亚洲社区| 欧美成人乱码一二三四区免费| 日韩欧美精品在线视频| 欧美日韩国产精品一区二区不卡中文| 深夜福利免费在线观看| 久久精彩视频| 欧美黄片一区二区三区| 中文字幕在线中文字幕二区| 亚洲伊人久久综合| 国产极品美女高潮无套嗷嗷叫酒店| 美臀av在线| 久久久99国产精品免费| 丁香久久综合| 欧美日韩中文字幕综合视频| 97久久天天综合色天天综合色hd| 樱花www成人免费视频| 国产精品草莓在线免费观看| 亚洲精品乱码久久久久久9色| 一本到不卡精品视频在线观看| 99色在线视频| 亚洲国产欧美日韩在线观看第一区| 精品一区二区三区在线观看视频| 伊人性伊人情综合网| 国产精品亚洲欧美导航| 欧美手机在线视频| 日本一区视频在线播放| 黄色福利在线观看| 亚洲第一页在线观看| 免费久久一级欧美特大黄| 一区二区三区|亚洲午夜| 浮力影院网站午夜| 欧美中文字幕在线观看| 日韩一区二区三区在线视频| 国产精品无码白浆高潮| 精品99久久久久成人网站免费| 欧美图片激情小说| 欧美日韩一道本| 国产亚洲成年网址在线观看| 国产自偷自偷免费一区| 黄色影片网站| 久久久精品国产免费观看同学| 香蕉视频禁止18| 青青青青国产视频| 99精品视频免费全部在线| 毛片视频网站在线观看| 少妇人妻偷人精品一区二区| 国产在线拍揄自揄视频不卡99|