Board logo

標題: [發問] 資料處理-找出唯一的資料 [打印本頁]

作者: hugh0620    時間: 2012-3-26 10:34     標題: 資料處理-找出唯一的資料

本帖最後由 hugh0620 於 2012-3-26 10:35 編輯

Dear 大大們
          小弟經常需要對重覆多筆數據將其濃縮成唯一的資料~
          在這個處理上,基本的作法都是採用[進階篩選]的方式,先將資料處理成唯一後,
          再進行後續加工成為需要的結果~
          最多處理的是兩欄的資料,如附檔及下圖
          依data A為主,將符合data A的data B資料找出來~
          像這樣的資料,我的處理方式大概如下
          1. [進階篩選]AB欄位,選擇不重覆
          2. [進階篩選]的結果,再用迴圈+IF判斷得到最後的結果
          拋出這個問題,請大大有教於我

[attach]10151[/attach]
[attach]10152[/attach]
作者: Hsieh    時間: 2012-3-26 10:44

回復 1# hugh0620
  1. Sub Ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. ar = Range("A1").CurrentRegion.Value
  4. For i = 1 To UBound(ar, 1)
  5.   If d(ar(i, 1)) = "" Then
  6.      d(ar(i, 1)) = ar(i, 2)
  7.      ElseIf InStr(d(ar(i, 1)), ar(i, 2)) = 0 Then
  8.      d(ar(i, 1)) = d(ar(i, 1)) & "/" & ar(i, 2)
  9.   End If
  10. Next
  11. [J:K] = ""
  12. [J1].Resize(d.Count, 1) = Application.Transpose(d.keys)
  13. [K1].Resize(d.Count, 1) = Application.Transpose(d.items)
  14. End Sub
複製代碼

作者: hugh0620    時間: 2012-3-26 13:57

回復 2# Hsieh

Hsieh 大大~ 很感謝你的回覆~
這就是我想要了解及想要更深入學習來應用的語法~
可以猜得出整個撰寫的邏輯,但不清楚一些語法的使用方式~
請大大能解釋一下~ 幫小弟解惑一下
  1. Sub Ex()

  2. Set d = CreateObject("Scripting.Dictionary")
  3. '問題CreateObject:建立並傳回對於 ActiveX 物件的引用。
  4. '["Scripting.Dictionary"]<==這是什麼意思呢??
  5. '因為大大有些時候用的方式,按F1是查不到的

  6. ar = Range("A1").CurrentRegion.Value
  7. 'CurrentRegion:傳回 Range 物件,該物件代表目前的區域。目前區域是指以任意空白列及空白欄的組合為邊界的範圍。
  8. '小弟猜ar是否為由A1開始到空白邊界的儲存格範圍

  9. For i = 1 To UBound(ar, 1)
  10. 'UBound:表示指定陣列某維最大可使用的陣列索引。
  11. '用UBound來抓取ar範圍一維的最大陣列索引。

  12.   If d(ar(i, 1)) = "" Then
  13. 'd 是第一句Set d = CreateObject("Scripting.Dictionary")中的d,但不了解怎麼解讀。
  14.      d(ar(i, 1)) = ar(i, 2)
  15.      ElseIf InStr(d(ar(i, 1)), ar(i, 2)) = 0 Then
  16. 'InStr是用來比對d(ar(i, 1)), ar(i, 2)是否有一樣的資料,若沒有一樣則show0,0=0就是表示ar(i, 2)是要新增的
  17.      d(ar(i, 1)) = d(ar(i, 1)) & "/" & ar(i, 2)
  18.   End If
  19. Next
  20. [J:K] = ""
  21. [J1].Resize(d.Count, 1) = Application.Transpose(d.keys)
  22. [K1].Resize(d.Count, 1) = Application.Transpose(d.items)
  23. 'Application.Transpose(d.keys)與Application.Transpose(d.items) 就一點頭緒也沒有,不知道怎麼使用??
  24. End Sub
複製代碼

作者: Hsieh    時間: 2012-3-26 15:40

回復 3# hugh0620
認識Dictionary   
VBA說明檔請由FileSystemObject 物件說明中的【請參閱】中搜尋
[attach]10154[/attach]
Application.Transpose(d.keys)與Application.Transpose(d.items)這只是將字典物件的索引陣列與內容陣列轉置
字典物件可用比較簡單的概念來理解
物件中會存在2個陣列keys,items
keys是儲存關鍵字的陣列
items是對應關鍵字的內容陣列
每一個key會對應一個item
這兩個陣列存在是橫向排列,所以,當要寫入儲存格時,必須轉成與儲存格同向的陣列
若以物件的add方法加入元素時,如果關鍵字(key)重複時會產生錯誤,必須先檢查是否已經存在該項目(這個特性用來取得不重複清單)
使用diction(key)=item這樣的方式加入項目,會以後來的item取代原先 的item
若有任何問題,歡迎提出討論,也請對此物件熟悉的朋友加入討論
作者: hugh0620    時間: 2012-3-26 18:19

回復 4# Hsieh


    Hsieh 大大~ 這個東西比較抽象一些~ 要花點時間來消化一下~
    小弟再將理解的結果~ 分享一下~ 再請大大指正一下~
作者: GBKEE    時間: 2012-3-26 18:39

回復 3# hugh0620
'["Scripting.Dictionary"]<==這是什麼意思呢??,'因為大大有些時候用的方式,按F1是查不到的
Dictionary 物件 ->字典物件 : 就像查字典 ,查到一個關鍵字(Key)後有相對的說明 (Item)
Key  該關鍵字用來取出單個項目,通常是整數或字串,可以是除陣列外的任何型態
Item  可以是任何型態的

查看 Dictionary 物件 的說明 如圖

[attach]10155[/attach]
作者: hugh0620    時間: 2012-3-27 09:07

回復 6# GBKEE


    謝謝G大大~ 教導~ 小弟會好好理解的~
作者: hugh0620    時間: 2012-3-27 11:32

回復 4# Hsieh

   Hsieh 大大~ 很謝謝你的指導~
   仔細的去了解Dictionary的說明與您的程式碼~
   在應用上受益良多~  在兩個比對上的應用不用像以前要多次篩選後~ 才能完成~

   小弟亦針對在比對上再提出一些問題,請大大們再有教於我
   Dictionary 在處理的是二維的比對~ 亦既是兩兩比較~
   若是想要比對3~N個項目的話~ 大大是否有其他更好的處理方式~
   可以教導一下
  1. a = d.keys
  2. b = d.items
  3. For i = 0 To d.Count - 1
  4.     Range("J" & 1 + i) = a(i)
  5.     Range("K" & 1 + i) = b(i)
  6. Next
  7. '透過Dictionary的範例說明~ 用另外一種比較直覺的表達方式
  8. '與您寫的下面兩行可以達到一樣的功能~
  9. '大大寫的是進階的用法~ 小弟喜歡拆成自己比較直覺的用法~
  10. '不然硬是去套用~ 就比較沒有彈性
  11. '[J1].Resize(d.Count, 1) = Application.Transpose(d.keys)
  12. '[K1].Resize(d.Count, 1) = Application.Transpose(d.items)
複製代碼

作者: hugh0620    時間: 2012-3-27 11:33

回復 6# GBKEE

   G大大~ 也需要請您再指教一番~

   小弟亦針對在比對上再提出一些問題,請大大們再有教於我
   Dictionary 在處理的是二維的比對~ 亦既是兩兩比較~
   若是想要比對3~N個項目的話~ 大大是否有其他更好的處理方式~
   可以教導一下
作者: Hsieh    時間: 2012-3-27 13:51

回復 9# hugh0620


    多項目比對,你的意思是說多欄位相同為一個項目嗎?
這樣可以把多欄位字串連接後當成關鍵字,就能達到多欄位比對
至於擬將keys與items另外以陣列變數轉換,我不以為然,因為keys與items原本就是兩個陣列
只是名稱不同罷了,用法是否比較有彈性,應該也是視情況而定
作者: GBKEE    時間: 2012-3-27 14:29

回復 9# hugh0620
可附上檔案看看
作者: Andy2483    時間: 2023-4-11 11:34

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案如下,請各位前輩指教

執行前:
[attach]36112[/attach]

執行結果:
[attach]36113[/attach]

Option Explicit
Sub TEST()
Dim Brr, Y, i&, T1$, T2$, xR As Range
Set Y = CreateObject("Scripting.Dictionary")
Set xR = Range([B1], Cells(Rows.Count, "A").End(xlUp)): Brr = xR
For i = 1 To UBound(Brr)
   T1 = Brr(i, 1): T2 = Brr(i, 2)
   If Y(T1) = "" Then
      Y(T1) = Y.Count: Brr(Y(T1), 1) = T1: Brr(Y(T1), 2) = T2
      ElseIf InStr(Brr(Y(T1), 2), T2) = 0 Then
         Brr(Y(T1), 2) = Brr(Y(T1), 2) & "/" & T2
   End If
Next
xR.Offset(0, 9).ClearContents: xR.Offset(0, 9).Resize(Y.Count, 2) = Brr
Set Y = Nothing: Set xR = Nothing: Erase Brr
End Sub




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