本帖最后由 zorsite 于 2015-6-25 17:35 編輯
在學(xué)習(xí)字典的過程中,,發(fā)現(xiàn)諸多高手都習(xí)慣性的運(yùn)用數(shù)組,,似乎我們?cè)诿恳粋€(gè)運(yùn)用字典的案例中都能發(fā)現(xiàn)數(shù)組的影子。
對(duì)于新手而言,,這種思維模式似乎有些困難,。就像我一直用網(wǎng)銀轉(zhuǎn)賬,忽然有人告訴我用微信轉(zhuǎn)賬吧,,更方便,!一開始我接受不了,但是經(jīng)不住很多人都這樣告訴我,,而我也將信將疑的試用一兩次,,結(jié)果發(fā)現(xiàn):哎,真的呀,,是更方便更快捷,!
那么數(shù)組就是這樣一種更方便更快捷的方式。
我們舉個(gè)很簡(jiǎn)單的例子,,用字典來(lái)查找數(shù)據(jù),。很多初學(xué)者會(huì)說(shuō):我用vlookup就很好,為什么要用字典呢,?哈哈,,不要糾結(jié)這個(gè)問題了,我們只是練練手,。學(xué)會(huì)了字典我們可以處理其他更復(fù)雜的問題,。
上圖中,要在第二張表中根據(jù)電話號(hào)碼自動(dòng)到第一張表中查找到聯(lián)系人姓名,。如果用字典,,那么思路如下:
1.將第一張表中的數(shù)據(jù)寫入字典。電話號(hào)碼是關(guān)鍵字key,,姓名是項(xiàng)item,。
2.根據(jù)第二張表中D列的電話號(hào)碼在字典中找到相應(yīng)key的item,寫入E列相應(yīng)單元格,。
這是一種非常簡(jiǎn)單的思路,,至少我的第一反應(yīng)是這樣。
下面是代碼:
- Sub 查找()
- Dim d As New Dictionary
- Dim i As Long
- t = Timer
- Sheet2.Columns('E').Clear
- Sheet2.[E1].Value = '聯(lián)系人' '清空原有聯(lián)系人數(shù)據(jù)
- For i = 1 To Sheet1.Cells(1, 1).End(xlDown).Row
- d(Sheet1.Cells(i, 1).Value) = Sheet1.Cells(i, 2).Value
- Next
- '把所有電話和聯(lián)系人讀入到字典中,。
- For i = 1 To Sheet2.[d1048576].End(xlUp).Row - 1
- Sheet2.Cells(i 1, 'E').Value = d(Sheet2.Cells(i 1, 'D').Value)
- Next
- '根據(jù)D列相應(yīng)的數(shù)據(jù),,在字典中找到期聯(lián)系人姓名,然后逐一填寫在E列中相應(yīng)的單元格,。
- Set d = Nothing '清空字典
- MsgBox '不用數(shù)組時(shí)程序運(yùn)行時(shí)間為' & Format((Timer - t) * 1000, '0.00') & '毫秒'
- End Sub
這段代碼只要能搞清d(x)是什么意思就能讀懂,,思路、邏輯渾然天成,,似乎程序就該這樣寫,。直到我發(fā)現(xiàn)了其他人的代碼……
- Sub 查找2()
- Dim d As New Dictionary
- Dim i, n As Long
- t = Timer
- Sheet2.Columns(5).Clear
- Sheet2.[E1].Value = '聯(lián)系人'
- arr = Sheet1.[a1].CurrentRegion
- For i = 1 To UBound(arr)
- d(arr(i, 1)) = arr(i, 2)
- Next '把所有電話和聯(lián)系人讀入到字典中,。
- n = Sheet2.[d1048576].End(xlUp).Row - 1
- brr = Sheet2.[d2].Resize(n, 2)
- '創(chuàng)建一個(gè)n行2列的數(shù)組,放置進(jìn)出貨記錄中的電話和將要聯(lián)系人的聯(lián)系人姓名,。
- For i = 1 To n
- brr(i, 2) = d(brr(i, 1))
- Next '在字典中找到每個(gè)聯(lián)系電話的聯(lián)系人,,并將結(jié)果寫入數(shù)組。
- Sheet2.[d2].Resize(n, 2) = brr '將數(shù)組中的數(shù)據(jù)(n行2列,,包括原有的電話信息)一次性的寫入D,、E列(覆蓋D列原有數(shù)據(jù))。
- Set d = Nothing '清空字典
- MsgBox '不用數(shù)組時(shí)程序運(yùn)行時(shí)間為' & Format((Timer - t) * 1000, '0.00') & '毫秒'
- End Sub
這段代碼讀起來(lái)就有些費(fèi)勁,,它運(yùn)用了兩個(gè)數(shù)組,。
它先把第一張表中的數(shù)據(jù)寫入到了ARR數(shù)組中,然后再寫入到字典,。
查找聯(lián)系人的時(shí)候,,又用了一次數(shù)組。先把字典中找到的數(shù)據(jù)寫入數(shù)組,,然后一次性的將數(shù)組數(shù)據(jù)寫入對(duì)應(yīng)區(qū)域,。
這段代碼與第一段代碼思路上的不同在于:
只要涉及到“一系列”的數(shù)據(jù),就用數(shù)組,,或者說(shuō):只要有“整塊”的數(shù)據(jù)區(qū)域,,就用數(shù)組。
第一段代碼運(yùn)行最短時(shí)間為89毫秒,,而第二段代碼運(yùn)行的最短時(shí)間為42毫秒,。
實(shí)踐證明,善用數(shù)組,,比逐一讀取,、寫入單元格的效率要高很多。
分享到新浪微博
|