

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、VBA 字典用法小記十分鄙視那些將 藍橋玄霜大大的成果上傳后還要收取下載券的做法,本來想直接上傳一份大大的原版,可是百度文檔提示已經有重復的文 檔,沒辦法,只好自己修改一下,在上傳,想無私奉獻的大大致敬! !常用語句:Dim dSet d = CreateObject(Scripting.Dictionary)d.Add a, Athe nsd.Add b, Belgraded.Add c, Cairo代碼詳解1、 Dim d :創(chuàng)建變量,也稱為聲明變量。變量d 聲明為可變型數(shù)據(jù)類型(Variant),d后面沒有寫數(shù)據(jù)類型,默認就是可變型數(shù)據(jù)類型(Variant)。也有寫成 Dim d As
2、Object 的,聲明為對象。2、 Set d = CreateObject(Scripting.Dictionary):創(chuàng)建字典對象,并把字典對象賦給變量 d。這 是 最 常 用 的 一 句 代 碼 。 所 謂 的 “ 后 期 綁 定 ” 。 用 了 這 句 代 碼 就 不 用 先 引 用c:windowssystem32scrrun.dll 了。3、d.Add a, Athens:添加一關鍵字a和對應于它的項Athens”。4、d.Add b, Belgrade:添加一關鍵字b和對應于它的項Belgrade。5、d.Add c, Cairo:添加一關鍵字c和對應于它的項Cairo”。Exi
3、sts 方法如果 Dictionary 對象中存在所指定的關鍵字則返回true,否則返回 false。object.Exists(key)參數(shù)object必選項??偸且粋€Dictionary 對象的名稱。key必選項。需要在Dictionary 對象中搜索的 key 值。常用語句:Dim d, msg$Set d = CreateObject(Scriptin g.Dictio nary)d.Add a, Athe nsd.Add b, Belgraded.Add c, Cairo If d.Exists(c) Thenmsg =指定的關鍵字已經存在?!盓lsemsg =指定的關鍵字不存在?!?/p>
4、End If代碼詳解1、 Dim d, msg$ :聲明變量,d 見前例;msg$聲明為字符串數(shù)據(jù)類型(String),般 寫法為 Dimmsg As String。String 的類型聲明字符為美元號($)。2、 If d.Exists(c) Then :如果字典中存在關鍵字 c”,那么執(zhí)行下面的語句。3、 msg =指定的關鍵字已經存在。:把指定的關鍵字已經存在?!弊址x給變量 msg。4、 Else :否則執(zhí)行下面的語句。5、 msg =指定的關鍵字不存在。:把指定的關鍵字不存在?!弊址x給變量 msg。6、 End If :結束 If ElseEndif 判斷。Keys 方法返回一
5、個數(shù)組,其中包含了一個Dictionary 對象中的全部現(xiàn)有的關鍵字。object.Keys()其中 object 總是一個 Dictionary 對象的名稱。常用語句:Dim d, kSet d = CreateObject(Scriptin g.Dictio nary)d.Add a, Athe nsd.Add b, Belgraded.Add c, Cairok=d.KeysB1.Resize(d.Co un t,1)=Applicati on .Tra nspose(k)代碼詳解1、Dim d, k 聲明變量,d 見前例;k 默認是可變型數(shù)據(jù)類型(Variant)。2、 k=d.Key
6、s :把字典中存在的所有的關鍵字賦給變量k。得到的是一個一維數(shù)組,下 限為0,上限為 d.Count-1。這是數(shù)組的默認形式。3、 B1.Resize(d.Count,1)=Application.Transpose(k):這句代碼是很常用很經典的代碼, 所以這里要多說一些。Resize 是 Range 對象的一個屬性,用于調整指定區(qū)域的大小,它有兩個參數(shù),第一個 是行數(shù),本例是 d.Co unt,指的是字典中關鍵字的數(shù)量,整本字典中有多少個關鍵字,本例 d.Count=3,因為有3 個關鍵字。呵呵,是不是說多了。第二個是列數(shù),本例是 1。這樣=左邊的意思就是:把一個單元格B1 調整為以 B1
7、 開始的一列單元格區(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)在可 以解釋這句代碼了:把字典中
8、所有的關鍵字賦給以B1 單元格開始的單元格區(qū)域中。Items 方法返回一個數(shù)組,其中包含了一個Dictionary 對象中的所有項目。object.ltems()其中 object 總是一個 Dictionary 對象的名稱。常用語句:Dim d, tSet d = CreateObject(Scriptin g.Dictio nary)d.Add a, Athe nsd.Add b, Belgraded.Add c, Cairot=d .I temsC1.Resize(d.Cou nt,1)=Applicatio n.Tra nspose(t)代碼詳解1、 Dim d, t :聲明變量,d
9、見前例;t 默認是可變型數(shù)據(jù)類型(Variant)。2、 t=d.ltems :把字典中所有的關鍵字對應的項賦給變量t。得到的也是一個一維數(shù)組, 下限為 0,上限為 d.Count-1。這是數(shù)組的默認形式。3、 C1.Resize(d.Count,1)=Application.Transpose(t):有了上面 Keys 方法的解釋這句代 碼就不用多說了,就是把字典中所有的關鍵字對應的項賦給以C1 單元格開始的單元格區(qū)域 中。Remove 方法Remove 方法從一個 Dictionary 對象中清除一個關鍵字,項目對。object.Remove(key )其中 object 總是一個 Dic
10、tionary 對象的名稱。key必選項。key 與要從 Dictionary 對象中刪除的關鍵字,項目對相關聯(lián)。說明如果所指定的關鍵字,項目對不存在,那么將導致一個錯誤。常用語句:Dim dSet d = CreateObject(Scriptin g.Dictio nary)d.Add a, Athe nsd.Add b, Belgraded.Add c, Cairod.Remove( b”代碼詳解1、d.Remove( b” :清除字典中b關鍵字和與它對應的項。清除之后,現(xiàn)在字典里只有2 個關鍵字了。RemoveAII 方法RemoveAII 方法從一個Dictionary 對象中清除所
11、有的關鍵字,項目對。object.RemoveAII()其中 object 總是一個 Dictionary 對象的名稱。常用語句:Dim dSet d = CreateObject(Scriptin g.Dictio nary)d.Add a, Athe nsd.Add b, Belgraded.Add c, Cairod.RemoveAII代碼詳解1、d.RemoveAII :清除字典中所有的數(shù)據(jù)。也就是清空這字典,然后可以添加新的關 鍵字和項,形成一本新字典。字典對象的屬性有 4 個:Count 屬性、Key 屬性、Item 屬性、CompareMode 屬性。Count 屬性返回一個 D
12、ictionary 對象中的項目數(shù)。只讀屬性。object.Co unt其中 object 個字典對象的名稱。常用語句:Dim d, n%Set d = CreateObject(Scriptin g.Dictio nary)d.Add a, Athe nsd.Add b, Belgraded.Add c, Cairo n = d.Co unt代碼詳解1、Dim d, n% :聲明變量,d 見前例;n 被聲明為整型數(shù)據(jù)類型(Integer)。一般寫法為Dim n As Integer。Integer 的類型聲明字符為百分比號()。2、 n = d.Count :把字典中所有的關鍵字的數(shù)量賦給變
13、量n。本例得到的是 3。Key 屬性在 Dictionary 對象中設置一個key。object.Key(key) = n ewkey參數(shù):object必選項??偸且粋€字典(Dictionary)對象的名稱。key必選項。被改變的key 值。n ewkey必選項。替換所指定的key 的新值。說明如果在改變一個key 時沒有發(fā)現(xiàn)該key,那么將創(chuàng)建一個新的key 并且其相關聯(lián)的item 被設置為空。常用語句:Dim dSet d = CreateObject(Scriptin g.Dictio nary)d.Add a, Athensd.Add b, Belgraded.Add c, Cairo
14、d.Key(c) = d代碼詳解1、d.Key(c) = d:用新的關鍵字”d”來替換指定的關鍵字 ”這時,字典中就沒有 關鍵字 c 了,只有關鍵字 d 了,與 d 對應的項是Cairo”。Item 屬性在一個 Dictionary 對象中設置或者返回所指定 的key 返回一個 item。讀/寫。key 的 item。對于集合則根據(jù)所指定object .I tem(key)=n ewitem參數(shù)object必選項??偸且粋€Dicti onary 對象的名稱。key必選項。與要被查找或添加的item 相關聯(lián)的key。n ewitem可選項。僅適用于Dictio nary對象;n ewitem就是
15、與所指定的key 相關聯(lián)的新值。說明如果在改變一個 key 的時候沒有找到該 item,那么將利用所指定的 newitem 創(chuàng)建一 個新的 key。如果在試圖返回一個已有項目的時候沒有找到key,那么將創(chuàng)建一個新的 key且其相關的項目被設置為空。常用語句:Dim dSet d = CreateObject(Scriptin g.Dictio nary)d.Add a, Athe nsd.Add b, Belgrade d.Add c, Cairo MsgBox d.Item(c)代碼詳解1、d.Item(c):獲取指定的關鍵字 ”對應的項。2、 MsgBox :是一個 VBA 函數(shù),用消息框
16、顯示。如果要詳細了解 MsgBox 函數(shù)的, 可參見我的另一篇文章“常用 VBA 函數(shù)精選合集”。http:/club.excelhome. net/thread-387253-1-1.htmlCompareMode 屬性設置或者返回在 Dictionary 對象中進行字符串關鍵字比較時所使用的比較模式。object.CompareMode = compare參數(shù)object必選項??偸且粋€Dictionary 對象的名稱。compare可選項。如果提供了此項,compare 就是一個代表比較模式的值??梢允褂玫闹凳?0( 二進制卜 1 (文本),2 (數(shù)據(jù)庫)。說明如果試圖改變一個已經包含有
17、數(shù)據(jù)的Dictionary 對象的比較模式,那么將導致一個錯誤。常用語句:Dim dSet d = CreateObject(Scriptin g.Dictio nary)d.CompareMode = vbTextCompared.Add a, Athe nsd.Add b, Belgraded.Add c, Cairod.Add B , Baltimore代碼詳解1、 d.CompareMode = vbTextCompare:設置字典的比較模式是文本,在這種比較模式下不區(qū)分關鍵字的大小寫,即關鍵字”和B 是一樣的。vbTextCompare 的值為 1,所以上式也可寫為 d.Compar
18、eMode =1。如果設置為 vbBinaryCompare (值為 0),則執(zhí)行二進制 比較,即區(qū)分關鍵字的大小寫,此種情況下關鍵字” ”和” B”被認為是不一樣的。2、d.Add B , Baltimore :添加一關鍵字”B”和對應于它的項 ”Baltimore ” 由于前面已經設置了比較模式為文本模式,不區(qū)分關鍵字的大小寫,即關鍵字” ”和” B”是一樣的,此時發(fā)生錯誤添加失敗,因為字典中已經存在” b”了,字典中的關鍵字是唯一的,不能添加重復的關鍵字。實例 1 普通常見的求不重復值問題一、問題的提出:表格中人員有很多是重復的,要求編寫一段代碼,把重復的人員姓名以及重復的次數(shù)求 出來,
19、復制到另一個表格中。如圖實例 1 1 所示。論壇網址:http:/club.excelhome .n etAhread-637004-1-1.htmlC licrosoft Excel - 20101013人口 IDIEi圖實例 1-1二、代碼:Sub cfz()Dim i&, Myr&, ArrDim d, k, tSet d = CreateObject(Script in g.Dictio nary)Myr = Sheet1.a65536.E nd(xlUp).RowArr = Sheet1.Range(a1:g & Myr)For i = 2 To UBound
20、(Arr)d(Arr(i, 3) = d(Arr(i, 3) + 1Nextk = d.keyst = d.itemsSheet2.Activatea2.Resize(d.Co unt, 1) = Applicati on.Tran spose(k)b2.Resize(d.Co unt, 1) = Applicati on.Tran spose(t)a1.Resize(1, 2) = Array(姓名,”重復個數(shù))Set d = Nothi ngEnd Sub三、代碼詳解 L-?書屜:iI q : (7忤店出“國d圍20101D1殛復總人口1015.xh盟涇5120S1106001018003
21、2901CDEFGH1 蛙名性別出主日期人員樂別 婚姻狀憩2 白炳會男1920-12-28 常住!參與盤初婚3白炳會 男1928-12-28 常住慘已婚4 白貴清男1974-0413 常住 i 蓼與*初婚5 白貴清男194-013 常創(chuàng)參與初實昏6 白薛女1376-07-06 常住 i 發(fā)與盤初婚7 白靜女1&76-07-06 常住(參初婚8 白蘭郴男1582-06-13 常?。▍⑷椿? 白蘭郴男1962-06 13 常住序初婚10 白蘭郴男1982-06-13 常住陲扇初婚11 白培玉男1571208 常性滲與纟初婚12 白培玉男1971-02-06 ?;聟⒕┮鸦閿?shù)字退出系統(tǒng)日鄭:
22、1S文件編輯視團辺插入口 格式工具數(shù)據(jù)宙口 :幫助廈)-C x H SheetiyXiEM/繪U(1曲變動共型1 Dim i&, Myr&, Arr:變量 i 和 Myr 聲明為長整型變量。也可以寫為 Dim Myr As Long。Long 的類型聲明字符為(& )Arr 后面沒有寫明數(shù)據(jù)類型,默認就是可變型數(shù)據(jù)類型(Variant)。2、 Set d = CreateObject(Scripting.Dictionary):創(chuàng)建字典對象, 并把字典對象賦給變量 d。這是最常用的一句代碼。 所謂的“后期綁定”。 用了這句代碼就不用先引用 c:windowssystem
23、32scrrun.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 到 G 列最后一行不為空白的單元格區(qū)域的值賦給變量Arr。這樣 Arr
24、 就是個二維數(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 對應的項,每出現(xiàn)一次這個關鍵字,它的項的值就增加1。起到了按關鍵字累加的作
25、用,也正因為有這個作用,所以可使用字典來進行各種匯總統(tǒng)計。后面要講的實例會充分的展現(xiàn)這個作用。7、 k=d.keys :把字典 d 中存在的所有的關鍵字賦給變量k。得到的是一個一維數(shù)組,下限為 0,上限為 d.Count-1。Keys 是字典的方法,前面已經講過了。& t=d.items :把字典 d 中存在的所有的關鍵字對應的項賦給變量t。得到的也是一個一維數(shù)組,下限為 0,上限為 d.Count-1oItems 也是字典的方法,前面也已經講過了。9、 Sheet2.Activate :激活表 2。10、 a2.Resize(d.Count, 1) = Application.Tra
26、nspose(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ù)了。這里作為表頭一次性輸入。13、 Set d = Nothing :釋放字典內存。
27、代碼執(zhí)行后如圖實例1-2 所示。C licrosoftEECCI- 20101013 車旬矣人口 1 町 5|_ 廠可 立悴辿 謂鎘 利因世;拯人 齟: 工貝 戳揺衛(wèi) t爵二電 幫助 QP - 5 X二逹g 掐j叫- J5 111:至丨”*印Eb*1P 茁上聲劊書A Ji 1爼也zomnu殛蛍遵人口lois.MhAl -京柱名圖實例 1-2實例 2 求多表的不重復值問題一、問題的提出:一工作簿里面有 3 張工作表上,每張表格的 A 列都是姓名列,所有這些姓名中有些是 重復的,要求編寫一段代碼,在另一個工作表上顯示不重復的姓名。如圖實例 2 1 所示。f23J.C67SO-89黃九101112H
28、: # n Sheet! Zsteet /sheeTa 5heet4 /| 1i坐霧亀)+ y 自先團冬肚1 ”、口_ /凸園就瘠諛宇圖實例 2-1這個問題也很適合用字典來解決。代碼如下:二、代碼:Sub bcfz()Dim i&, Myr&, ArrDim d, k, t, Sht As WorksheetSet d = CreateObject(Script in g.Dictio nary)For Each Sht In SheetsIf Sht.Name Sheet4 ThenMyr = Sht.a65536.E nd(xlUp).RowArr = Sht.Range(
29、a2:a & Myr)For i = 1 To UBound(Arr)d(Arr(i, 1)=NextEnd IfNextk = d.keysSheet4.a3.Resize(d.Cou nt, 1) = Applicatio n.Tra nspose(k)Set d = Nothi ngstO crooft Excel -不更塩數(shù)End Sub三、代碼詳解1、 For Each Sht In Sheets: For EachNext 循環(huán)結構,這種形式是VBA 特有的,用于 對對象的循環(huán)非常適用。意思是在所有的工作表中依次循環(huán)。2、If Sht.Name Sheet4 Then:如果
30、這個工作表的名字不等于”Sheet4”時執(zhí)行下面的代碼。3、Myr = Sht.a65536.End(xlUp).Row:求得這個工作表 A 列有數(shù)據(jù)的最后一行的行數(shù),把它賦給變量 Myr。這里用了長整型數(shù)據(jù)類型(Long),數(shù)據(jù)范圍最大可到 2,147,483,647,是為了避免數(shù)據(jù)很多的時候會超出整型數(shù)據(jù)類型(In teger)而出錯,因為整型數(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ù)組的最
31、大上限值之 間循環(huán)。Ubound 是 VBA 函數(shù),返回數(shù)組的指定維數(shù)的最大值。6、 d(Arr(i, 1)= ”:這句代碼的意思就是把關鍵字 Arr(i,1)加入字典,關鍵字對應的 項為空,相當于字典中的這個關鍵字沒有解釋。和d.Add Arr(i,1),的效果相同,只是代碼 更簡潔一些。7、 k=d.keys :把字典 d 中存在的所有的關鍵字賦給變量k。得到的是一個一維數(shù)組, 下限為 0,上限為 d.Count-1。Keys 是字典的方法,前面已經講過了。8、 Sheet4.a3 .Resize(d.Count, 1) = Application.Transpose(k) |:把字典 d
32、 中所有的關鍵 字賦給表 4 以 a3 單元格開始的單元格區(qū)域中。代碼執(zhí)行后如圖實例 2-2 所示。 li crqsrvft Eiccel -不車啟報 07(11圖實例 2-2Dim 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 和 Abs,用了一個 Mod 運算符。i Mod 6 就是每一個數(shù)除 6 的余數(shù),題目中有兩個 要
33、求:余 1和與 5,為了從 1 到 1000 都同時能滿足這兩個要求,所以用了Abs(i Mod 6 - 3)=2, Abs 是取絕對值函數(shù)。另一個 VBA 函數(shù) IIf 是根據(jù)判斷條件返回結果,和IfThen 判斷結果類似;IIf(Abs(i Mod 6 - 3) = 2, ,)這段的意思是如果符合判斷條件,返回” ”否則返回空”i & IIf(Abs(i Mod 6 - 3) = 2, ,)的意思是把這個數(shù)與”或者”連起來作為關鍵 字加入字典 dic,關鍵字相對應的項為空。比如當 i=1 時,1 是滿足上述表達式的,就把”1”作為關鍵字加入字典dic ;當 i=2 時,2 不滿足上
34、述表達式,就把 ”2”作為關鍵字加入字典dic,關鍵字相對應的項都為空。3、arr = WorksheetFunction.Transpose(Filter(dic.keys, ):這句代碼的內容分為3 部分,第 1 部分是Filter(dic.keys, )其中的 Filter 是一個 VBA 函數(shù), VBA 函數(shù)就是可以直接在代 碼中使用的,我們平常使用的函數(shù)叫工作表函數(shù),女口Sum、Sumif、Transpose 等等。Filter函數(shù)要求在一維數(shù)組中篩選出符合條件的另一個一維數(shù)組,式中的 dic.keys 正是一個一維數(shù)組。這里的篩選條件是”,也就是把字典關鍵字中含有的關鍵字篩選出來組
35、成一個新的一維數(shù)組,其下標從零開始。第 2 部分是用工作表函數(shù) 工作表函數(shù)的使用在前面 keys 方法一節(jié)已經說過了;第 變量 Arr。呵呵,狼版主的代碼是短了,我的解釋卻太長了。4、a1.Resize(UBound(arr), 1) = arr:把數(shù)組 Arr 賦給a1單元格開始的區(qū)域中。5、a:a.Replace ,:把 A 列中的所有的 都替換為空白,只剩下數(shù)字了。Tran spose轉置這個新的一維數(shù)組,2 部分是把轉置以后的值賦給數(shù)組代碼詳解的 4代碼執(zhí)行后,如圖實例3-1 所示。圖實例 3-1 示例代碼全部執(zhí)行后如圖實例3-2 所示。圖實例 3-2 示例實例 4 拆分數(shù)據(jù)不重復一、
36、問題的提出:有一列各種手機品牌型號的數(shù)據(jù),要求編寫一段代碼,按照品牌劃分成沒有重復數(shù)據(jù)的三大類。二、代碼:Sub caife n()Dim Myr&, Arr, x&Dim d, d1, d2, i&, j&Set d = CreateObject(Script in g.Dictio nary)Set d1 = CreateObject(Scriptin g.Dictio nary)Set d2 = CreateObject(Scriptin g.Dictio nary)Myr = a65536.E nd(xlUp).RowArr = Range(a2:a &
37、amp; Myr)Range(c2:e & Myr).CIearContentsmy = Array(MOTO,諾基亞,三星,索愛)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 = 0 To UBound(gc)If InStr(Arr(x, 1), gc(j) 0 Thend1(Arr(x, 1)=GoTo 100End
38、 IfNext jd2(Arr(x, 1)=100:Next xRa nge(c2).Resize(UBou nd(d.keys) + 1, 1) = Applicatio n.Tra nspose(d.keys)Ra nge(d2).Resize(UBou nd(d1.keys) + 1, 1) = Applicatio n.Tra nspose(d1.keys)Ra nge(e2).Resize(UBou nd(d2.keys) + 1, 1) = Applicatio n.Tra nspose(d2.keys) End Sub三、代碼詳解1、Set d2 = CreateObject(S
39、cripting.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ū)域賦給變量Arr。4、Range(c2:e & Myr).ClearContents:把 C2 到 E 列單元格區(qū)域清空。5、my = Array(MOTO,諾基亞,三星,嗦愛):VBA 函數(shù) Array 返回一個一維數(shù)組,默認下界為 0。把 Array 函數(shù)返回的數(shù)組賦給變量my(貿易兩漢字
40、的首字母)。6、gc = Array(OPPO, 聯(lián)想,天語,金立,步步高,波導, 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 lnStr(Arr(x, 1), my(i) 0 Then| : VBA 函數(shù) In str 返回在第 1 個參數(shù)中查找的位置, 如果返回結果=0,表示在第 1 個參數(shù)中沒有第 2 個參數(shù)存在。本
41、句的意思是如果找到 貿易機品牌的話,執(zhí)行下面的代碼。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、For j循環(huán)與上面相同,為了判斷得到國產機類的字典d1。13、d2(Arr(x, 1)=:如果上述兩個小循環(huán)都不滿足,那么就加入其它品牌類字典里。14、Range(c2).Resiz
42、e(UBound(d.keys) + 1, 1) = Application.Transpose(d.keys):最后的3 句分別把字典的關鍵字數(shù)組轉置后賦給相應的單元格區(qū)域。代碼執(zhí)行后如圖實例 4-1 所示。圖實例 4-1 示例山菊花版主用了一個字典對象就解決了上述問題。讓我們來學習一下。四、山菊花版主的代碼:Sub 拆分()Dim pp1$, pp2$, nRow%, ds, Brr(), s(1 To 3) As IntegerSet ds = CreateObject(script in g.dicti on ary)pp1 = Joi n( WorksheetFu nctio n.T
43、ra nspose(Ra nge(Ra nge(g2),Ran ge(g1).E nd(xlDown), ,)pp2 = Joi n( WorksheetFu nctio n.Tra nspose(Ra nge(Ra nge(h2),Ra nge(h1).E nd(xlDown), ,)n Row = Ra nge(a1).E nd(xlDow n).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
44、pp1 Like * & Left(Arr(i, 1), 2) & * Thens(1) = s(1) + 1Brr(s(1), 1) = Arr(i, 1)ElseIf pp2 Like * & Left(Arr(i, 1), 2) & * Thens(2) = s(2) + 1Brr(s(2), 2) = Arr(i, 1)Elses(3) = s(3) + 1Brr(s(3), 3) = Arr(i, 1)End IfEnd IfNextRange(c2:e & nRow) = BrrEnd Sub五、代碼詳解1、pp1 = Join(Worksh
45、eetFunction.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ù),前面已經介紹過了。Join 函數(shù)是通過連接某個數(shù)組中的多個子字符串而創(chuàng)建的一個字符串,本句代碼執(zhí)行后得到pp1=M
46、OTO,諾基亞,三星,索愛”。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 至 U 上界 n Row,第二維從 1 到 3。5、For i = 2 To nRow:從 2 到 nRow 逐一循環(huán)。6、If Not ds.Exists(A
47、rr(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)左邊兩個字符,再在前后加任意字符組成的字符串,如果滿足條件 為真,那么執(zhí)行下面的語句。9、s(1) = s(1) + 1:數(shù)組 s 的第一個元素+1 以后賦給數(shù)組 s 的第一個元素。10、Brr(s(1), 1) = Arr(i, 1):把這個關鍵字賦給第2 維為 1
48、的另一個數(shù)組 Brr,也就是我 們要求的貿易機類。pp1 字符串里都是貿易機類的品牌。11、ElseIf pp2 Like * & Left(Arr(i, 1), 2) & * Then:同樣,如果滿足國產品牌類這個條件, 那么執(zhí)行下面的代碼。12、s(2) = s(2) + 1:數(shù)組 s 的第二個元素+1 以后賦給數(shù)組 s 的第二個元素。13、Brr(s(2), 2) = Arr(i, 1):把這個關鍵字賦給第2 維為 2 的另一個數(shù)組 Brr,也就是我 們要求的國產品牌類。pp2 字符串里都是國產品牌類的品牌。14、s(3) = s(3) + 1:前如果條件都不滿足時,數(shù)組
49、 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 所示。TellaS456781398855301 46&9878 2544551370258236.89845512345673 1J98S553DL6587
50、8Ab44b51370553235M 晁吐5 12S45678139SE501465878旣理亦1370258235陽8455二、代碼:11.VHr 1 11/ She r 12 / 3li= e (0 /& 1目趣睡電“、口O id4 Q .1)圖實例 5-1 示例弐II( (! !具I IF211王先主2:土經生+5 5t t憲先吐4g6李先生Y8文 fz気輅蛋 i 刪加-IT-IT圏宇 -klyOOOUinSub 保留原數(shù)據(jù)()by:ldy888前期綁定,需先引用c:wi ndowssystem32scrru n.dllDim d As New Dictionary,tFor i
51、 = 2 To 5圖實例 5-2 示例Set d(Cells(i, 1) & ”) = Range(Cells(i, 1), Cells(i, 4)Nextt=d.itemsA11.Resize(d.Count, 4) = Application.Transpose(Application.Transpose(t)End Sub三、代碼詳解1、Dim d As New Dictionary, t本段代碼需要先引用微軟的腳本運行時庫MicrosoftScripti ng Run time,可在 VBE 窗口,從菜單工具引用,然后勾選Microsoft Script ingRun time
52、,或者點擊瀏覽,在添加引用對話框中選擇c:wi ndowssystem32scrru n.dll,并打開,確定。完成引用。在本聲明語句中把字典d 聲明為 New Dictionary。這就是”前期綁定”了。上面的實例用的是創(chuàng)建對象語句:Set d = CreateObject(Scripting.Dictionary),稱為后期綁定”。不需要先引用腳本運行時庫。2、Set d(Cells(i, 1) & ) = Range(Cells(i, 1), Cells(i, 4):把單元格對象加入字典,它對應的項是同一行的單元格區(qū)域。注意,這里用了Set,和前面的幾例不一樣哦。如果用Typen
53、ame(d(Cells(i, 1) & ), 得到的是一個 Range 對象。 這里的 Cells(i, 1) & 也可以 用 Cells(i,1).Value 來代替。3、t=d.items:把字典 d 中存在的所有的關鍵字對應的項賦給變量t。得到的是一個 一維數(shù)組,下限為 0,上限為 d.Count-1。4、A11.Resize(d.Count, 4) = Application.Transpose(Application.Transpose(t):這句用了兩次工作表轉置函數(shù)Transpose 之后賦給 A11 單元格開始的區(qū)域中。代碼執(zhí)行后如圖實例 5-2 所示。O Ti
54、crusof* Ejjcel -寧典耐3:J dJ 九口丄丁上衛(wèi)ji創(chuàng)|.E丨凹1土 曾止廿也W|謝XA聖逡也團型搖扎格stm匸貝 數(shù)撰血譜口-I X1帑貼愆jSjldyDflU.nh1Telmob2土先生12345&78139885530145598783李先生2544551370258236884554王先生12345&78139885530146E98785李丸生2544551370258236的84556土先生12345鬧81398855301465987S7李先生2544551370258236的8455Q-Q9101112345&781398S5530146
55、69373122544551370258236898455B18圖實例 5-2 示例Dn FnZ Shse t2 X Sh 3 /| (EteE3)-:目垃 EJIQZ、匚 I o、-沖 IT ai 應丨些=金云|.K*=、代碼:Private Sub CommandButton 1_Click()by:oobirdDim d As Object, rng, i%, j%, arrSet d = CreateObject(Script in g.Dictio nary)rng = Range(a3:f & a65536.End(xlUp).Row)ReDim arr(1 To UBou
56、nd(rng), 1 To 4)For i = 1 To UBound(rng)d(CStr(rng(i, 1) = iNext iFor j = 3 To 5 Step 2For i = 1 To Cells(65536, j).End(xlUp).Row - 2If d(CStr(rng(i, j) Thenarr(d(CStr(rng(i, j), j - 2) = rng(i, j) arr(d(CStr(rng(i, j), j - 1) = rng(i, j + 1) End IfNext iNext jc3.Resize(UBou nd(rng), 4) = arrEnd Sub
57、三、代碼詳解1、Dim d As Object, rng, i%, j%, arr:聲明各個變量。2、Set d = CreateObject(Scripting.Dictionary):創(chuàng)建字典對象 d。3、rng = Range(a3:f & a65536.End(xlUp).Row):把 A 列到 F 列的單元格區(qū)域的值賦給變量 rng。4、ReDim arr(1 To UBound(rng), 1 To 4)|:根據(jù)數(shù)組 rng 的大小重新聲明動態(tài)數(shù)組變量的大小,這里是按最大數(shù)量來聲明,可避免因聲明得小了而導致代碼出錯。5、For i = 1 To UBound(rng):在
58、rng 數(shù)組中逐一循環(huán)。6、d(CStr(rng(i, 1) = i:把 A 列的股票代碼的值用 VBA 轉換函數(shù) CStr 轉換成字符串 以后作為關鍵字,因為如果不作處理有時候遇到00 開始的數(shù)據(jù),可能會失去前面的 0。股票代碼在數(shù)組中的行位置 i 作為關鍵字對應的項,一起加入字典do7、For j = 3 To 5 Step 2:前面的循環(huán)得到了整個字典,下面這兩個循環(huán)用來與字典中的關鍵字比對而重新排位。Step 2 是循環(huán)的步長,j=3 執(zhí)行以后,j=3+2=5,從而跳過 j=4了。呵呵,這是 ForNext 循環(huán)結構的基礎知識,說多了。8、For i = 1 To Cells(6553
59、6, j).End(xlUp).Row - 2:因為 C 列和 E 列的最后一個非空單元格的位置不一樣,所以用了 Cells(65536, j).End(xlUp).Row 在循環(huán)中分別得到這兩列的 最后一個非空單元格的行數(shù),由于數(shù)組rng 是從第 3 行開始的,為了與下面引用的rng數(shù)組對應,所以需要減去2。全句是在 C 列和 E 列中逐一循環(huán)。9、If d(CStr(rng(i, j) Then: rng(i, j)是 C 列或者 E 列的股票代碼,本句是如果這個 股票代碼關鍵字對應的項不等于空的時候,執(zhí)行下面的代碼。10、arr(d(CStr(rng(i, j), j - 2) = rn
60、g(i, j): d(CStr(rng(i, j)=i 見上述 6 的解釋,表示數(shù)組 arr 的第 1 維,相當于行;j-2 是隨著 j=3 的時候,j-2=1 ; j=5 的時候 j-2=3,相當于數(shù)組列的參數(shù)。把相應的股票代碼賦給相同股票代碼的第1 列或者是第 3 列。11、arr(d(CStr(rng(i, j), j - 1) = rng(i, j + 1):把相應的股票名稱賦給相同股票代碼的第2列或者是第 4 列。12、c3.Resize(UBound(rng), 4) = arr:把數(shù)組 arr 賦給 C3 開始的單元格區(qū)域。代碼執(zhí)行后如圖實例 7-2 所示。i21XSh= st2/ih&=;&1衛(wèi)”:目理酬副” X、口 O檢 4 V刃:y 些* =二云圖實例 7-2 示例實例 82 級動態(tài)數(shù)據(jù)有效性問題一、問題的提出:A 列是源名稱,中間有空格, B 列為各個源名稱對應的數(shù)目不同的代號, C 列是目標名 稱來源于源名稱,要求在 C 列設置不重復的、沒有空格的數(shù)據(jù)有效性供選擇;同時 D 列目 標代號,要求隨著 C列選擇的目標名稱的不同,提供對應的代號供選擇,是為第2 級數(shù)據(jù)有
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人借款合同民間借貸
- 有關房屋出售委托合同年
- 湖北房屋租賃合同
- 租賃房屋合同協(xié)議書
- 消防工程專業(yè)分包工程合同
- 建筑施工發(fā)包合同
- 電器售后服務合同書
- 事業(yè)單位聘用合同文本
- 產品購銷合同的細節(jié)條款修訂書
- 重慶水利電力職業(yè)技術學院《建筑結構抗震設計實驗》2023-2024學年第二學期期末試卷
- 新版統(tǒng)編版一年級道德與法治下冊全冊教案(完整版)教學設計含教學反思
- 2025年春季學期學校德育工作計劃安排表(完整版)
- 《幼兒教育政策與法規(guī)》教案-單元4 幼兒園的保育和教育
- 電氣化基本知識-崗培教材編寫86課件講解
- 2024年廣東省公務員錄用考試《行測》試題及答案解析
- 二手人防車位使用權轉讓協(xié)議書
- 人工智能需求文檔6篇
- 物流運籌學課程標準
- 瀝青配合比全套試驗自動計算程序
- 物業(yè)集團績效考核管理制度(完整版)
- 半導體真空精密部件清洗再生項目可行性研究報告-立項申請報告
評論
0/150
提交評論