返回列表 上一主題 發帖

[發問] 排除儲存格內的重複資料

本帖最後由 stillfish00 於 2013-10-22 20:05 編輯

回復 1# 巴克斯
  1. Sub Test()
  2.   Dim ar, d, i As Long, s
  3.   
  4.   Set d = CreateObject("scripting.dictionary")
  5.   With Sheets(1)
  6.   With .Range(.[A2], .[A2].End(xlDown)).Resize(, 2)
  7.     ar = .Value
  8.     For i = 1 To UBound(ar)
  9.         d.RemoveAll
  10.         For Each s In Split(ar(i, 1), ",")
  11.           d(s) = ""
  12.         Next
  13.         ar(i, 1) = Join(d.keys, ",")
  14.         ar(i, 2) = d.Count
  15.     Next
  16.     .Offset(, 2).Value = ar
  17.   End With
  18.   End With
  19. End Sub
複製代碼

TOP

本帖最後由 stillfish00 於 2013-10-23 14:39 編輯

回復 3# 巴克斯
字典物件說明可參考 http://forum.twbts.com/thread-20-1-1.html
其餘函式請查閱說明。

主要流程為:
對儲存格文字以逗號分解成陣列 (Split函式),
然後存入字典時順便利用字典物件  鍵值必定唯一  來進行篩選 (d(s) = ""),
取回篩選過的所有值 (d.keys),再用逗號合成單一字串 (Join函式),然後寫回儲存格。
  1. Sub Test()
  2.   Dim ar, d, i As Long, s
  3.   
  4.   Set d = CreateObject("scripting.dictionary")  '建立字典物件
  5.   With Sheets(1)
  6.   With .Range(.[A2], .[A2].End(xlDown)).Resize(, 2)  '相當於[A2:B8]
  7.     ar = .Value  '一次性從excel取出
  8.     For i = 1 To UBound(ar)
  9.         d.RemoveAll  '移除所有值
  10.         For Each s In Split(ar(i, 1), ",")  '以逗號分解為陣列
  11.           d(s) = ""
  12.         Next
  13.         ar(i, 1) = Join(d.keys, ",")  '結合陣列為單一字串
  14.         ar(i, 2) = d.Count '元素個數
  15.     Next
  16.     .Offset(, 2).Value = ar  '一次性寫回excel
  17.   End With
  18.   End With
  19. End Sub
複製代碼

TOP

回復 6# 巴克斯
字典如同陣列或Collection,可以想成是存放多筆資料的容器,
其存放的每一筆資料都會包含兩部分:索引值(或稱鍵值、Key)和資料內容
像陣列一樣,索引值必須唯一
但和陣列比較起來,使用字典的好處很多,如:
        索引值不必為數字,可以是有意義的名稱。
        容易隨時新增和移除,不必事先宣告陣列大小。
        有Exists方法容易查找是否包含有某個元素,不必使用迴圈逐一檢查。

前面用的 d(s) 意思就是取得字典d中,對應到s的那筆資料的內容。
d(s) = "" 就是修改對應到s的該筆資料的內容為""

又因為字典的一個特性:
當對字典用索引取回時,若字典不包含該索引值時會自動加入該索引值到字典內
所以用 d(s) = "" 修改內容時,也會把字典中不存在的s加入。

或者,你也可以用這樣的方法寫:
  1.   For Each s In Split(ar(i, 1), ",")
  2.     If Not d.exists(s) Then
  3.       d.Add s, ""
  4.     End If
  5.   Next
複製代碼

TOP

        靜思自在 : 甘願做、歡喜受。
返回列表 上一主題