




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、VBA 字典用法集錦及案例代碼詳解dada字典的簡介9刖百凡是上過學校的人都使用過字典,從新華字典、成語詞典,到英漢字典以及各種各 樣數(shù)不勝數(shù)的專業(yè)字典,字典是上學必備的、經(jīng)常查閱的工具書。有了它們,我們可以 很方便的通過查找某個關鍵字,進而查到這個關鍵字的種種解釋,非??旖輰嵱?。凡是上過EH論壇的想學習 VBA 里面字典用法的,幾乎都看過研究過 northwolves狼版主、oobird版主的有關字典的精華貼和經(jīng)典代碼。我也是從這里接觸 到和學習到字典的,在此,對他們表示深深的謝意,同時也對很多把字典用得出神入化 的高手們致敬,從他們那里我們也學到了很多,也得到了提高。字典對象只有4個屬,f
2、和6個方法,相對其它的對象要簡潔得多,而且容易理解使用方便,功能強大,運行速度非???,效率極高。深受大家的喜愛。本文希望通過對一些字典應用的典型實例的代碼的詳細解釋來給初次接觸字典和想 要進一步了解字典用法的朋友提供一點備查的參考資料,希望大家能喜歡。給代碼注釋估計是大家都怕做的,因為往往是出力不討好的,稍不留神或者自己確 實理解得不對,還會貽誤他人。所以下面的這些注釋如果有不對或者不妥當?shù)牡胤?,?大家跟帖時指正批評,及時改正。字典的簡介字典(Dictionary )對象是微軟 Windows腳本語言中的一個很有用的對象。附帶提一下,有名的正則表達式( RegExp)對象和能方便處理驅動器、
3、文件夾和文件 的()對象也是微軟 Windows腳本語言中的一份子。字典對象相當于一種聯(lián)合數(shù)組,它是由具有唯一性的關鍵字(Key)和它的項(Item)聯(lián)合組成。就好像一本字典書一樣,是由很多生字和對它們對應的注解所組成。比如字典的“典”字的解釋是這樣的:擊V名A倍小早管二字就,上H3.別-字,=宜是尢率父:芻要的文賦.奧助m云乂 加化di a: an dare虹怔la聞ip d的士忙町玨.丑彎之苦世工芭乩白.丈前也.一用瓦P . 土懣以就認上江文法餐也.一一 4三程年三元就*孟里,- I:蘭是修討三禁、亙弱.八尢E. :全神-里士十二立誤苫之主強r -.主虧0 a十二隼F二一更,殼具比郭;三身
4、二一一三里士序慎之書三二忠M媼未-.7;手中;“典”字就是具有唯一性的關鍵字,后面的解釋就是它的項,和“典”字聯(lián)合組成一對 數(shù)據(jù)。常用關鍵字英漢對照:DictionaryKey Item字典關鍵字項,或者譯為條目字典對象的方法有6個:Add方法、Keys方法、Items方法、Exists方法、Remove 方法、RemoveAll 方法。Add方法向Dictionary對象中添加一個關鍵字項目對。object.Add (key, item)參數(shù)object必選項??偸且粋€Dictionary對象的名稱。key必選項。與被添加的item相關聯(lián)的key。item必選項。與被添加的key相關聯(lián)的it
5、em。說明如果key已經(jīng)存在,那么將導致一個錯誤。常用語句:Dim dSet d = CreateObject("Scripting.Dictionary")d.Add "a", "Athens"d.Add "b", "Belgrade"d.Add "c", "Cairo"代碼詳解1、Dim d :創(chuàng)建變量,也稱為聲明變量。變量d聲明為可變型數(shù)據(jù)類型(Variant), d后面沒有寫數(shù)據(jù)類型,默認就是可變型數(shù)據(jù)類型(Variant)。也有寫成 Dim dA
6、s Object的,聲明為對象。2、Set d = CreateObject("Scripting.Dictionary"):創(chuàng)建字典對象,并把字典對象賦給 變量do這是最常用的一句代碼。所謂的“后期綁定” 。用了這句代碼就不用先引用c:windowssystem32scrrun.dll 了。3、d.Add "a", "Athens":添加一關鍵字"a”和對應于它的項 "Athens”。4、d.Add "b", Belgrade”:添加一關鍵字 "b"和對應于它的項 &quo
7、t;Belgrade”。5、d.Add "c", Cairo":添加一關鍵字"c”和對應于它的項"Cairo”。Exists方法如果Dictionary對象中存在所指定的關鍵字則返回true,否則返回false。object.Exists(key)參數(shù)object必選項??偸且粋€ Dictionary對象的名稱。key必選項。需要在Dictionary對象中搜索的key值。常用語句:Dim d, msg$Set d = CreateObject("Scripting.Dictionary")d.Add "a&quo
8、t;, "Athens"d.Add "b", "Belgrade"d.Add "c", "Cairo"If d.Exists("c") Thenmsg ="指定的關鍵字已經(jīng)存在。"Elsemsg ="指定的關鍵字不存在。End If代碼詳解1、Dim d, msg$ :聲明變量,d見前例;msg$聲明為字符串數(shù)據(jù)類型(String),一 般寫法為Dim msg As String。String的類型聲明字符為美元號($)。2、If d.Exist
9、s("c") Then :如果字典中存在關鍵字 "c",那么執(zhí)行下面的語句。3、msg ="指定的關鍵字已經(jīng)存在。":把"指定的關鍵字已經(jīng)存在。"字符串賦給變量msg。4、Else :否則執(zhí)行下面的語句。5、msg ="指定的關鍵字不存在。":把"指定的關鍵字不存在?!弊址x給變量 msg。6、End If :結束 If ElseEndif 判斷。Keys方法返回一個數(shù)組,其中包含了一個 Dictionary對象中的全部現(xiàn)有的關鍵字。object.Keys()其中object總是一個
10、 Dictionary 對象的名稱。常用語句:Dim d, kSet d = CreateObject("Scripting.Dictionary") d.Add "a", "Athens"d.Add "b", "Belgrade” d.Add "c", "Cairo” k=d.Keys |B1.Resize(d.Count,1)=Application.Transpose(k)代碼詳解1、Dim d, k :聲明變量,d見前例;k默認是可變型數(shù)據(jù)類型 (Variant)。2
11、、k=d.Keys :把字典中存在的所有的關鍵字賦給變量k。得到的是一個一維數(shù)組,下限為0,上限為d.Count-1。這是數(shù)組的默認形式。3、B1.Resize(d.Count,1)=Application.Transpose(k):這句代碼是很常用很經(jīng)典的 代碼,所以這里要多說一些。Resize是Range對象的一個屬性,用于調整指定區(qū)域的大小,它有兩個參數(shù),第 一個是行數(shù),本例是 d.Count,指的是字典中關鍵字的數(shù)量,整本字典中有多少個關鍵 字,本例d.Count=3,因為有3個關鍵字。呵呵,是不是說多了。第二個是列數(shù),本例是 1。這樣=左邊的意思就是:把一個單元格 B1調整為以B1
12、開始的一列單元格區(qū)域,行數(shù)等于字典中關鍵字的數(shù)量d.Count,就是把單元格 B1調整為單元格區(qū)域 B1 : B3 了。=右邊的k是個一維數(shù)組,是水平排列的,我們知道Excel工作表函數(shù)里面有個轉置函數(shù)Transpose,用它可以把水平排列的置換成豎向排列。但是在 VBA中不能直接使 用該工作表函數(shù),需要通過Application對象的WorksheetFunction屬性來使用它。所以完整的寫法是 Application. WorksheetFunction.Transpose(k),中間的 WorksheetFunction 可 省略?,F(xiàn)在可以解釋這句代碼了:把字典中所有的關鍵字賦給以B1
13、單元格開始的單元格區(qū)域中。Items方法返回一個數(shù)組,其中包含了一個Dictionary對象中的所有項目。object.Items()其中object總是一個 Dictionary 對象的名稱。常用語句:Dim d, tSet d = CreateObject("Scripting.Dictionary")d.Add "a", "Athens"d.Add "b", "Belgrade"d.Add "c", "Cairo"t=d.ItemsC1.Resize
14、(d.Count,1)=Application.Transpose(t)代碼詳解1、Dim d, t :聲明變量,d見前例;t默認是可變型數(shù)據(jù)類型 (Variant)。2、t=d.Items :把字典中所有的關鍵字對應的項賦給變量t。得到的也是一個一維數(shù)組,下限為0,上限為d.Count-1。這是數(shù)組的默認形式。3、C1.Resize(d.Count,1)=Application.Transpose:有了上面 Keys 方法的解釋這 句代碼就不用多說了,就是把字典中所有的關鍵字對應的項賦給以C1單元格開始的單元格區(qū)域中。Remove方法Remove方法從一個 Dictionary對象中清除一個
15、關鍵字,項目對。object.Remove(key )"|其中object總是一個 Dictionary 對象的名稱。key必選項。key與要從Dictionary對象中刪除的關鍵字,項目對相關聯(lián)。 說明如果所指定的關鍵字,項目對不存在,那么將導致一個錯誤。常用語句:Dim dSet d = CreateObject("Scripting.Dictionary")d.Add "a", "Athens"d.Add "b", "Belgrade"d.Add "c", &
16、quot;Cairo" d.Remove( b")代碼詳解1、d.Remove( b"):清除字典中“b"關鍵字和與它對應的項。清除之后,現(xiàn)在字典里只有2個關鍵字了。RemoveAll 方法RemoveAll方法從一個 Dictionary對象中清除所有的關鍵字,項目對。object.RemoveAll()其中object總是一個 Dictionary 對象的名稱。常用語句:Dim dSet d = CreateObject("Scripting.Dictionary")d.Add "a", "Athen
17、s"d.Add "b", "Belgrade"d.Add "c", "Cairo"d.RemoveAll代碼詳解1、d.RemoveAll :清除字典中所有的數(shù)據(jù)。也就是清空這字典,然后可以添加新 的關鍵字和項,形成一本新字典。字典對象的屬性有4個:Count屬性、Key屬性、Item屬性、CompareMode 屬性。Count屬性返回一個Dictionary對象中的項目數(shù)。只讀屬性。object.Count其中object 一個字典對象的名稱。常用語句:Dim d,n%Set d = CreateOb
18、ject("Scripting.Dictionary")d.Add "a", "Athens"d.Add "b", "Belgrade"d.Add "c", "Cairo" n = d.Count 代碼詳解1、Dim d, n% :聲明變量,d見前例;n被聲明為整型數(shù)據(jù)類型(Integer)。一般寫 法為Dim n As Integer 。 Integer的類型聲明字符為百分比號(%)。2、n = d.Count :把字典中所有的關鍵字的數(shù)量賦給變量n。本
19、例得到的是 3。Key屬性在Dictionary對象中設置一個key。object.Key(key) = newkey參數(shù):object必選項??偸且粋€字典(Dictionary)對象的名稱。key必選項。被改變的 key值。newkey必選項。替換所指定的key的新值。說明如果在改變一個 key時沒有發(fā)現(xiàn)該 key,那么將創(chuàng)建一個新的 key并且其相關聯(lián) 的item被設置為空。常用語句:Dim dSet d = CreateObject("Scripting.Dictionary")d.Add "a", "Athens"d.Add
20、"b", "Belgrade"d.Add "c", "Cairo"d.Key("c") = "d"代碼詳解1、d.Key("c") = "d":用新的關鍵字"d”來替換指定的關鍵字"c",這時,字典中就 沒有關鍵字c 了,只有關鍵字d 了,與d對應的項是"Cairo”。Item屬性在一個Dictionary對象中設置或者返回所指定key的item。對于集合則根據(jù)所指定的key返回一個item。讀/
21、寫。object.Item(key) = newitem參數(shù)object必選項??偸且粋€ Dictionary對象的名稱。key必選項。與要被查找或添加的item相關聯(lián)的key。newitem可選項。僅適用于Dictionary對象;newitem就是與所指定的key相關聯(lián)的新值。說明如果在改變一個key的時候沒有找到該item ,那么將利用所指定的newitem創(chuàng)建一個新的key。如果在試圖返回一個已有項目的時候沒有找到key,那么將創(chuàng)建一個新的key且其相關的項目被設置為空。常用語句:Dim dSet d = CreateObject("Scripting.Dictionary&
22、quot;)d.Add "a", "Athens"d.Add "b", "Belgrade"d.Add "c", "Cairo"MsgBox d.Item("c")代碼詳解1、d.Item("c"):獲取指定的關鍵字"c”對應的項。2、MsgBox :是一個 VBA函數(shù),用消息框顯示。如果要詳細了解MsgBox函數(shù)的,可參見我的另一篇文章“常用 VBA函數(shù)精選合集”。實例1普通常見的求不重復值問題CompareMode 屬性設
23、置或者返回在Dictionary對象中進行字符串關鍵字比較時所使用的比較模式。object.CompareMode = compare參數(shù)object必選項。總是一個Dictionary對象的名稱。compare可選項。如果提供了此項,compare就是一個代表比較模式的值??梢允褂玫闹凳? (二進制)、1 (文本),2 (數(shù)據(jù)庫)。說明如果試圖改變一個已經(jīng)包含有數(shù)據(jù)的Dictionary對象的比較模式,那么將導致一個錯誤。常用語句:Dim dSet d = CreateObject("Scripting.Dictionary")d.CompareMode = vbText
24、Compared.Add "a", "Athens"d.Add "b", "Belgrade" d.Add "c", "Cairo" d.Add " B ", " Baltimore" 代碼詳解1、d.CompareMode = vbTextCompare :設置字典的比較模式是文本,在這種比較 模式下不區(qū)分關鍵字的大小寫,即關鍵字"b"和"B"是一樣的。vbTextCompare的值為1,所以上
25、式也可寫為d.CompareMode =1 。如果設置為 vbBinaryCompare (值為 0),則執(zhí)行二進制比較,即區(qū)分關鍵字的大小寫,此種情況下關鍵字“b“和“B”被認為是不一樣的。2、d.Add " B ", " Baltimore":添加一關鍵字"B”和對應于它的項 "Baltimore"。由于 前面已經(jīng)設置了比較模式為文本模式,不區(qū)分關鍵字的大小寫,即關鍵字“b“和”B"是一樣的,此時發(fā)生錯誤添加失敗,因為字典中已經(jīng)存在“b”了,字典中的關鍵字是唯一的,不能添加重復的關鍵字。實例1普通常見的求不重復
26、值問題一、問題的提出:表格中人員有很多是重復的,要求編寫一段代碼,把重復的人員姓名以及重復的次 數(shù)求出來,復制到另一個表格中。如圖實例1 1所示。論壇網(wǎng)址: Wicrosoft Excel - 201 (H(H3重復總人口 1G15變件編輯視圖)插入格式工具數(shù)據(jù)窗口:幫助出i-皆及bi白L17里" .司:聞 20101013MSAn 101 S itisA2京 5120811060010180032901會會清清 彬彬彬 名炳炳貴貴靜靜蘭口二.蘭 姓白白白白白白白白白性男男男男女女男男男出生日期人員類別 蠟姻狀態(tài)1923-1-28常住棒與£初婚 1928-12-28常國參早
27、已婚 197小04/3 :常住慘與女初婚 197404-13常?。▍⑴c土初婚1976-07-061976-07-061902-0e-131982-06J31982-06-13白培玉 男197L02優(yōu)珂 白培玉 勇1971-02-09H 4 卜 H Sheetl±iiA/:跳度® 同,旨選圖形Qf) ' X O ±J常?。▍⑴c£初皤 常住手與2未婚 常住滲與女初婚 常住每與g初婚 常便凈與必初鹿 里隹慘孱干M聞C13數(shù)字就諸圖實例1-1二、代碼:Sub cfz()Dim i&, Myr&, ArrDim d, k, tSet d =
28、 CreateObject("Scripting.Dictionary")Myr = Sheet1.a65536.End(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) = Applicati
29、on.Transposea1.Resize(1, 2) = Array("姓名","重復個數(shù)")Set d = Nothing End Sub 三、代碼詳解1、Dim i&, Myr&, Arr :變量i和Myr聲明為長整型變量。也可以寫為 Dim MyrAs Long。Long的類型聲明字符為(&)。Arr后面沒有寫明數(shù)據(jù)類型,默認就是可變型 數(shù)據(jù)類型(Variant)。2、Set d = CreateObject("Scripting.Dictionary"):創(chuàng)建字典對象,并把字典對象賦給 變量do這是最
30、常用的一句代碼。所謂的“后期綁定”。用了這句代碼就不用先引用c:windowssystem32scrrun.dll 了。3、Myr = Sheet1.a65536.End(xlUp).Row :把表1的A列最后一行不為空白的行 數(shù)賦給變量 Myr。這里用了 Range對象的End屬性,它有4個方向參數(shù),此處的 xlUp 表示向上,它的值為3,所以也可寫成End(3)。xlDown表示向下,它的值為 4;xlToLeft表示向左,它的值為 1; xlToRight表示向右,它的值為 2。4、Arr = Sheet1.Range("a1:g" & Myr):把表1的A1
31、到G列最后一行不為空白的 單元格區(qū)域的值賦給變量Arr。這樣 Arr就是個二維數(shù)組了,用數(shù)組替代單元格引用可對執(zhí)行代碼的速度提高很多很多。5、For i = 2 To UBound(Arr) : ForNext循環(huán)結構,從 2開始到數(shù)組的最大上界 值之間循環(huán)。因為數(shù)組的第一行是表頭。Ubound是VBA函數(shù),返回數(shù)組的指定維數(shù)的最大可用上界。6、d(Arr(i, 3) = d(Arr(i, 3) + 1: Arr(i,3)在本例是姓名列,也就是關鍵字列,舉個例子,假如Arr(i,3)= "張三",這句代碼的意思就是把關鍵字“張三”加入字典,d(key)等于關鍵字key對應的
32、項,每出現(xiàn)一次這個關鍵字,它的項的值就增加1。起到了按關鍵字累加的作用,也正因為有這個作用,所以可使用字典來進行各種匯總統(tǒng)計。后面要講的 實例會充分的展現(xiàn)這個作用。7、k=d.keys :把字典d中存在的所有的關鍵字賦給變量k。得到的是一個一維數(shù)組,下限為0,上限為d.Count-1。Keys是字典的方法,前面已經(jīng)講過了。8、t=d.items :把字典d中存在的所有的關鍵字對應的項賦給變量t。得到的也是一個一維數(shù)組,下限為 0,上限為d.Count-1。Items也是字典的方法,前面也已經(jīng)講過 了。9、Sheet2.Activate :激活表 2。10、a2.Resize(d.Count,
33、1) = Application.Transpose(k):把字典 d 中所有的關鍵字 賦給以a2單元格開始的單元格區(qū)域中。詳細的解釋請見前面的keys方法一節(jié)。11、b2.Resize(d.Count, 1) = Application.Transpose(t):把字典 d 中所有的關鍵字對應的項賦給以b2單元格開始的單元格區(qū)域中。12、a1.Resize(1,2) = Array("姓名","重復個數(shù)"):Array 是一個 VBA 函數(shù),返回 一個下界為0的一維數(shù)組。一維數(shù)組可以看作是水平排列的,所以賦值給水平的單元格 區(qū)域不需要用轉置函數(shù)了。這里
34、作為表頭一次性輸入。13、Set d = Nothing :釋放字典內存。代碼執(zhí)行后如圖實例 1-2所示。圖實例1-2實例2求多表的不重復值問題一、問題的提出:一工作簿里面有 3張工作表上,每張表格的 A列都是姓名列,所有這些姓名中有些 是重復的,要求編寫一段代碼,在另一個工作表上顯示不重復的姓名。如圖實例21所示。0實例3 A列中顯示1 1000中被6除余1和余5的數(shù)字圖實例2-1這個問題也很適合用字典來解決。代碼如下:二、代碼:Sub bcfz()Dim i&, Myr&, ArrDim d, k, t, Sht As WorksheetSet d = CreateObje
35、ct("Scripting.Dictionary")For Each Sht In SheetsIf Sht.Name <> "Sheet4" ThenMyr = Sht.a65536.End(xlUp).RowArr = Sht.Range("a2:a" & Myr)For i = 1 To UBound(Arr) d(Arr(i, 1)=""NextEnd IfNext k = d.keysSheet4.a3.Resize(d.Count, 1) = Application.Transpos
36、e(k)Set d = NothingEnd Sub三、代碼詳解1、For Each Sht In Sheets : For EachNext循環(huán)結構,這種形式是 VBA特有的, 用于對對象的循環(huán)非常適用。意思是在所有的工作表中依次循環(huán)。2、If Sht.Name <> "Sheet4" Then :如果這個工作表的名字不等于"Sheet4”時執(zhí)行下面的代碼。3、Myr = Sht.a65536.End(xlUp).Row :求得這個工作表A列有數(shù)據(jù)的最后一行的行數(shù),把它賦給變量 Myr o這里用了長整型數(shù)據(jù)類型(Long),數(shù)據(jù)范圍最大可到2,147
37、,483,647,是為了避免數(shù)據(jù)很多的時候會超出整型數(shù)據(jù)類型(Integer)而出錯,因為整型數(shù)據(jù)類型數(shù)據(jù)范圍最大只到32,767。4、Arr = Sht.Range("a2:a" & Myr) :把 A 列數(shù)據(jù)賦給數(shù)組 Arr。5、For i = 1 To UBound(Arr) : ForNext循環(huán)結構,從1開始到數(shù)組的最大上限 值之間循環(huán)。Ubound是VBA函數(shù),返回數(shù)組的指定維數(shù)的最大值。6、d(Arr(i, 1)= "":這句代碼的意思就是把關鍵字 Arr(i,1)加入字典,關鍵字對應 的項為空,相當于字典中的這個關鍵字沒有解釋。和
38、 d.Add Arr(i,1),""的效果相同,只是 代碼更簡潔一些。7、k=d.keys :把字典d中存在的所有的關鍵字賦給變量k。得到的是一個一維數(shù)組,下限為0,上限為d.Count-1。Keys是字典的方法,前面已經(jīng)講過了。8、Sheet4.a3 .Resize(d.Count, 1) = Application.Transpose(k):把字典 d 中所有的關 鍵字賦給表4以a3單元格開始的單元格區(qū)域中。代碼執(zhí)行后如圖實例 2-2所示。圖實例2-2實例3 A列中顯示11000中被6除余1和余5的數(shù)一、問題的提出:有1、2、31000 一千個數(shù)字,要求編寫一段代碼,在
39、工作表的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 To 1000dic.Add i & IIf(Abs(i Mod 6 - 3) = 2, "", ""),""Nextarr = WorksheetFunction.Transpose(Filter(dic.keys, "")
40、a1.Resize(UBound(arr), 1) = arra:a.Replace "",""Set dic = NothingEnd Sub三、代碼詳解1、Dim dic As Object, i As Long, arr :也可把字典變量 dic 聲明為對象(Object), i As Long是規(guī)范的寫法,也可寫成i& 。2、dic.Add i & IIf(Abs(i Mod 6 - 3) = 2, "", ""),"":這句代碼的內容比較多,用了兩個VBA函數(shù)IIf和A
41、bs,用了一個 Mod運算符。i Mod 6就是每一個數(shù)除 6的余數(shù),題目 中有兩個要求:余 1和與5,為了從1到1000都同時能滿足這兩個要求,所以用了 Abs(i Mod 6 - 3) = 2, Abs是取絕對值函數(shù)。另一個 VBA函數(shù)IIf是根據(jù)判斷條件返回結果,和If-Then判斷結果類似;IIf(Abs(i Mod 6 - 3) = 2, "","")這段的意思是如果符合判斷條件,返回"“否則返回空“ ;i & IIf(Abs(i Mod 6 - 3) = 2, "","") 的意思是把
42、這個數(shù) 與“或者"”連起來作為關鍵字加入字典dic,關鍵字相對應的項為空。比如當 i=1時,1是滿足上述表達式的,就把“1"作為關鍵字加入字典dic;當i=2時,2不滿足上述表達式,就把“2”作為關鍵字加入字典 dic,關鍵字相對應的項都為空。3、arr = WorksheetFunction.Transpose(Filter(dic.keys, ""):這句代碼的內容分為3部分,第1部分是Filter(dic.keys, "")其中的Filter是一個VBA函數(shù),VBA函數(shù)就是可 以直接在代碼中使用的,我們平常使用的函數(shù)叫工作表函數(shù)
43、,如Sum、Sumif、Transpose等等。Filter函數(shù)要求在一維數(shù)組中篩選出符合條件的另一個一維數(shù)組,式中 的dic.keys正是一個一維數(shù)組。這里的篩選條件是“",也就是把字典關鍵字中含有的關鍵字篩選出來組成一個新的一維數(shù)組,其下標從零開始。第2部分是用工作表函數(shù)Transpose轉置這個新的一維數(shù)組,工作表函數(shù)的使用在前面keys方法一節(jié)已經(jīng)說過了;第2部分是把轉置以后的值賦給數(shù)組變量Arr。呵呵,狼版主的代碼是短了,我的解釋卻太長了。4、a1.Resize(UBound(arr), 1) = arr :把數(shù)組 Arr賦給a1單元格開始的區(qū)域中。5、a:a.Replac
44、e "","" :把A列中的所有的 都替換為空白,只剩下數(shù)字了。代碼詳解的4代碼執(zhí)行后,如圖實例3-1所示。17置實例3 A列中顯示1 1000中被6除余1和余5的數(shù)字#圖實例3-1示例代碼全部執(zhí)行后如圖實例3-2所示。圖實例3-2示例實例4拆分數(shù)據(jù)不重復實例4拆分數(shù)據(jù)不重復一、問題的提出:有一列各種手機品牌型號的數(shù)據(jù),要求編寫一段代碼,按照品牌劃分成沒有重復數(shù) 據(jù)的三大類。二、代碼:Sub caifen()Dim Myr&, Arr, x&Dim d, d1, d2, i&, j&Set d = CreateObject
45、("Scripting.Dictionary")Set d1 = CreateObject("Scripting.Dictionary")Set d2 = CreateObject("Scripting.Dictionary")Myr = a65536.End(xlUp).RowArr = Range("a2:a" & Myr)Range("c2:e" & Myr).ClearContentsmy = Array("MOTO","諾基亞",
46、"三星","索愛")gc = Array("OPPO","聯(lián)想","天語","金立","步步高","波導","TCL","酷派")For x = 1 To UBound(Arr)For i = 0 To UBound(my)If InStr(Arr(x, 1), my(i) > 0 Thend(Arr(x, 1)=""GoTo 100End IfNext iFor j =
47、 0 To UBound(gc)If InStr(Arr(x, 1), gc(j) > 0 Thend1(Arr(x, 1)=""GoTo 100End IfNext jd2(Arr(x, 1)=""100:Next xRange("c2").Resize(UBound(d.keys) + 1, 1) = Application.Transpose(d.keys)Range("d2").Resize(UBound(d1.keys) + 1, 1) = Application.Transpose(dl.keys
48、)Range("e2").Resize(UBound(d2.keys) + 1, 1) = Application.Transpose(d2.keys)End Sub三、代碼詳解1、Set d2 = CreateObject("Scripting.Dictionary"):針對三個不同的種類,創(chuàng)建 d、d1、d2三個字典對象。2、Myr = a65536.End(xlUp).Row :把 A列最后一行不為空白的行數(shù)賦給變量Myr。3、Arr = Range("a2:a" & Myr) :把A2開始的有數(shù)據(jù)的單元格區(qū)域賦給變量A
49、rr。4、Range("c2:e" & Myr).ClearContents :把 C2 到 E 列單元格區(qū)域清空。5、my = Array("MOTO","諾基亞","三星",嗦愛"):VBA函數(shù)Array返回一個一維數(shù)組,默認下界為 0。把Array函數(shù)返回的數(shù)組賦給變量my(貿易兩漢字的首字母)。6、gc = Array("OPPO"," 聯(lián)想","天語","金立","步步高","波
50、導", "TCL","酷派"):把 Array 函 數(shù)返回的數(shù)組賦給變量gc(國產兩漢字的首字母)。7、For x = 1 To UBound(Arr):在A列原始數(shù)據(jù)的數(shù)組中逐一循環(huán)。8、For i = 0 To UBound(my):在my數(shù)組中逐一循環(huán)。因為有 4個貿易機品牌,所 以用循環(huán)每一個與原始數(shù)據(jù)比較。9、If InStr(Arr(x, 1), my(i) > 0 Then : VBA函數(shù)Instr返回在第1個參數(shù)中查找的位 置,如果返回結果=0,表示在第1個參數(shù)中沒有第2個參數(shù)存在。本句的意思是如果找到貿易機品牌的話,執(zhí)行
51、下面的代碼。10、d1(Arr(x, 1)="":接上句,如果上面判斷成立,就把 Arr(x, 1)加入字典d。11、GoTo 100 : Goto語句用于無條件地轉移到過程中指定的行。這里采用跳出For i循環(huán),一是為了減少循環(huán)的次數(shù),比如"MOTO"找到的話,后面3個就不需要找了;二是為了跳過兩個小循環(huán)之后的其它品牌加入第3個字典的d2(Arr(x, 1)=""語句。12、Forj循環(huán)與上面相同,為了判斷得到國產機類的字典d1o13、d2(Arr(x, 1)="":如果上述兩個小循環(huán)都不滿足,那么就加入其它品牌
52、類字典 里。14、 Range("c2").Resize(UBound(d.keys) + 1, 1) = Application.Transpose(d.keys) :最 后的3句分別把字典的關鍵字數(shù)組轉置后賦給相應的單元格區(qū)域。代碼執(zhí)行后如圖實例4-1所示。.匚r口玄口£十 Exck 1拆比口”3二叵因':舊工件?1的;i 7) ;硒中久田啜箕丸華苴ZRQi曲指屯歪口£(5 a3心口M也-JD=y 百J丘上司折才叫C2* MOTDZCACIDE丹L航工M國產士牌具豆吊牌2長虹008 2Mi: TO Z 6及立Al。順Gg-比3長匯DC:相諾基
53、至一口元金立燦4匕虹LGEIH4些通紀DEO。恥 luan%全立EbE正 flEMu5全立JLLQ諾基亞1川口45vj6佳韋加演1E主支系+誤基過三譏6至立17玳亨:才找婚T全立H必MTni叩曲金立AIM長川1 1落3金可MOTOZN2DO金立M7_ _皿彳rxx?9佳通MD6QI評其亞2(1丁士立 N73/C水立方7nMi苦芭TK闔口就宓離t明.三中3 vriTn.14 占H 三%/7/1/>;思國R J 目世困UM,、匚KUH喇域e栩曜,3.,e就用圖實例4-1示例山菊花版主用了一個字典對象就解決了上述問題。讓我們來學習一下。四、山菊花版主的代碼Sub拆分()Dim pp1$, pp
54、2$, nRow%, ds, Brr(), s(1 To 3) As IntegerSet ds = CreateObject("scripting.dictionary")pp1 = Join(WorksheetFunction.Transpose(Range(Range("g2"), Range("g1").End(xlDo wn), ",")pp2 = Join(WorksheetFunction.Transpose(Range(Range("h2"), Range("h1&qu
55、ot;).End(xlDo wn), ",")nRow = Range("a1").End(xlDown).RowArr = Range("a1:a" & nRow)ReDim Brr(1 To nRow, 1 To 3)For i = 2 To nRowIf Not ds.Exists(Arr(i, 1) Thends(Arr(i, 1)=""If pp1 Like "*" & Left(Arr(i, 1), 2) & "*" Thens(1) =
56、s(1) + 1Brr(s(1), 1) = Arr(i, 1)Elself pp2 Like "*" & Left(Arr(i, 1), 2) & "*" Thens(2) = s(2) + 1Brr(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" & nRow) = Brr End Sub五、代碼詳解1、pp1 = Join(WorksheetFunction
57、.Transpose(Range(Range("g2"), _ Range("g1").End(xlDown), ","):這句代碼用了兩個 VBA 函數(shù) Join 和 Transpose , Range("g1").End(xlDown)從 G1 單元格往下直到最下面的單元格,遇到空白格就停止。因為本例的 G14、G15單元格有 另外的數(shù)據(jù)存在,如果還是用 Range("g65536").End(xlUp),那么就會把不需要的數(shù)據(jù)帶 進去,造成結果出錯。Transpose轉置函數(shù),前面已經(jīng)介紹
58、過了。Join函數(shù)是通過連接某個數(shù)組中的多個子字符串而創(chuàng)建的一個字符串,本句代碼執(zhí)行后得到pp1="MOTO,諾基亞,三星,索愛"。pp2一句同上句一樣,得到另一個字符串。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(1 To nRow, 1 To 3):用于為動態(tài)數(shù)組變量Brr重新分配存儲空間。第一維的下界從1到上界
59、nRow,第二維從1到3。5、For i = 2 To nRow :從 2 至U nRow 逐一循環(huán)。6、If Not ds.Exists(Arr(i, 1) Then :如果字典 ds 中不存在關鍵字 Arr(i, 1)7、ds(Arr(i, 1)="":把Arr(i, 1)作為關鍵字加入字典 ds。8、If pp1 Like "*" & Left(Arr(i, 1), 2) & "*" Then :這里山版主用了比較運算符Like 來比較pp1和取自Arr(i, 1)左邊兩個字符,再在前后加任意字符組成的字符串,如
60、果滿 足條件為真,那么執(zhí)行下面的語句。9、s(1) = s(1) + 1 :數(shù)組s的第一個元素+1以后賦給數(shù)組s的第一個元素。10、Brr(s(1), 1) = Arr(i, 1):把這個關鍵字賦給第2維為1的另一個數(shù)組 Brr,也就是我們要求的貿易機類。 ppi字符串里都是貿易機類的品牌。11、Elself pp2 Like "*" & Left(Arr(i, 1), 2) & "*" Then :同樣,如果滿足國產品牌類這個 條件,那么執(zhí)行下面的代碼。12、s(2) = s(2) + 1 :數(shù)組s的第二個元素+1以后賦給數(shù)組s的第二個
61、元素。13、Brr(s(2), 2) = Arr(i, 1):把這個關鍵字賦給第2維為2的另一個數(shù)組 Brr,也就是我們要求的國產品牌類。 pp2字符串里都是國產品牌類的品牌。14、s(3) = s(3) + 1 :前如果條件都不滿足時,數(shù)組 S的第三個元素+1以后賦給數(shù) 組S的第三個元素。15、Brr(s(3), 3) = Arr(i, 1):把這個關鍵字賦給第3維為1的另一個數(shù)組 Brr,也就是我們要求的其它品牌類。16、Range("c2:e" & nRow) = Brr :把數(shù)組 Brr賦給c2單元格開始的區(qū)域中。實例5前期綁定的字典實例問題的提出:有多列多行數(shù)據(jù),其中有重復的行,要求編寫一段代碼,求得不重復的行數(shù)據(jù)。 如圖實例5-1所示。口Eic事一字為一支伴福藤國 視圖值 插入© 樞式電)工具 物窗口切;都助皿-5 x上窗4口一尸石3旦正皂劊國/;卸色二至:壽豆#,市 百二-0言4 : a工聞字兵JtMHTOxh1生 名先 姓王'L手先生 王先生 令先生 三先生Jt7手先土1cD7eliwkQQ12345673133E8553314659S7S2544551370G5823S89845E
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 財富顧問考試題及答案
- 歌舞團面試題及答案
- 互聯(lián)網(wǎng)奇葩面試題及答案
- 人社局電工技能培訓課件
- 成華區(qū)新質生產力
- 緊張性疲勞的臨床護理
- 兄弟共同經(jīng)營房產協(xié)議書
- it項目股權認購協(xié)議書
- 三人合伙美容合同范本
- 圖書裝卸配送合同范本
- 22新高考一卷數(shù)學答題卡
- 山嶺區(qū)二級公路畢業(yè)畢業(yè)設計答辯
- 《新能源材料與器件》教學課件-04電化學能源材料與器件
- DB13T 2770-2018 焊接熔深檢測方法
- JJF 1343-2022 標準物質的定值及均勻性、穩(wěn)定性評估
- 民法典侵權責任編課件
- 員工手冊(格林豪泰)VDOC
- 高中數(shù)學蘇教版(2019)選擇性必修第一冊考前必背知識點 素材
- 邊坡復綠專項施工方案
- 幼兒園課件——《生氣蟲飛上天》PPT課件
- 幼兒園幼兒個人健康檔案
評論
0/150
提交評論