




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、后語常見字典用法集錦及代碼詳解藍橋玄霜前言凡是上過學校的人都使用過字典,從新華字典、成語詞典,到英漢字典以及各種各樣數不勝數的專業字典,字典是上學必備的、經常查閱的工具書。有了它們,我們可以很方便的通過查找某個關鍵字,進而查到這個關鍵字的種種解釋,非常快捷實用。凡是上過EH論壇的想學習VBA里面字典用法的,幾乎都看過研究過northwolves狼版主、oobird版主的有關字典的精華貼和經典代碼。我也是從這里接觸到和學習到字典的,在此,對他們表示深深的謝意,同時也對很多把字典用得出神入化的高手們致敬,從他們那里我們也學到了很多,也得到了提高。字典對象只有4個屬性和6個方法,相對其它的對象要簡潔
2、得多,而且容易理解使用方便,功能強大,運行速度非常快,效率極高。深受大家的喜愛。本文希望通過對一些字典應用的典型實例的代碼的詳細解釋來給初次接觸字典和想要進一步了解字典用法的朋友提供一點備查的參考資料,希望大家能喜歡。給代碼注釋估計是大家都怕做的,因為往往是出力不討好的,稍不留神或者自己確實理解得不對,還會貽誤他人。所以下面的這些注釋如果有不對或者不妥當的地方,請大家跟帖時指正批評,及時改正。字典的簡介字典(Dictionary)對象是微軟Windows腳本語言中的一個很有用的對象。附帶提一下,有名的正則表達式(RegExp)對象和能方便處理驅動器、文件夾和文件的(FileSystemObje
3、ct )對象也是微軟Windows腳本語言中的一份子。字典對象相當于一種聯合數組,它是由具有唯一性的關鍵字(Key)和它的項(Item)聯合組成。就好像一本字典書一樣,是由很多生字和對它們對應的注解所組成。比如字典的“典”字的解釋是這樣的:“典”字就是具有唯一性的關鍵字,后面的解釋就是它的項,和“典”字聯合組成一對數據。常用關鍵字英漢對照:Dictionary字典Key關鍵字Item項,或者譯為 條目字典對象的方法有6個:Add方法、Keys方法、Items方法、Exists方法、Remove方法、RemoveAll方法。Add方法向 Dictionary 對象中添加一個關鍵字項目對。obje
4、ct.Add (key, item)參數object 必選項。總是一個 Dictionary 對象的名稱。 key 必選項。與被添加的 item 相關聯的 key。 item 必選項。與被添加的 key 相關聯的 item。 說明如果 key 已經存在,那么將導致一個錯誤。常用語句:Dim d Set d = CreateObject("Scripting.Dictionary")d.Add "a", "Athens" d.Add "b", "Belgrade"d.Add "c&quo
5、t;, "Cairo"代碼詳解1、Dim d :創建變量,也稱為聲明變量。變量d聲明為可變型數據類型(Variant),d后面沒有寫數據類型,默認就是可變型數據類型(Variant)。也有寫成Dim d As Object的,聲明為對象。2、Set d = CreateObject("Scripting.Dictionary"):創建字典對象,并把字典對象賦給變量d。這是最常用的一句代碼。所謂的“后期綁定”。用了這句代碼就不用先引用c:windowssystem32scrrun.dll了。3、d.Add "a", "Athe
6、ns":添加一關鍵字”a”和對應于它的項”Athens”。 4、d.Add "b", “Belgrade”:添加一關鍵字”b”和對應于它的項”Belgrade”。 5、d.Add "c", “Cairo”:添加一關鍵字”c”和對應于它的項”Cairo”。 Exists方法如果 Dictionary 對象中存在所指定的關鍵字則返回 true,否則返回 false。object.Exists(key)參數object 必選項。總是一個 Dictionary 對象的名稱。 key 必選項。需要在 Dictionary 對象中搜索的 key 值。常用語
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 = "指定的關鍵字已經存在。" Else msg = "指定的關鍵字不存在。" End If代碼詳解1、Di
8、m d, msg$ :聲明變量,d見前例;msg$ 聲明為字符串數據類型(String),一般寫法為Dim msg As String。String 的類型聲明字符為美元號 ($)。2、If d.Exists("c") Then:如果字典中存在關鍵字”c”,那么執行下面的語句。3、msg = "指定的關鍵字已經存在。" :把"指定的關鍵字已經存在。"字符串賦給變量msg。4、Else :否則執行下面的語句。5、msg = "指定的關鍵字不存在。" :把"指定的關鍵字不存在。"字符串賦給變量msg
9、。6、End If :結束If ElseEndif判斷。Keys方法返回一個數組,其中包含了一個 Dictionary 對象中的全部現有的關鍵字。object.Keys( )其中 object 總是一個 Dictionary 對象的名稱。常用語句:Dim d, k Set d = CreateObject("Scripting.Dictionary") d.Add "a", "Athens" d.Add "b", "Belgrade" d.Add "c", "Cai
10、ro" k=d.Keys B1.Resize(d.Count,1)=Application.Transpose(k)代碼詳解1、Dim d, k :聲明變量,d見前例;k默認是可變型數據類型(Variant)。2、k=d.Keys:把字典中存在的所有的關鍵字賦給變量k。得到的是一個一維數組,下限為0,上限為d.Count-1。這是數組的默認形式。3、B1.Resize(d.Count,1)=Application.Transpose(k) :這句代碼是很常用很經典的代碼,所以這里要多說一些。Resize是Range對象的一個屬性,用于調整指定區域的大小,它有兩個參數,第一個是行數,本
11、例是d.Count,指的是字典中關鍵字的數量,整本字典中有多少個關鍵字,本例d.Count=3,因為有3個關鍵字。呵呵,是不是說多了。第二個是列數,本例是1。這樣左邊的意思就是:把一個單元格B1調整為以B1開始的一列單元格區域,行數等于字典中關鍵字的數量d.Count,就是把單元格B1調整為單元格區域B1:B3了。右邊的k是個一維數組,是水平排列的,我們知道Excel工作表函數里面有個轉置函數Transpose,用它可以把水平排列的置換成豎向排列。但是在VBA中不能直接使用該工作表函數,需要通過Application對象的WorksheetFunction屬性來使用它。所以完整的寫法是Appl
12、ication. WorksheetFunction.Transpose(k),中間的WorksheetFunction可省略。現在可以解釋這句代碼了:把字典中所有的關鍵字賦給以B1單元格開始的單元格區域中。Items方法返回一個數組,其中包含了一個 Dictionary 對象中的所有項目。object.Items( )其中 object 總是一個 Dictionary 對象的名稱。常用語句: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見前例;t默認是可變型數據類型(Variant)。2、t=d.Items :把字典中所有的關鍵字對應的項賦給變量t。得到的也是一個一維數組,下限為0,上限為d.Count-1。這是數組的默認形式。3、C1.Resize(d.Count,1)=Application.Transpo
14、se(t) :有了上面Keys方法的解釋這句代碼就不用多說了,就是把字典中所有的關鍵字對應的項賦給以C1單元格開始的單元格區域中。Remove方法Remove 方法從一個 Dictionary 對象中清除一個關鍵字,項目對。object.Remove(key )其中 object 總是一個 Dictionary 對象的名稱。key 必選項。key 與要從 Dictionary 對象中刪除的關鍵字,項目對相關聯。 說明如果所指定的關鍵字,項目對不存在,那么將導致一個錯誤。常用語句: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”關鍵字和與它對應的項。清除之后,現在字典里只有2個關鍵字了。RemoveAll方法RemoveAll 方法從一個 Dictionary 對象中清除所有的關鍵字,項目對。object.RemoveAll( )其中 object 總是一個 Dictionary 對象的名稱。
16、常用語句:Dim d Set d = CreateObject("Scripting.Dictionary") d.Add "a", "Athens" d.Add "b", "Belgrade" d.Add "c", "Cairo" d.RemoveAll代碼詳解1、d.RemoveAll:清除字典中所有的數據。也就是清空這字典,然后可以添加新的關鍵字和項,形成一本新字典。字典對象的屬性有4個:Count屬性、Key屬性、Item屬性、CompareMod
17、e屬性。Count屬性返回一個Dictionary 對象中的項目數。只讀屬性。object.Count其中 object一個字典對象的名稱。常用語句: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見前例;n被
18、聲明為整型數據類型(Integer)。一般寫法為Dim n As Integer 。 Integer 的類型聲明字符為百分比號 (%)。2、n = d.Count :把字典中所有的關鍵字的數量賦給變量n。本例得到的是3。Key屬性在 Dictionary 對象中設置一個 key。object.Key(key) = newkey參數:object 必選項。總是一個字典 (Dictionary) 對象的名稱。 key 必選項。被改變的 key 值。 newkey 必選項。替換所指定的 key 的新值。 說明如果在改變一個 key 時沒有發現該 key,那么將創建一個新的 key 并且其相關聯的 i
19、tem 被設置為空。常用語句: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" :用新的關鍵字”d”來替換指定的關鍵字”c”,
20、這時,字典中就沒有關鍵字c了,只有關鍵字d了,與d對應的項是”Cairo”。 Item屬性在一個 Dictionary 對象中設置或者返回所指定 key 的 item。對于集合則根據所指定的 key 返回一個 item。讀/寫。object.Item(key) = newitem參數object 必選項。總是一個Dictionary 對象的名稱。 key 必選項。與要被查找或添加的 item 相關聯的 key。 newitem 可選項。僅適用于 Dictionary 對象;newitem 就是與所指定的 key 相關聯的新值。 說明如果在改變一個 key 的時候沒有找到該 item,那么將利用
21、所指定的 newitem 創建一個新的 key。如果在試圖返回一個已有項目的時候沒有找到 key,那么將創建一個新的 key 且其相關的項目被設置為空。常用語句: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.
22、Item("c") :獲取指定的關鍵字”c”對應的項。 2、MsgBox :是一個VBA函數,用消息框顯示。如果要詳細了解MsgBox函數的,可參見我的另一篇文章“常用VBA函數精選合集”。CompareMode屬性設置或者返回在 Dictionary 對象中進行字符串關鍵字比較時所使用的比較模式。object.CompareMode = compare參數object 必選項。總是一個 Dictionary 對象的名稱。 compare 可選項。如果提供了此項,compare 就是一個代表比較模式的值。可以使用的值是 0 (二進制)、1 (文本), 2 (數據庫)。 說明
23、如果試圖改變一個已經包含有數據的 Dictionary 對象的比較模式,那么將導致一個錯誤。常用語句: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 ", " Baltimo
24、re"代碼詳解1、d.CompareMode = vbTextCompare :設置字典的比較模式是文本,在這種比較模式下不區分關鍵字的大小寫,即關鍵字”b”和”B”是一樣的。vbTextCompare的值為1,所以上式也可寫為 d.CompareMode =1 。如果設置為vbBinaryCompare(值為0),則執行二進制比較,即區分關鍵字的大小寫,此種情況下關鍵字”b”和”B”被認為是不一樣的。2、d.Add " B ", " Baltimore" :添加一關鍵字”B”和對應于它的項”Baltimore”。由于前面已經設置了比較模式為文
25、本模式,不區分關鍵字的大小寫,即關鍵字”b”和”B”是一樣的,此時發生錯誤添加失敗,因為字典中已經存在”b”了,字典中的關鍵字是唯一的,不能添加重復的關鍵字。實例1 普通常見的求不重復值問題一、問題的提出:表格中人員有很多是重復的,要求編寫一段代碼,把重復的人員姓名以及重復的次數求出來,復制到另一個表格中。如圖實例11所示。論壇網址:圖 實例1-1 二、代碼:Sub cfz()Dim i&, Myr&, ArrDim d, k, tSet d = CreateObject("Scripting.Dictionary")Myr = Sheet1.a65536.
26、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) = Application.Transpose(t)a1.Resize(1, 2) = Array("姓名", "重復個數&
27、quot;)Set d = NothingEnd Sub三、代碼詳解1、Dim i&, Myr&, Arr :變量i和Myr聲明為長整型變量。 也可以寫為 Dim Myr As Long 。Long 的類型聲明字符為(&)。Arr后面沒有寫明數據類型,默認就是可變型數據類型(Variant)。2、Set d = CreateObject("Scripting.Dictionary"):創建字典對象,并把字典對象賦給變量d。這是最常用的一句代碼。所謂的“后期綁定”。用了這句代碼就不用先引用c:windowssystem32scrrun.dll了。3、M
28、yr = Sheet1.a65536.End(xlUp).Row :把表1的A列最后一行不為空白的行數賦給變量Myr。這里用了Range對象的End屬性,它有4個方向參數,此處的xlUp表示向上,它的值為3,所以也可寫成End(3)。xlDown表示向下,它的值為4;xlToLeft表示向左,它的值為1;xlToRight表示向右,它的值為2。4、Arr = Sheet1.Range("a1:g" & Myr):把表1的A1到G列最后一行不為空白的 單元格區域的值賦給變量Arr。這樣Arr就是個二維數組了,用數組替代單元格引用可對執行代碼的速度提高很多很多。5、Fo
29、r i = 2 To UBound(Arr) :ForNext循環結構,從2開始到數組的最大上界值之間循環。因為數組的第一行是表頭。Ubound是VBA函數,返回數組的指定維數的最大可用上界。6、d(Arr(i, 3) = d(Arr(i, 3) + 1 :Arr(i,3)在本例是姓名列,也就是關鍵字列,舉個例子,假如Arr(i,3)=”張三”,這句代碼的意思就是把關鍵字”張三”加入字典,d(key)等于關鍵字key對應的項,每出現一次這個關鍵字,它的項的值就增加1。起到了按關鍵字累加的作用,也正因為有這個作用,所以可使用字典來進行各種匯總統計。后面要講的實例會充分的展現這個作用。7、k=d.
30、keys :把字典d中存在的所有的關鍵字賦給變量k。得到的是一個一維數組,下限為0,上限為d.Count-1。Keys是字典的方法,前面已經講過了。8、t=d.items :把字典d中存在的所有的關鍵字對應的項賦給變量t。得到的也是一個一維數組,下限為0,上限為d.Count-1。Items也是字典的方法,前面也已經講過了。9、Sheet2.Activate :激活表2。10、a2.Resize(d.Count, 1) = Application.Transpose(k) :把字典d中所有的關鍵字賦給以a2單元格開始的單元格區域中。詳細的解釋請見前面的keys方法一節。11、b2.Resize
31、(d.Count, 1) = Application.Transpose(t) :把字典d中所有的關鍵字對應的項賦給以b2單元格開始的單元格區域中。12、a1.Resize(1, 2) = Array("姓名", "重復個數") :Array是一個VBA函數,返回一個下界為0的一維數組。一維數組可以看作是水平排列的,所以賦值給水平的單元格區域不需要用轉置函數了。這里作為表頭一次性輸入。13、Set d = Nothing :釋放字典內存。代碼執行后如圖實例1-2所示。圖 實例1-2 實例2 求多表的不重復值問題一、問題的提出:一工作簿里面有3張工作表上,
32、每張表格的A列都是姓名列,所有這些姓名中有些是重復的,要求編寫一段代碼,在另一個工作表上顯示不重復的姓名。如圖實例21所示。圖 實例2-1 這個問題也很適合用字典來解決。代碼如下:二、代碼: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.En
33、d(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循環結構,這種形式是VBA特有的,用于對對象的循環非常適用。意思是在所有的工作表中依次循環。
34、2、If Sht.Name <> "Sheet4" Then :如果這個工作表的名字不等于”Sheet4”時執行下面的代碼。3、Myr = Sht.a65536.End(xlUp).Row :求得這個工作表A列有數據的最后一行的行數,把它賦給變量Myr。這里用了長整型數據類型(Long),數據范圍最大可到2,147,483,647,是為了避免數據很多的時候會超出整型數據類型(Integer)而出錯,因為整型數據類型數據范圍最大只到32,767。4、Arr = Sht.Range("a2:a" & Myr) :把A列數據賦給數組Arr。
35、5、For i = 1 To UBound(Arr) :ForNext循環結構,從1開始到數組的最大上限值之間循環。Ubound是VBA函數,返回數組的指定維數的最大值。6、d(Arr(i, 1) = “” :這句代碼的意思就是把關鍵字Arr(i,1)加入字典,關鍵字對應的項為空,相當于字典中的這個關鍵字沒有解釋。和d.Add Arr(i,1), ""的效果相同,只是代碼更簡潔一些。7、k=d.keys :把字典d中存在的所有的關鍵字賦給變量k。得到的是一個一維數組,下限為0,上限為d.Count-1。Keys是字典的方法,前面已經講過了。8、Sheet4.a3 .Resi
36、ze(d.Count, 1) = Application.Transpose(k) :把字典d中所有的關鍵字賦給表4以a3單元格開始的單元格區域中。代碼執行后如圖實例2-2所示。圖 實例2-2 實例3 A列中顯示1 1000中被6除余1和余5 的數字(其實有更簡潔的方法)一、問題的提出:有1、2、31000一千個數字,要求編寫一段代碼,在工作表的A列顯示這些數被6除余1和余5的數字。二、代碼:Sub 余1余5() by:狼版主Dim dic As Object, i As Long, arrSet dic = CreateObject("Scripting.Dictionary&qu
37、ot;)For i = 1 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 Lon
38、g, arr :也可把字典變量dic聲明為對象(Object),i As Long是規范的寫法,也可寫成i& 。2、dic.Add i & IIf(Abs(i Mod 6 - 3) = 2, "", ""), "" :這句代碼的內容比較多,用了兩個VBA函數IIf和Abs,用了一個Mod運算符。i Mod 6就是每一個數除6的余數,題目中有兩個要求:余1和與5,為了從1到1000都同時能滿足這兩個要求,所以用了Abs(i Mod 6 - 3) = 2 ,Abs是取絕對值函數。另一個VBA函數IIf是根據判斷條件返回結果
39、,和IfThen判斷結果類似;IIf(Abs(i Mod 6 - 3) = 2, "", "") 這段的意思是如果符合判斷條件,返回”否則返回空”。 i & IIf(Abs(i Mod 6 - 3) = 2, "", "")的意思是把這個數與”或者”連起來作為關鍵字加入字典dic,關鍵字相對應的項為空。比如當i=1時,1是滿足上述表達式的,就把”1” 作為關鍵字加入字典dic;當i=2時,2不滿足上述表達式,就把”2” 作為關鍵字加入字典dic,關鍵字相對應的項都為空。3、arr = WorksheetFu
40、nction.Transpose(Filter(dic.keys, "") :這句代碼的內容分為3部分,第1部分是Filter(dic.keys, "") 其中的Filter是一個VBA函數,VBA函數就是可以直接在代碼中使用的,我們平常使用的函數叫工作表函數,如Sum、Sumif、Transpose等等。Filter函數要求在一維數組中篩選出符合條件的另一個一維數組,式中的dic.keys正是一個一維數組。這里的篩選條件是”,也就是把字典關鍵字中含有的關鍵字篩選出來組成一個新的一維數組,其下標從零開始。第2部分是用工作表函數Transpose轉置這個新
41、的一維數組,工作表函數的使用在前面keys方法一節已經說過了;第2部分是把轉置以后的值賦給數組變量Arr。呵呵,狼版主的代碼是短了,我的解釋卻太長了。4、a1.Resize(UBound(arr), 1) = arr :把數組Arr賦給a1單元格開始的區域中。5、a:a.Replace "", "" :把A列中的所有的都替換為空白,只剩下數字了。代碼詳解的4代碼執行后,如圖實例3-1所示。圖實例3-1 示例代碼全部執行后如圖實例3-2所示。圖實例3-2 示例實例4 拆分數據不重復一、問題的提出:有一列各種手機品牌型號的數據,要求編寫一段代碼,按照品牌劃分
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"
43、; & Myr)Range("c2:e" & Myr).ClearContentsmy = Array("MOTO", "諾基亞", "三星", "索愛")gc = Array("OPPO", "聯想", "天語", "金立", "步步高", "波導", "TCL", "酷派")For x = 1 To UBound(Ar
44、r) For i = 0 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
45、(d.keys) + 1, 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") :針對三個不同的種類
46、,創建d、d1、d2三個字典對象。2、Myr = a65536.End(xlUp).Row :把A列最后一行不為空白的行數賦給變量Myr。3、Arr = Range("a2:a" & Myr) :把A2開始的有數據的單元格區域賦給變量Arr。4、Range("c2:e" & Myr).ClearContents :把C2到E列單元格區域清空。5、my = Array("MOTO", "諾基亞", "三星", "索愛") :VBA函數Array返回一個一維數組,
47、默認下界為0。把Array函數返回的數組賦給變量my(貿易兩漢字的首字母)。6、gc = Array("OPPO", "聯想", "天語", "金立", "步步高", "波導", "TCL", "酷派") :把Array函數返回的數組賦給變量gc(國產兩漢字的首字母)。7、For x = 1 To UBound(Arr) :在A列原始數據的數組中逐一循環。8、For i = 0 To UBound(my) :在my數組中逐一循環。因為有
48、4個貿易機品牌,所以用循環每一個與原始數據比較。9、If InStr(Arr(x, 1), my(i) > 0 Then :VBA函數Instr返回在第1個參數中查找的位置,如果返回結果0,表示在第1個參數中沒有第2個參數存在。本句的意思是如果找到貿易機品牌的話,執行下面的代碼。10、d1(Arr(x, 1) = "" :接上句,如果上面判斷成立,就把Arr(x, 1)加入字典d。11、GoTo 100 :Goto語句用于無條件地轉移到過程中指定的行。這里采用跳出For i循環,一是為了減少循環的次數,比如"MOTO"找到的話,后面3個就不需要找了
49、;二是為了跳過兩個小循環之后的其它品牌加入第3個字典的d2(Arr(x, 1) = ""語句。12、For j循環與上面相同,為了判斷得到國產機類的字典d1。13、d2(Arr(x, 1) = "" :如果上述兩個小循環都不滿足,那么就加入其它品牌類字典里。14、Range("c2").Resize(UBound(d.keys) + 1, 1) = Application.Transpose(d.keys) :最后的3句分別把字典的關鍵字數組轉置后賦給相應的單元格區域。代碼執行后如圖實例4-1所示。圖 實例4-1 示例山菊花版主用了一
50、個字典對象就解決了上述問題。讓我們來學習一下。四、山菊花版主的代碼: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
51、.Transpose(Range(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
53、:e" & nRow) = BrrEnd Sub五、代碼詳解1、pp1 = Join(WorksheetFunction.Transpose(Range(Range("g2"), _ Range("g1").End(xlDown), ",") :這句代碼用了兩個VBA函數Join 和Transpose ,Range("g1").End(xlDown)從G1單元格往下直到最下面的單元格,遇到空白格就停止。因為本例的G14、G15單元格有 另外的數據存在,如果還是用Range("g65536
54、").End(xlUp),那么就會把不需要的數據帶進去,造成結果出錯。Transpose 轉置函數,前面已經介紹過了。Join函數是通過連接某個數組中的多個子字符串而創建的一個字符串,本句代碼執行后得到pp1="MOTO, 諾基亞, 三星, 索愛"。pp2一句同上句一樣,得到另一個字符串。2、nRow = Range("a1").End(xlDown).Row :把A列最后一行不為空白的行數賦給整型變量nRow。3、Arr = Range("a1:a" & nRow) :把A列A1開始的有數據的單元格區域賦給變量Ar
55、r。4、ReDim Brr(1 To nRow, 1 To 3) :用于為動態數組變量Brr重新分配存儲空間。第一維的下界從1到上界nRow,第二維從1到3。5、For i = 2 To nRow :從2到 nRow逐一循環。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) & "*" The
56、n :這里山版主用了比較運算符Like來比較pp1和取自Arr(i, 1)左邊兩個字符,再在前后加任意字符組成的字符串,如果滿足條件為真,那么執行下面的語句。9、s(1) = s(1) + 1 :數組s的第一個元素+1以后賦給數組s的第一個元素。10、Brr(s(1), 1) = Arr(i, 1) :把這個關鍵字賦給第2維為1的另一個數組Brr,也就是我們要求的貿易機類。pp1字符串里都是貿易機類的品牌。11、ElseIf pp2 Like "*" & Left(Arr(i, 1), 2) & "*" Then :同樣,如果滿足國產品牌
57、類這個條件,那么執行下面的代碼。12、s(2) = s(2) + 1 :數組s的第二個元素+1以后賦給數組s的第二個元素。13、Brr(s(2), 2) = Arr(i, 1) :把這個關鍵字賦給第2維為2的另一個數組Brr,也就是我們要求的國產品牌類。pp2字符串里都是國產品牌類的品牌。14、s(3) = s(3) + 1 :前如果條件都不滿足時,數組s的第三個元素+1以后賦給數組s的第三個元素。15、Brr(s(3), 3) = Arr(i, 1) :把這個關鍵字賦給第3維為1的另一個數組Brr,也就是我們要求的其它品牌類。16、Range("c2:e" & n
58、Row) = Brr :把數組Brr賦給c2單元格開始的區域中。實例5 前期綁定的字典實例靈活運用字典裝入對象的功能,把一行作為一個對象裝入到item中,每隔對象可以包含多個value就可以解決問題一、問題的提出:有多列多行數據,其中有重復的行,要求編寫一段代碼,求得不重復的行數據。如圖實例5-1所示。圖 實例5-1 示例二、代碼:Sub 保留原數據() by:ldy888前期綁定,需先引用c:windowssystem32scrrun.dll Dim d As New Dictionary,t For i = 2 To 5 Set d(Cells(i, 1) & "&quo
59、t;) = 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 :本段代碼需要先引用微軟的腳本運行時庫Microsoft Scripting Runtime,可在VBE窗口,從菜單工具引用,然后勾選Microsoft Scripting Runtime,或者點擊瀏覽,在添加引用對話框中選擇c:windowssystem32scrrun.d
60、ll,并打開,確定。完成引用。在本聲明語句中把字典d聲明為New Dictionary。這就是”前期綁定”了。上面的實例用的是創建對象語句:Set d = CreateObject("Scripting.Dictionary"),稱為”后期綁定”。不需要先引用腳本運行時庫。2、Set d(Cells(i, 1) & "") = Range(Cells(i, 1), Cells(i, 4) :把單元格對象加入字典,它對應的項是同一行的單元格區域。注意,這里用了Set,和前面的幾例不一樣哦。如果用Typename(d(Cells(i, 1) &
61、; ""),得到的是一個Range對象。這里的Cells(i, 1) & ""也可以用Cells(i, 1).Value來代替。3、t=d.items :把字典d中存在的所有的關鍵字對應的項賦給變量t。得到的是一個一維數組,下限為0,上限為d.Count-1。4、A11.Resize(d.Count, 4) = Application.Transpose(Application.Transpose(t) :這句用了兩次工作表轉置函數Transpose之后賦給A11單元格開始的區域中。 代碼執行后如圖實例5-2所示。圖 實例5-2示例實例6 多條件復雜匯總一、問題的提出:有一個表格,需要對其中多個條件相同的數量進行合并匯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 起點合作協議合同協議
- 解除無固定合同協議
- 設備共用協議書范本
- 購買商鋪電子合同協議
- 財產分割協議書范本
- 解除房產協議書范本
- 訂貨訂金協議書范本
- 購買五險險合同協議
- 《第04節 機械能守恒定律》導學案1
- 2025年金融專業知識考試試題及答案
- 電梯的應急預案培訓
- GB/T 45166-2024無損檢測紅外熱成像檢測總則
- 《水分測定法培訓》課件
- 某海上平臺的油氣集輸工藝設計20000字【論文】
- 脫硝催化劑環境影響評估-洞察分析
- 白細胞疾病及其檢驗(血液學檢驗課件)
- 骨科圍手術期課件
- 【MOOC】《研究生英語科技論文寫作》(北京科技大學)中國大學MOOC慕課答案
- 案例3 哪吒-全球首個“海空一體”跨域航行器平臺
- T-CTSS 3-2024 茶藝職業技能競賽技術規程
- 產科護士進修個人總結5篇
評論
0/150
提交評論