Board logo

標題: [發問] 比對多筆資料 [打印本頁]

作者: lalalada    時間: 2012-8-17 16:55     標題: 比對多筆資料

[attach]12170[/attach]
如附檔
有多筆商品報價資料
但是每種商品的資料日期不完全一樣
現在想跑統計回歸 所以想取出報價日期的交集
即只有當某日期有商品皆有報價資料時才採用 否則捨棄
一開始想到使用countif 抓出皆有的資料
但效率不甚好 然後想到用陣列
不知道如何比對不同陣列間的資料呢?
ex. 陣列a()中任一筆資料(日期)若存在於其他所有陣列則保留
最大問題點在於某一日期雖存在於所有陣列
但是位置不固定
所以無法以簡單迴圈跑完
若是連續使用雙迴圈的話好像會很慢(因為有多個陣列)
所以想知道有沒有快速比較資料存在的方法
或是有其他可以比對大量資料的方式?
感謝~
作者: white945    時間: 2012-8-17 19:10

回復 1# lalalada
  1. Sub 抓取日期交集()
  2. Dim Ay(), Ty()
  3. Set d = CreateObject("Scripting.Dictionary")
  4. Set d1 = CreateObject("Scripting.Dictionary")
  5. ar = Range("A1").CurrentRegion.Value
  6. ReDim Preserve Ty(0)
  7. Ty(0) = "Date"
  8. For j = 1 To UBound(ar, 2) Step 2
  9. k = k + 1
  10. ReDim Preserve Ty(k)
  11. Ty(k) = ar(3, j + 1)
  12.   For i = 5 To UBound(ar, 1)
  13.   If IsDate(ar(i, j)) Then
  14.     d(ar(i, j)) = d(ar(i, j)) + 1
  15.     If IsEmpty(d1(ar(i, j))) Then
  16.       ReDim Preserve Ay(0)
  17.       Ay(0) = ar(i, j + 1)
  18.       d1(ar(i, j)) = Ay
  19.     Else
  20.       Ay = d1(ar(i, j))
  21.       ReDim Preserve Ay(UBound(Ay) + 1)
  22.       Ay(UBound(Ay)) = ar(i, j + 1)
  23.       d1(ar(i, j)) = Ay
  24.     End If
  25.     Erase Ay
  26.   End If
  27.   Next
  28. Next
  29. For Each ky In d.keys
  30.   If d(ky) <> k Then d1.Remove ky
  31. Next
  32. Cells(3, k * 2 + 3).Resize(, k + 1) = Ty
  33. Cells(4, k * 2 + 3).Resize(d1.Count, 1) = Application.Transpose(d1.keys)
  34. Cells(4, k * 2 + 4).Resize(d1.Count, k) = Application.Transpose(Application.Transpose(d1.items))
  35. End Sub
複製代碼

作者: lalalada    時間: 2012-8-18 23:05

回復 2# white945

好耶!
字典搭配陣列果然是整理資料的好工具
我再研究一下
感謝你:)
作者: Andy2483    時間: 2023-4-14 11:55

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

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

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


Option Explicit
Sub TEST()
Dim Brr, Crr, V, Y, R&, i&, j&, N&, T$, Tv
Dim xR As Range, Sh As Worksheet
Set Y = CreateObject("Scripting.Dictionary")
Set Sh = Sheets("5Y-Data")
Set xR = Intersect(Sh.[A1].CurrentRegion, Sh.UsedRange.Offset(2, 0))
Brr = xR
For i = 1 To UBound(Brr)
   For j = 1 To UBound(Brr, 2) Step 2
      T = Brr(i, j): Tv = Brr(i, j + 1)
      If i = 1 Then T = "Date"
      If T = "" Then GoTo i01
      Y(T) = Y(T) + 1: Y(T & "|c") = j \ 2 + 1
      Y(T & "|" & Y(T & "|c")) = Tv
      If Y(T) = 6 Then R = R + 1
   Next
i01:
Next
ReDim Crr(1 To R, 1 To 7)
For Each V In Y.keys
   If Y(V) = 6 And InStr(V, "|") = 0 Then
      N = N + 1: Crr(N, 1) = V
      For j = 1 To 6
         Crr(N, j + 1) = Y(V & "|" & j)
      Next
   End If
Next
With Sh.[O3].Resize(R, 7)
   .EntireColumn.ClearContents
   .Value = Crr
End With
Set Y = Nothing: Set xR = Nothing: Set Sh = Nothing: Erase Brr, Crr
End Sub




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