Board logo

標題: [轉貼] Dictionary物件的認識與應用 [打印本頁]

作者: Hsieh    時間: 2010-4-30 23:00     標題: Dictionary物件的認識與應用

Dictionary物件可視為一個陣列,讓你放入數字或文字。
那麼它和一般陣列有何不同? Dictionary像一個二維陣列,
裡面每一筆資料包含索引值與資料內容兩個欄位;
於是可以方便的透過Dictionary的Exists函數用來檢查及比對資料,
例如你可用來檢查資料是否重覆。
Dictionary也擁有 Add, Remove, RemoveAll... 等方法,可處理其中的值。

以下的範例建立一個 Dictionary物件:
Dim nums As Object
Set nums = CreateObject("Scripting.Dictionary")

以下的語法把資料加入 Dictionary物件:
dictionary_object.Add index, content
索引值可以是數值或字串。
範例:
nums.Add Cells(1,1), Cells(1,1)

以下的範例檢查指定值是否存在於 Dictionary物件:
If Not nums.Exists(123) Then Msgbox "不存在" Else Msgbox "存在"

可參考這裡以得到Dictionary較完整的認識 --
http://www.officefans.net/cdb/viewthread.php?tid=13039

應用範例
以下都是在其他論壇回答的案例,所以你也許似曾相識..

範例一. 檢查某值是否存在於某數列(類似工作表的 COUNTIF 函數)
Sub check_Num()
 Dim nums As Object
 Set nums = CreateObject("Scripting.Dictionary")
 For Each n In Array(123, 234, 213, 124)
   nums.Add n, n
 Next
 If nums.Exists(222) Then MsgBox "Found!" Else MsgBox "Not Found!"
 Set nums = Nothing
End Sub

也可以寫成自訂函數。

範例二. 檢查指定欄的重覆值並予以清除 (保留被清除後的空格)
Sub check_Num()
Dim nums As Object
Set nums = CreateObject("Scripting.Dictionary")
For Each c In Array("A", "C") '處理A欄及C欄
  last_row = Cells(65536, c).End(xlUp).Row
  For r = last_row To 1 Step -1
    Set cell = Cells(r, c)
    If Not nums.Exists(cell.Value) Then
      nums.Add cell.Value, cell.Value
    Else
      cell.ClearContents
    End If
  Next r
  nums.RemoveAll '移除Dictionary中的所有資料
Next
Set nums = Nothing
End Sub

範例三. 檢查並剔除指定欄的重覆值 (不保留空格)
Sub check_Num()
Dim nums As Object
Set nums = CreateObject("Scripting.Dictionary")
For Each c In Array("A", "C")
  Set cell = Cells(1, c)
  While cell <> ""
    If Not nums.Exists(cell.Value) Then
      nums.Add cell.Value, cell.Value
    End If
    Set cell = cell.Offset(1, 0)
  Wend
  Columns(c).ClearContents
  r = 1 '從第1列開始再寫回儲存格
  For Each num In nums
    Cells(r, c) = num
    r = r + 1
  Next
  nums.RemoveAll
Next
Set nums = Nothing
End Sub

註:
範例中的需求並非一定要用Dictionary解決,範例只是範例。
同一個案例可能有多種解法,各有優劣,各憑喜好。

以上說明,如有不足或錯誤之處,敬請指正~
如果你有其他的相關應用,也歡迎分享!  

&laquo; 最後編輯時間: 2005-04-03, 21:18:05 由 leonchou &raquo;

http://gb.twbts.com/index.php?topic=510.0
作者: PD961A    時間: 2010-5-5 20:46

註:
範例中的需求並非一定要用Dictionary解決,範例只是範例。
同一個案例可能有多種解法,各有優劣,各憑喜好
Dictionary是字典的意思
如果可用在這些範例中每次顯現的答案都不同
是否還有更好可以運用的地方?畢竟字典就是可以解答我們很多不 知的單字或片語
所以上述網站外還有其他學習的網站囉....如果版主是這個意思的話!
謝謝!!!
作者: Hsieh    時間: 2010-5-6 13:18

回復 2# PD961A


    這文純粹是解釋Dictionary物件的用法
就像你說的同樣的問題有多種不同寫法
你知道此物件特性後才能進一步應用他
至於應用到哪?這種問題就看你遇到再說囉
作者: GBKEE    時間: 2010-5-7 19:00

Dictionary物件可視為一個陣列,讓你放入數字或文字。
Hsieh 發表於 2010-4-30 23:00

也可以放入 Range
Sub Ex()
    Dim D As Object, K
    Set D = CreateObject("Scripting.Dictionary")
    D.Add Cells(1, 1), ""
    D.Add Cells(2, 1), ""
    For Each K In D.KEYS
        MsgBox K.Address
    Next
End Sub
作者: chin15    時間: 2011-3-29 21:30

有關Dictionary物件的應用細節可說是一言難盡
我看過最完整的說明應屬藍橋發表的這篇:
http://www.excelpx.com/thread-145901-1-1.html




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)