




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、常見(jiàn)字典用法集錦及代碼詳解藍(lán)橋玄霜前言凡是上過(guò)學(xué)校的人都使用過(guò)字典,從新華字典、成語(yǔ)詞典,到英漢字典以及各種各樣數(shù)不勝數(shù)的專業(yè)字典,字典是上學(xué)必備的、經(jīng)常查閱的工具書。有了它們,我們可以很方便的通過(guò)查找某個(gè)關(guān)鍵字,進(jìn)而查到這個(gè)關(guān)鍵字的種種解釋,非??旖輰?shí)用。凡是上過(guò)EH論壇的想學(xué)習(xí)VBA里面字典用法的,幾乎都看過(guò)研究過(guò)northwolves狼版主、oobird版主的有關(guān)字典的精華貼和經(jīng)典代碼。我也是從這里接觸到和學(xué)習(xí)到字典的,在此,對(duì)他們表示深深的謝意,同時(shí)也對(duì)很多把字典用得出神入化的高手們致敬,從他們那里我們也學(xué)到了很多,也得到了提高。字典對(duì)象只有4個(gè)屬性和6個(gè)方法,相對(duì)其它的對(duì)象要簡(jiǎn)潔得多
2、,而且容易理解使用方便,功能強(qiáng)大,運(yùn)行速度非常快,效率極高。深受大家的喜愛(ài)。本文希望通過(guò)對(duì)一些字典應(yīng)用的典型實(shí)例的代碼的詳細(xì)解釋來(lái)給初次接觸字典和想要進(jìn)一步了解字典用法的朋友提供一點(diǎn)備查的參考資料,希望大家能喜歡。給代碼注釋估計(jì)是大家都怕做的,因?yàn)橥浅隽Σ挥懞玫?,稍不留神或者自己確實(shí)理解得不對(duì),還會(huì)貽誤他人。所以下面的這些注釋如果有不對(duì)或者不妥當(dāng)?shù)牡胤?,?qǐng)大家跟帖時(shí)指正批評(píng),及時(shí)改正。字典的簡(jiǎn)介字典(Dictionary)對(duì)象是微軟Windows腳本語(yǔ)言中的一個(gè)很有用的對(duì)象。附帶提一下,有名的正則表達(dá)式(RegExp)對(duì)象和能方便處理驅(qū)動(dòng)器、文件夾和文件的(FileSystemObject
3、 )對(duì)象也是微軟Windows腳本語(yǔ)言中的一份子。字典對(duì)象相當(dāng)于一種聯(lián)合數(shù)組,它是由具有唯一性的關(guān)鍵字(Key)和它的項(xiàng)(Item)聯(lián)合組成。就好像一本字典書一樣,是由很多生字和對(duì)它們對(duì)應(yīng)的注解所組成。比如字典的“典”字的解釋是這樣的:“典”字就是具有唯一性的關(guān)鍵字,后面的解釋就是它的項(xiàng),和“典”字聯(lián)合組成一對(duì)數(shù)據(jù)。常用關(guān)鍵字英漢對(duì)照:Dictionary字典Key關(guān)鍵字Item項(xiàng),或者譯為 條目字典對(duì)象的方法有6個(gè):Add方法、Keys方法、Items方法、Exists方法、Remove方法、RemoveAll方法。Add方法向 Dictionary 對(duì)象中添加一個(gè)關(guān)鍵字項(xiàng)目對(duì)。object
4、.Add (key, item)參數(shù)object 必選項(xiàng)。總是一個(gè) Dictionary 對(duì)象的名稱。 key 必選項(xiàng)。與被添加的 item 相關(guān)聯(lián)的 key。 item 必選項(xiàng)。與被添加的 key 相關(guān)聯(lián)的 item。 說(shuō)明如果 key 已經(jīng)存在,那么將導(dǎo)致一個(gè)錯(cuò)誤。常用語(yǔ)句:Dim d Set d = CreateObject("Scripting.Dictionary")d.Add "a", "Athens" d.Add "b", "Belgrade"d.Add "c"
5、, "Cairo"代碼詳解1、Dim d :創(chuàng)建變量,也稱為聲明變量。變量d聲明為可變型數(shù)據(jù)類型(Variant),d后面沒(méi)有寫數(shù)據(jù)類型,默認(rèn)就是可變型數(shù)據(jù)類型(Variant)。也有寫成Dim d As Object的,聲明為對(duì)象。2、Set d = CreateObject("Scripting.Dictionary"):創(chuàng)建字典對(duì)象,并把字典對(duì)象賦給變量d。這是最常用的一句代碼。所謂的“后期綁定”。用了這句代碼就不用先引用c:windowssystem32scrrun.dll了。3、d.Add "a", "Athens
6、":添加一關(guān)鍵字”a”和對(duì)應(yīng)于它的項(xiàng)”Athens”。 4、d.Add "b", “Belgrade”:添加一關(guān)鍵字”b”和對(duì)應(yīng)于它的項(xiàng)”Belgrade”。 5、d.Add "c", “Cairo”:添加一關(guān)鍵字”c”和對(duì)應(yīng)于它的項(xiàng)”Cairo”。 Exists方法如果 Dictionary 對(duì)象中存在所指定的關(guān)鍵字則返回 true,否則返回 false。object.Exists(key)參數(shù)object 必選項(xiàng)??偸且粋€(gè) Dictionary 對(duì)象的名稱。 key 必選項(xiàng)。需要在 Dictionary 對(duì)象中搜索的 key 值。常用語(yǔ)句:
7、Dim d, msg$ Set d = CreateObject("Scripting.Dictionary") d.Add "a", "Athens" d.Add "b", "Belgrade" d.Add "c", "Cairo" If d.Exists("c") Then msg = "指定的關(guān)鍵字已經(jīng)存在。" Else msg = "指定的關(guān)鍵字不存在。" End If代碼詳解1、Dim
8、d, msg$ :聲明變量,d見(jiàn)前例;msg$ 聲明為字符串?dāng)?shù)據(jù)類型(String),一般寫法為Dim msg As String。String 的類型聲明字符為美元號(hào) ($)。2、If d.Exists("c") Then:如果字典中存在關(guān)鍵字”c”,那么執(zhí)行下面的語(yǔ)句。3、msg = "指定的關(guān)鍵字已經(jīng)存在。" :把"指定的關(guān)鍵字已經(jīng)存在。"字符串賦給變量msg。4、Else :否則執(zhí)行下面的語(yǔ)句。5、msg = "指定的關(guān)鍵字不存在。" :把"指定的關(guān)鍵字不存在。"字符串賦給變量msg。6
9、、End If :結(jié)束If ElseEndif判斷。Keys方法返回一個(gè)數(shù)組,其中包含了一個(gè) Dictionary 對(duì)象中的全部現(xiàn)有的關(guān)鍵字。object.Keys( )其中 object 總是一個(gè) Dictionary 對(duì)象的名稱。常用語(yǔ)句:Dim d, k Set d = CreateObject("Scripting.Dictionary") d.Add "a", "Athens" d.Add "b", "Belgrade" d.Add "c", "Cairo
10、" k=d.Keys B1.Resize(d.Count,1)=Application.Transpose(k)代碼詳解1、Dim d, k :聲明變量,d見(jiàn)前例;k默認(rèn)是可變型數(shù)據(jù)類型(Variant)。2、k=d.Keys:把字典中存在的所有的關(guān)鍵字賦給變量k。得到的是一個(gè)一維數(shù)組,下限為0,上限為d.Count-1。這是數(shù)組的默認(rèn)形式。3、B1.Resize(d.Count,1)=Application.Transpose(k) :這句代碼是很常用很經(jīng)典的代碼,所以這里要多說(shuō)一些。Resize是Range對(duì)象的一個(gè)屬性,用于調(diào)整指定區(qū)域的大小,它有兩個(gè)參數(shù),第一個(gè)是行數(shù),本例是
11、d.Count,指的是字典中關(guān)鍵字的數(shù)量,整本字典中有多少個(gè)關(guān)鍵字,本例d.Count=3,因?yàn)橛?個(gè)關(guān)鍵字。呵呵,是不是說(shuō)多了。第二個(gè)是列數(shù),本例是1。這樣左邊的意思就是:把一個(gè)單元格B1調(diào)整為以B1開始的一列單元格區(qū)域,行數(shù)等于字典中關(guān)鍵字的數(shù)量d.Count,就是把單元格B1調(diào)整為單元格區(qū)域B1:B3了。右邊的k是個(gè)一維數(shù)組,是水平排列的,我們知道Excel工作表函數(shù)里面有個(gè)轉(zhuǎn)置函數(shù)Transpose,用它可以把水平排列的置換成豎向排列。但是在VBA中不能直接使用該工作表函數(shù),需要通過(guò)Application對(duì)象的WorksheetFunction屬性來(lái)使用它。所以完整的寫法是Applic
12、ation. WorksheetFunction.Transpose(k),中間的WorksheetFunction可省略?,F(xiàn)在可以解釋這句代碼了:把字典中所有的關(guān)鍵字賦給以B1單元格開始的單元格區(qū)域中。Items方法返回一個(gè)數(shù)組,其中包含了一個(gè) Dictionary 對(duì)象中的所有項(xiàng)目。object.Items( )其中 object 總是一個(gè) Dictionary 對(duì)象的名稱。常用語(yǔ)句:Dim d, t Set d = CreateObject("Scripting.Dictionary") d.Add "a", "Athens"
13、d.Add "b", "Belgrade" d.Add "c", "Cairo" t=d.Items C1.Resize(d.Count,1)=Application.Transpose(t)代碼詳解1、Dim d, t :聲明變量,d見(jiàn)前例;t默認(rèn)是可變型數(shù)據(jù)類型(Variant)。2、t=d.Items :把字典中所有的關(guān)鍵字對(duì)應(yīng)的項(xiàng)賦給變量t。得到的也是一個(gè)一維數(shù)組,下限為0,上限為d.Count-1。這是數(shù)組的默認(rèn)形式。3、C1.Resize(d.Count,1)=Application.Transpose
14、(t) :有了上面Keys方法的解釋這句代碼就不用多說(shuō)了,就是把字典中所有的關(guān)鍵字對(duì)應(yīng)的項(xiàng)賦給以C1單元格開始的單元格區(qū)域中。Remove方法Remove 方法從一個(gè) Dictionary 對(duì)象中清除一個(gè)關(guān)鍵字,項(xiàng)目對(duì)。object.Remove(key )其中 object 總是一個(gè) Dictionary 對(duì)象的名稱。key 必選項(xiàng)。key 與要從 Dictionary 對(duì)象中刪除的關(guān)鍵字,項(xiàng)目對(duì)相關(guān)聯(lián)。 說(shuō)明如果所指定的關(guān)鍵字,項(xiàng)目對(duì)不存在,那么將導(dǎo)致一個(gè)錯(cuò)誤。常用語(yǔ)句:Dim d Set d = CreateObject("Scripting.Dictionary")
15、 d.Add "a", "Athens" d.Add "b", "Belgrade" d.Add "c", "Cairo" d.Remove(“b”)代碼詳解1、d.Remove(“b”):清除字典中”b”關(guān)鍵字和與它對(duì)應(yīng)的項(xiàng)。清除之后,現(xiàn)在字典里只有2個(gè)關(guān)鍵字了。RemoveAll方法RemoveAll 方法從一個(gè) Dictionary 對(duì)象中清除所有的關(guān)鍵字,項(xiàng)目對(duì)。object.RemoveAll( )其中 object 總是一個(gè) Dictionary 對(duì)象的名稱。常用
16、語(yǔ)句:Dim d Set d = CreateObject("Scripting.Dictionary") d.Add "a", "Athens" d.Add "b", "Belgrade" d.Add "c", "Cairo" d.RemoveAll代碼詳解1、d.RemoveAll:清除字典中所有的數(shù)據(jù)。也就是清空這字典,然后可以添加新的關(guān)鍵字和項(xiàng),形成一本新字典。字典對(duì)象的屬性有4個(gè):Count屬性、Key屬性、Item屬性、CompareMode屬
17、性。Count屬性返回一個(gè)Dictionary 對(duì)象中的項(xiàng)目數(shù)。只讀屬性。object.Count其中 object一個(gè)字典對(duì)象的名稱。常用語(yǔ)句:Dim d,n% Set d = CreateObject("Scripting.Dictionary") d.Add "a", "Athens" d.Add "b", "Belgrade" d.Add "c", "Cairo" n = d.Count代碼詳解1、Dim d, n% :聲明變量,d見(jiàn)前例;n被聲明
18、為整型數(shù)據(jù)類型(Integer)。一般寫法為Dim n As Integer 。 Integer 的類型聲明字符為百分比號(hào) (%)。2、n = d.Count :把字典中所有的關(guān)鍵字的數(shù)量賦給變量n。本例得到的是3。Key屬性在 Dictionary 對(duì)象中設(shè)置一個(gè) key。object.Key(key) = newkey參數(shù):object 必選項(xiàng)??偸且粋€(gè)字典 (Dictionary) 對(duì)象的名稱。 key 必選項(xiàng)。被改變的 key 值。 newkey 必選項(xiàng)。替換所指定的 key 的新值。 說(shuō)明如果在改變一個(gè) key 時(shí)沒(méi)有發(fā)現(xiàn)該 key,那么將創(chuàng)建一個(gè)新的 key 并且其相關(guān)聯(lián)的 ite
19、m 被設(shè)置為空。常用語(yǔ)句:Dim d Set d = CreateObject("Scripting.Dictionary") d.Add "a", "Athens" d.Add "b", "Belgrade" d.Add "c", "Cairo" d.Key("c") = "d" 代碼詳解1、d.Key("c") = "d" :用新的關(guān)鍵字”d”來(lái)替換指定的關(guān)鍵字”c”,這時(shí)
20、,字典中就沒(méi)有關(guān)鍵字c了,只有關(guān)鍵字d了,與d對(duì)應(yīng)的項(xiàng)是”Cairo”。 Item屬性在一個(gè) Dictionary 對(duì)象中設(shè)置或者返回所指定 key 的 item。對(duì)于集合則根據(jù)所指定的 key 返回一個(gè) item。讀/寫。object.Item(key) = newitem參數(shù)object 必選項(xiàng)??偸且粋€(gè)Dictionary 對(duì)象的名稱。 key 必選項(xiàng)。與要被查找或添加的 item 相關(guān)聯(lián)的 key。 newitem 可選項(xiàng)。僅適用于 Dictionary 對(duì)象;newitem 就是與所指定的 key 相關(guān)聯(lián)的新值。 說(shuō)明如果在改變一個(gè) key 的時(shí)候沒(méi)有找到該 item,那么將利用所指
21、定的 newitem 創(chuàng)建一個(gè)新的 key。如果在試圖返回一個(gè)已有項(xiàng)目的時(shí)候沒(méi)有找到 key,那么將創(chuàng)建一個(gè)新的 key 且其相關(guān)的項(xiàng)目被設(shè)置為空。常用語(yǔ)句:Dim d Set d = CreateObject("Scripting.Dictionary") d.Add "a", "Athens" d.Add "b", "Belgrade" d.Add "c", "Cairo" MsgBox d.Item("c") 代碼詳解1、d.It
22、em("c") :獲取指定的關(guān)鍵字”c”對(duì)應(yīng)的項(xiàng)。 2、MsgBox :是一個(gè)VBA函數(shù),用消息框顯示。如果要詳細(xì)了解MsgBox函數(shù)的,可參見(jiàn)我的另一篇文章“常用VBA函數(shù)精選合集”。CompareMode屬性設(shè)置或者返回在 Dictionary 對(duì)象中進(jìn)行字符串關(guān)鍵字比較時(shí)所使用的比較模式。object.CompareMode = compare參數(shù)object 必選項(xiàng)??偸且粋€(gè) Dictionary 對(duì)象的名稱。 compare 可選項(xiàng)。如果提供了此項(xiàng),compare 就是一個(gè)代表比較模式的值。可以使用的值是 0 (二進(jìn)制)、1 (文本), 2 (數(shù)據(jù)庫(kù))。 說(shuō)明如果
23、試圖改變一個(gè)已經(jīng)包含有數(shù)據(jù)的 Dictionary 對(duì)象的比較模式,那么將導(dǎo)致一個(gè)錯(cuò)誤。常用語(yǔ)句:Dim d Set d = CreateObject("Scripting.Dictionary") d.CompareMode = vbTextCompare d.Add "a", "Athens" d.Add "b", "Belgrade" d.Add "c", "Cairo" d.Add " B ", " Baltimore
24、"代碼詳解1、d.CompareMode = vbTextCompare :設(shè)置字典的比較模式是文本,在這種比較模式下不區(qū)分關(guān)鍵字的大小寫,即關(guān)鍵字”b”和”B”是一樣的。vbTextCompare的值為1,所以上式也可寫為 d.CompareMode =1 。如果設(shè)置為vbBinaryCompare(值為0),則執(zhí)行二進(jìn)制比較,即區(qū)分關(guān)鍵字的大小寫,此種情況下關(guān)鍵字”b”和”B”被認(rèn)為是不一樣的。2、d.Add " B ", " Baltimore" :添加一關(guān)鍵字”B”和對(duì)應(yīng)于它的項(xiàng)”Baltimore”。由于前面已經(jīng)設(shè)置了比較模式為文本模
25、式,不區(qū)分關(guān)鍵字的大小寫,即關(guān)鍵字”b”和”B”是一樣的,此時(shí)發(fā)生錯(cuò)誤添加失敗,因?yàn)樽值渲幸呀?jīng)存在”b”了,字典中的關(guān)鍵字是唯一的,不能添加重復(fù)的關(guān)鍵字。實(shí)例1 普通常見(jiàn)的求不重復(fù)值問(wèn)題一、問(wèn)題的提出:表格中人員有很多是重復(fù)的,要求編寫一段代碼,把重復(fù)的人員姓名以及重復(fù)的次數(shù)求出來(lái),復(fù)制到另一個(gè)表格中。如圖實(shí)例11所示。論壇網(wǎng)址:圖 實(shí)例1-1 二、代碼:Sub cfz()Dim i&, Myr&, ArrDim d, k, tSet d = CreateObject("Scripting.Dictionary")Myr = Sheet1.a65536.En
26、d(xlUp).RowArr = Sheet1.Range("a1:g" & Myr)For i = 2 To UBound(Arr) d(Arr(i, 3) = d(Arr(i, 3) + 1Nextk = d.keyst = d.itemsSheet2.Activatea2.Resize(d.Count, 1) = Application.Transpose(k)b2.Resize(d.Count, 1) = Application.Transpose(t)a1.Resize(1, 2) = Array("姓名", "重復(fù)個(gè)數(shù)&qu
27、ot;)Set d = NothingEnd Sub三、代碼詳解1、Dim i&, Myr&, Arr :變量i和Myr聲明為長(zhǎng)整型變量。 也可以寫為 Dim Myr As Long 。Long 的類型聲明字符為(&)。Arr后面沒(méi)有寫明數(shù)據(jù)類型,默認(rèn)就是可變型數(shù)據(jù)類型(Variant)。2、Set d = CreateObject("Scripting.Dictionary"):創(chuàng)建字典對(duì)象,并把字典對(duì)象賦給變量d。這是最常用的一句代碼。所謂的“后期綁定”。用了這句代碼就不用先引用c:windowssystem32scrrun.dll了。3、Myr
28、 = Sheet1.a65536.End(xlUp).Row :把表1的A列最后一行不為空白的行數(shù)賦給變量Myr。這里用了Range對(duì)象的End屬性,它有4個(gè)方向參數(shù),此處的xlUp表示向上,它的值為3,所以也可寫成End(3)。xlDown表示向下,它的值為4;xlToLeft表示向左,它的值為1;xlToRight表示向右,它的值為2。4、Arr = Sheet1.Range("a1:g" & Myr):把表1的A1到G列最后一行不為空白的 單元格區(qū)域的值賦給變量Arr。這樣Arr就是個(gè)二維數(shù)組了,用數(shù)組替代單元格引用可對(duì)執(zhí)行代碼的速度提高很多很多。5、For
29、i = 2 To UBound(Arr) :ForNext循環(huán)結(jié)構(gòu),從2開始到數(shù)組的最大上界值之間循環(huán)。因?yàn)閿?shù)組的第一行是表頭。Ubound是VBA函數(shù),返回?cái)?shù)組的指定維數(shù)的最大可用上界。6、d(Arr(i, 3) = d(Arr(i, 3) + 1 :Arr(i,3)在本例是姓名列,也就是關(guān)鍵字列,舉個(gè)例子,假如Arr(i,3)=”張三”,這句代碼的意思就是把關(guān)鍵字”張三”加入字典,d(key)等于關(guān)鍵字key對(duì)應(yīng)的項(xiàng),每出現(xiàn)一次這個(gè)關(guān)鍵字,它的項(xiàng)的值就增加1。起到了按關(guān)鍵字累加的作用,也正因?yàn)橛羞@個(gè)作用,所以可使用字典來(lái)進(jìn)行各種匯總統(tǒng)計(jì)。后面要講的實(shí)例會(huì)充分的展現(xiàn)這個(gè)作用。7、k=d.ke
30、ys :把字典d中存在的所有的關(guān)鍵字賦給變量k。得到的是一個(gè)一維數(shù)組,下限為0,上限為d.Count-1。Keys是字典的方法,前面已經(jīng)講過(guò)了。8、t=d.items :把字典d中存在的所有的關(guān)鍵字對(duì)應(yīng)的項(xiàng)賦給變量t。得到的也是一個(gè)一維數(shù)組,下限為0,上限為d.Count-1。Items也是字典的方法,前面也已經(jīng)講過(guò)了。9、Sheet2.Activate :激活表2。10、a2.Resize(d.Count, 1) = Application.Transpose(k) :把字典d中所有的關(guān)鍵字賦給以a2單元格開始的單元格區(qū)域中。詳細(xì)的解釋請(qǐng)見(jiàn)前面的keys方法一節(jié)。11、b2.Resize(d
31、.Count, 1) = Application.Transpose(t) :把字典d中所有的關(guān)鍵字對(duì)應(yīng)的項(xiàng)賦給以b2單元格開始的單元格區(qū)域中。12、a1.Resize(1, 2) = Array("姓名", "重復(fù)個(gè)數(shù)") :Array是一個(gè)VBA函數(shù),返回一個(gè)下界為0的一維數(shù)組。一維數(shù)組可以看作是水平排列的,所以賦值給水平的單元格區(qū)域不需要用轉(zhuǎn)置函數(shù)了。這里作為表頭一次性輸入。13、Set d = Nothing :釋放字典內(nèi)存。代碼執(zhí)行后如圖實(shí)例1-2所示。圖 實(shí)例1-2 實(shí)例2 求多表的不重復(fù)值問(wèn)題一、問(wèn)題的提出:一工作簿里面有3張工作表上,每張
32、表格的A列都是姓名列,所有這些姓名中有些是重復(fù)的,要求編寫一段代碼,在另一個(gè)工作表上顯示不重復(fù)的姓名。如圖實(shí)例21所示。圖 實(shí)例2-1 這個(gè)問(wèn)題也很適合用字典來(lái)解決。代碼如下:二、代碼:Sub bcfz()Dim i&, Myr&, ArrDim d, k, t, Sht As WorksheetSet d = CreateObject("Scripting.Dictionary")For Each Sht In Sheets If Sht.Name <> "Sheet4" Then Myr = Sht.a65536.End(
33、xlUp).Row Arr = Sht.Range("a2:a" & Myr) For i = 1 To UBound(Arr) d(Arr(i, 1) = "" Next End IfNextk = d.keysSheet4.a3.Resize(d.Count, 1) = Application.Transpose(k)Set d = NothingEnd Sub三、代碼詳解1、For Each Sht In Sheets :For EachNext循環(huán)結(jié)構(gòu),這種形式是VBA特有的,用于對(duì)對(duì)象的循環(huán)非常適用。意思是在所有的工作表中依次循環(huán)。2、
34、If Sht.Name <> "Sheet4" Then :如果這個(gè)工作表的名字不等于”Sheet4”時(shí)執(zhí)行下面的代碼。3、Myr = Sht.a65536.End(xlUp).Row :求得這個(gè)工作表A列有數(shù)據(jù)的最后一行的行數(shù),把它賦給變量Myr。這里用了長(zhǎng)整型數(shù)據(jù)類型(Long),數(shù)據(jù)范圍最大可到2,147,483,647,是為了避免數(shù)據(jù)很多的時(shí)候會(huì)超出整型數(shù)據(jù)類型(Integer)而出錯(cuò),因?yàn)檎蛿?shù)據(jù)類型數(shù)據(jù)范圍最大只到32,767。4、Arr = Sht.Range("a2:a" & Myr) :把A列數(shù)據(jù)賦給數(shù)組Arr。5、
35、For i = 1 To UBound(Arr) :ForNext循環(huán)結(jié)構(gòu),從1開始到數(shù)組的最大上限值之間循環(huán)。Ubound是VBA函數(shù),返回?cái)?shù)組的指定維數(shù)的最大值。6、d(Arr(i, 1) = “” :這句代碼的意思就是把關(guān)鍵字Arr(i,1)加入字典,關(guān)鍵字對(duì)應(yīng)的項(xiàng)為空,相當(dāng)于字典中的這個(gè)關(guān)鍵字沒(méi)有解釋。和d.Add Arr(i,1), ""的效果相同,只是代碼更簡(jiǎn)潔一些。7、k=d.keys :把字典d中存在的所有的關(guān)鍵字賦給變量k。得到的是一個(gè)一維數(shù)組,下限為0,上限為d.Count-1。Keys是字典的方法,前面已經(jīng)講過(guò)了。8、Sheet4.a3 .Resize
36、(d.Count, 1) = Application.Transpose(k) :把字典d中所有的關(guān)鍵字賦給表4以a3單元格開始的單元格區(qū)域中。代碼執(zhí)行后如圖實(shí)例2-2所示。圖 實(shí)例2-2 實(shí)例3 A列中顯示1 1000中被6除余1和余5 的數(shù)字一、問(wèn)題的提出:有1、2、31000一千個(gè)數(shù)字,要求編寫一段代碼,在工作表的A列顯示這些數(shù)被6除余1和余5的數(shù)字。二、代碼:Sub 余1余5() by:狼版主Dim dic As Object, i As Long, arrSet dic = CreateObject("Scripting.Dictionary")For i = 1
37、 To 1000dic.Add i & IIf(Abs(i Mod 6 - 3) = 2, "", ""), ""Nextarr = WorksheetFunction.Transpose(Filter(dic.keys, "")a1.Resize(UBound(arr), 1) = arra:a.Replace "", ""Set dic = NothingEnd Sub三、代碼詳解1、Dim dic As Object, i As Long, arr :也可把字典
38、變量dic聲明為對(duì)象(Object),i As Long是規(guī)范的寫法,也可寫成i& 。2、dic.Add i & IIf(Abs(i Mod 6 - 3) = 2, "", ""), "" :這句代碼的內(nèi)容比較多,用了兩個(gè)VBA函數(shù)IIf和Abs,用了一個(gè)Mod運(yùn)算符。i Mod 6就是每一個(gè)數(shù)除6的余數(shù),題目中有兩個(gè)要求:余1和與5,為了從1到1000都同時(shí)能滿足這兩個(gè)要求,所以用了Abs(i Mod 6 - 3) = 2 ,Abs是取絕對(duì)值函數(shù)。另一個(gè)VBA函數(shù)IIf是根據(jù)判斷條件返回結(jié)果,和IfThen判斷結(jié)果類
39、似;IIf(Abs(i Mod 6 - 3) = 2, "", "") 這段的意思是如果符合判斷條件,返回”否則返回空”。 i & IIf(Abs(i Mod 6 - 3) = 2, "", "")的意思是把這個(gè)數(shù)與”或者”連起來(lái)作為關(guān)鍵字加入字典dic,關(guān)鍵字相對(duì)應(yīng)的項(xiàng)為空。比如當(dāng)i=1時(shí),1是滿足上述表達(dá)式的,就把”1” 作為關(guān)鍵字加入字典dic;當(dāng)i=2時(shí),2不滿足上述表達(dá)式,就把”2” 作為關(guān)鍵字加入字典dic,關(guān)鍵字相對(duì)應(yīng)的項(xiàng)都為空。3、arr = WorksheetFunction.Transp
40、ose(Filter(dic.keys, "") :這句代碼的內(nèi)容分為3部分,第1部分是Filter(dic.keys, "") 其中的Filter是一個(gè)VBA函數(shù),VBA函數(shù)就是可以直接在代碼中使用的,我們平常使用的函數(shù)叫工作表函數(shù),如Sum、Sumif、Transpose等等。Filter函數(shù)要求在一維數(shù)組中篩選出符合條件的另一個(gè)一維數(shù)組,式中的dic.keys正是一個(gè)一維數(shù)組。這里的篩選條件是”,也就是把字典關(guān)鍵字中含有的關(guān)鍵字篩選出來(lái)組成一個(gè)新的一維數(shù)組,其下標(biāo)從零開始。第2部分是用工作表函數(shù)Transpose轉(zhuǎn)置這個(gè)新的一維數(shù)組,工作表函數(shù)的使
41、用在前面keys方法一節(jié)已經(jīng)說(shuō)過(guò)了;第2部分是把轉(zhuǎn)置以后的值賦給數(shù)組變量Arr。呵呵,狼版主的代碼是短了,我的解釋卻太長(zhǎng)了。4、a1.Resize(UBound(arr), 1) = arr :把數(shù)組Arr賦給a1單元格開始的區(qū)域中。5、a:a.Replace "", "" :把A列中的所有的都替換為空白,只剩下數(shù)字了。代碼詳解的4代碼執(zhí)行后,如圖實(shí)例3-1所示。圖實(shí)例3-1 示例代碼全部執(zhí)行后如圖實(shí)例3-2所示。圖實(shí)例3-2 示例實(shí)例4 拆分?jǐn)?shù)據(jù)不重復(fù)一、問(wèn)題的提出:有一列各種手機(jī)品牌型號(hào)的數(shù)據(jù),要求編寫一段代碼,按照品牌劃分成沒(méi)有重復(fù)數(shù)據(jù)的三大類。二
42、、代碼:Sub caifen()Dim Myr&, Arr, x&Dim d, d1, d2, i&, j&Set d = CreateObject("Scripting.Dictionary")Set d1 = CreateObject("Scripting.Dictionary")Set d2 = CreateObject("Scripting.Dictionary")Myr = a65536.End(xlUp).RowArr = Range("a2:a" & Myr)R
43、ange("c2:e" & Myr).ClearContentsmy = Array("MOTO", "諾基亞", "三星", "索愛(ài)")gc = Array("OPPO", "聯(lián)想", "天語(yǔ)", "金立", "步步高", "波導(dǎo)", "TCL", "酷派")For x = 1 To UBound(Arr) For i = 0
44、To UBound(my) If InStr(Arr(x, 1), my(i) > 0 Then d(Arr(x, 1) = "" GoTo 100 End If Next i For j = 0 To UBound(gc) If InStr(Arr(x, 1), gc(j) > 0 Then d1(Arr(x, 1) = "" GoTo 100 End If Next j d2(Arr(x, 1) = ""100:Next xRange("c2").Resize(UBound(d.keys) + 1,
45、 1) = Application.Transpose(d.keys)Range("d2").Resize(UBound(d1.keys) + 1, 1) = Application.Transpose(d1.keys)Range("e2").Resize(UBound(d2.keys) + 1, 1) = Application.Transpose(d2.keys)End Sub 三、代碼詳解1、Set d2 = CreateObject("Scripting.Dictionary") :針對(duì)三個(gè)不同的種類,創(chuàng)建d、d1、d2三個(gè)字
46、典對(duì)象。2、Myr = a65536.End(xlUp).Row :把A列最后一行不為空白的行數(shù)賦給變量Myr。3、Arr = Range("a2:a" & Myr) :把A2開始的有數(shù)據(jù)的單元格區(qū)域賦給變量Arr。4、Range("c2:e" & Myr).ClearContents :把C2到E列單元格區(qū)域清空。5、my = Array("MOTO", "諾基亞", "三星", "索愛(ài)") :VBA函數(shù)Array返回一個(gè)一維數(shù)組,默認(rèn)下界為0。把Array
47、函數(shù)返回的數(shù)組賦給變量my(貿(mào)易兩漢字的首字母)。6、gc = Array("OPPO", "聯(lián)想", "天語(yǔ)", "金立", "步步高", "波導(dǎo)", "TCL", "酷派") :把Array函數(shù)返回的數(shù)組賦給變量gc(國(guó)產(chǎn)兩漢字的首字母)。7、For x = 1 To UBound(Arr) :在A列原始數(shù)據(jù)的數(shù)組中逐一循環(huán)。8、For i = 0 To UBound(my) :在my數(shù)組中逐一循環(huán)。因?yàn)橛?個(gè)貿(mào)易機(jī)品牌,所以用循環(huán)
48、每一個(gè)與原始數(shù)據(jù)比較。9、If InStr(Arr(x, 1), my(i) > 0 Then :VBA函數(shù)Instr返回在第1個(gè)參數(shù)中查找的位置,如果返回結(jié)果0,表示在第1個(gè)參數(shù)中沒(méi)有第2個(gè)參數(shù)存在。本句的意思是如果找到貿(mào)易機(jī)品牌的話,執(zhí)行下面的代碼。10、d1(Arr(x, 1) = "" :接上句,如果上面判斷成立,就把Arr(x, 1)加入字典d。11、GoTo 100 :Goto語(yǔ)句用于無(wú)條件地轉(zhuǎn)移到過(guò)程中指定的行。這里采用跳出For i循環(huán),一是為了減少循環(huán)的次數(shù),比如"MOTO"找到的話,后面3個(gè)就不需要找了;二是為了跳過(guò)兩個(gè)小循環(huán)之
49、后的其它品牌加入第3個(gè)字典的d2(Arr(x, 1) = ""語(yǔ)句。12、For j循環(huán)與上面相同,為了判斷得到國(guó)產(chǎn)機(jī)類的字典d1。13、d2(Arr(x, 1) = "" :如果上述兩個(gè)小循環(huán)都不滿足,那么就加入其它品牌類字典里。14、Range("c2").Resize(UBound(d.keys) + 1, 1) = Application.Transpose(d.keys) :最后的3句分別把字典的關(guān)鍵字?jǐn)?shù)組轉(zhuǎn)置后賦給相應(yīng)的單元格區(qū)域。代碼執(zhí)行后如圖實(shí)例4-1所示。圖 實(shí)例4-1 示例山菊花版主用了一個(gè)字典對(duì)象就解決了上述問(wèn)題
50、。讓我們來(lái)學(xué)習(xí)一下。四、山菊花版主的代碼:Sub 拆分() Dim pp1$, pp2$, nRow%, ds, Brr(), s(1 To 3) As Integer Set ds = CreateObject("scripting.dictionary") pp1 = Join(WorksheetFunction.Transpose(Range(Range("g2"), Range("g1").End(xlDown), ",") pp2 = Join(WorksheetFunction.Transpose(Ra
51、nge(Range("h2"), Range("h1").End(xlDown), ",") nRow = Range("a1").End(xlDown).Row Arr = Range("a1:a" & nRow) ReDim Brr(1 To nRow, 1 To 3) For i = 2 To nRow If Not ds.Exists(Arr(i, 1) Then ds(Arr(i, 1) = "" If pp1 Like "*" &
52、; Left(Arr(i, 1), 2) & "*" Then s(1) = s(1) + 1 Brr(s(1), 1) = Arr(i, 1) ElseIf pp2 Like "*" & Left(Arr(i, 1), 2) & "*" Then s(2) = s(2) + 1 Brr(s(2), 2) = Arr(i, 1) Else s(3) = s(3) + 1 Brr(s(3), 3) = Arr(i, 1) End If End If Next Range("c2:e" &
53、; nRow) = BrrEnd Sub五、代碼詳解1、pp1 = Join(WorksheetFunction.Transpose(Range(Range("g2"), _ Range("g1").End(xlDown), ",") :這句代碼用了兩個(gè)VBA函數(shù)Join 和Transpose ,Range("g1").End(xlDown)從G1單元格往下直到最下面的單元格,遇到空白格就停止。因?yàn)楸纠腉14、G15單元格有 另外的數(shù)據(jù)存在,如果還是用Range("g65536").End(x
54、lUp),那么就會(huì)把不需要的數(shù)據(jù)帶進(jìn)去,造成結(jié)果出錯(cuò)。Transpose 轉(zhuǎn)置函數(shù),前面已經(jīng)介紹過(guò)了。Join函數(shù)是通過(guò)連接某個(gè)數(shù)組中的多個(gè)子字符串而創(chuàng)建的一個(gè)字符串,本句代碼執(zhí)行后得到pp1="MOTO, 諾基亞, 三星, 索愛(ài)"。pp2一句同上句一樣,得到另一個(gè)字符串。2、nRow = Range("a1").End(xlDown).Row :把A列最后一行不為空白的行數(shù)賦給整型變量nRow。3、Arr = Range("a1:a" & nRow) :把A列A1開始的有數(shù)據(jù)的單元格區(qū)域賦給變量Arr。4、ReDim Brr
55、(1 To nRow, 1 To 3) :用于為動(dòng)態(tài)數(shù)組變量Brr重新分配存儲(chǔ)空間。第一維的下界從1到上界nRow,第二維從1到3。5、For i = 2 To nRow :從2到 nRow逐一循環(huán)。6、If Not ds.Exists(Arr(i, 1) Then :如果字典ds中不存在關(guān)鍵字Arr(i, 1) 7、ds(Arr(i, 1) = "" :把Arr(i, 1)作為關(guān)鍵字加入字典ds。8、If pp1 Like "*" & Left(Arr(i, 1), 2) & "*" Then :這里山版主用了比較運(yùn)
56、算符Like來(lái)比較pp1和取自Arr(i, 1)左邊兩個(gè)字符,再在前后加任意字符組成的字符串,如果滿足條件為真,那么執(zhí)行下面的語(yǔ)句。9、s(1) = s(1) + 1 :數(shù)組s的第一個(gè)元素+1以后賦給數(shù)組s的第一個(gè)元素。10、Brr(s(1), 1) = Arr(i, 1) :把這個(gè)關(guān)鍵字賦給第2維為1的另一個(gè)數(shù)組Brr,也就是我們要求的貿(mào)易機(jī)類。pp1字符串里都是貿(mào)易機(jī)類的品牌。11、ElseIf pp2 Like "*" & Left(Arr(i, 1), 2) & "*" Then :同樣,如果滿足國(guó)產(chǎn)品牌類這個(gè)條件,那么執(zhí)行下面的
57、代碼。12、s(2) = s(2) + 1 :數(shù)組s的第二個(gè)元素+1以后賦給數(shù)組s的第二個(gè)元素。13、Brr(s(2), 2) = Arr(i, 1) :把這個(gè)關(guān)鍵字賦給第2維為2的另一個(gè)數(shù)組Brr,也就是我們要求的國(guó)產(chǎn)品牌類。pp2字符串里都是國(guó)產(chǎn)品牌類的品牌。14、s(3) = s(3) + 1 :前如果條件都不滿足時(shí),數(shù)組s的第三個(gè)元素+1以后賦給數(shù)組s的第三個(gè)元素。15、Brr(s(3), 3) = Arr(i, 1) :把這個(gè)關(guān)鍵字賦給第3維為1的另一個(gè)數(shù)組Brr,也就是我們要求的其它品牌類。16、Range("c2:e" & nRow) = Brr :把
58、數(shù)組Brr賦給c2單元格開始的區(qū)域中。實(shí)例5 前期綁定的字典實(shí)例一、問(wèn)題的提出:有多列多行數(shù)據(jù),其中有重復(fù)的行,要求編寫一段代碼,求得不重復(fù)的行數(shù)據(jù)。如圖實(shí)例5-1所示。圖 實(shí)例5-1 示例二、代碼:Sub 保留原數(shù)據(jù)() by:ldy888前期綁定,需先引用c:windowssystem32scrrun.dll Dim d As New Dictionary,t For i = 2 To 5 Set d(Cells(i, 1) & "") = Range(Cells(i, 1), Cells(i, 4)Nextt=d.itemsA11.Resize(d.Count
59、, 4) = Application.Transpose(Application.Transpose(t)End Sub三、代碼詳解1、Dim d As New Dictionary, t :本段代碼需要先引用微軟的腳本運(yùn)行時(shí)庫(kù)Microsoft Scripting Runtime,可在VBE窗口,從菜單工具引用,然后勾選Microsoft Scripting Runtime,或者點(diǎn)擊瀏覽,在添加引用對(duì)話框中選擇c:windowssystem32scrrun.dll,并打開,確定。完成引用。在本聲明語(yǔ)句中把字典d聲明為New Dictionary。這就是”前期綁定”了。上面的實(shí)例用的是創(chuàng)建對(duì)象
60、語(yǔ)句:Set d = CreateObject("Scripting.Dictionary"),稱為”后期綁定”。不需要先引用腳本運(yùn)行時(shí)庫(kù)。2、Set d(Cells(i, 1) & "") = Range(Cells(i, 1), Cells(i, 4) :把單元格對(duì)象加入字典,它對(duì)應(yīng)的項(xiàng)是同一行的單元格區(qū)域。注意,這里用了Set,和前面的幾例不一樣哦。如果用Typename(d(Cells(i, 1) & ""),得到的是一個(gè)Range對(duì)象。這里的Cells(i, 1) & ""也可以用
61、Cells(i, 1).Value來(lái)代替。3、t=d.items :把字典d中存在的所有的關(guān)鍵字對(duì)應(yīng)的項(xiàng)賦給變量t。得到的是一個(gè)一維數(shù)組,下限為0,上限為d.Count-1。4、A11.Resize(d.Count, 4) = Application.Transpose(Application.Transpose(t) :這句用了兩次工作表轉(zhuǎn)置函數(shù)Transpose之后賦給A11單元格開始的區(qū)域中。代碼執(zhí)行后如圖實(shí)例5-2所示。圖 實(shí)例5-2示例實(shí)例6 多條件復(fù)雜匯總一、問(wèn)題的提出:有一個(gè)表格,需要對(duì)其中多個(gè)條件相同的數(shù)量進(jìn)行合并匯總,并且要有匯總的明細(xì)數(shù)據(jù),要求編寫一段代碼,實(shí)現(xiàn)這樣的合并同
62、類項(xiàng)的要求。二、代碼:Sub kf2() by:oobirdDim d As Object, a, b, j%, w!Dim ss$, n%, xMe.UsedRange.Offset(3, 0) = ""a = Sheet1.Range(Sheet1.a4, Sheet1.i65536.End(xlUp)Set d = CreateObject("scripting.dictionary")ReDim b(1 To UBound(a), 1 To 8)For i = 1 To UBound(a)ss = a(i, 1) & a(i, 2) & a(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第五單元寫作《論證要合理》教學(xué)設(shè)計(jì)-2024-2025學(xué)年統(tǒng)編版語(yǔ)文九年級(jí)上冊(cè)
- 2025年商用半導(dǎo)體項(xiàng)目合作計(jì)劃書
- 機(jī)械原理 CH11學(xué)習(xí)資料
- 第16課 越算越精彩 教學(xué)設(shè)計(jì) 2024-2025學(xué)年粵教版(2019)初中信息技術(shù)八年級(jí)上冊(cè)
- 老舊小區(qū)基礎(chǔ)配套設(shè)施改造風(fēng)險(xiǎn)評(píng)估與控制
- 第三單元整體教學(xué)設(shè)計(jì)《生命的詩(shī)意》教學(xué)設(shè)計(jì) 2024-2025學(xué)年統(tǒng)編版高中語(yǔ)文必修上冊(cè)
- Unit 1 Animal friends Section B project 教學(xué)設(shè)計(jì) 2024-2025學(xué)年人教版(2024)七年級(jí)英語(yǔ)下冊(cè)
- 2025年甘肅省武威地區(qū)單招職業(yè)傾向性測(cè)試題庫(kù)含答案
- 二零二五幼兒園教師侵權(quán)賠償協(xié)議書模板
- 二零二五年度電商平臺(tái)商家銷售返利合同
- 盆景造型經(jīng)驗(yàn)
- 2023年廣東省佛山市順德區(qū)小升初數(shù)學(xué)試卷(含答案)
- ICU護(hù)理查房記錄【范本模板】
- 威風(fēng)堂堂進(jìn)行曲
- 銅及銅合金物理冶金基礎(chǔ)-黃銅
- 煤礦信息化管理制度
- 金融科技學(xué)-完整全套課件
- 物理學(xué)史中國(guó)古代物理學(xué)
- 導(dǎo)管滑脫應(yīng)急預(yù)案演練住院患者導(dǎo)尿管道滑脫
- (完整)小學(xué)語(yǔ)文考試專用作文方格紙
- 軟考中級(jí)網(wǎng)絡(luò)工程師學(xué)習(xí)筆記(考點(diǎn)歸納總結(jié)全)
評(píng)論
0/150
提交評(píng)論