返回列表 上一主題 發帖

[發問] 兩工作表比對 新增修改

回復 2# li_hsien

是比對重複ID嗎?請說明重複的定義
要記錄的是每個ID的最後出現的資料,還是最先出現的資料?
試試紀錄最後出現的ID資料
  1. Sub ex()
  2. Dim Sh As Worksheet, A As Range
  3. Set dic = CreateObject("Scripting.Dictionary")
  4. For Each Sh In Sheets(Array("User A", "User B"))
  5. With Sh
  6.   For Each A In .Range(.[D1], .[D1].End(xlDown))
  7.   ar = Application.Transpose(Application.Transpose(A.Offset(, -3).Resize(, 4)))
  8.   mystr = Join(ar, Chr(10))
  9.      dic(A.Value) = Split(mystr, Chr(10))
  10.   Next
  11. End With
  12. Next
  13. Sheets("Match A & B").[A1].Resize(dic.Count, 4) = Application.Transpose(Application.Transpose(dic.items))
  14. End Sub
複製代碼
學海無涯_不恥下問

TOP

  1. Sub ex()
  2. Dim A As Range, Sh As Worksheet
  3. Set d = CreateObject("Scripting.Dictionary")
  4. For Each Sh In Sheets(Array("User A", "User B", "Match A & B"))
  5. With Sh
  6.    For Each A In .Range(.[D1], .[D1].End(xlDown))
  7.       d(A.Value) = Application.Transpose(Application.Transpose(A.Offset(, -3).Resize(, 6).Value))
  8.    Next
  9. End With
  10. Next
  11. Sheets("Match A & B").[A1].Resize(d.Count, 6) = Application.Transpose(Application.Transpose(d.items))
  12. End Sub
複製代碼
回復 4# li_hsien
學海無涯_不恥下問

TOP

回復 6# li_hsien

這是利用字典物件的不重複索引特性,將所有的資料寫入字典內容
因為儲存格範圍被視為二維陣列,但因為單列的資料用transpose函數做二次轉置,就會變成一維陣列
將這些一維陣列存入字典內容,字典內容就是多個一維陣列所組成,再經過二次轉置就可成為真正的二維陣列
因為你的match工作表需保留原內容,在最後才讀入就不會被A,B所覆蓋
學海無涯_不恥下問

TOP

回復 8# li_hsien


    一維陣列是指單列資料的集合,是橫向的。
其陣列索引樣式為arr(0)
二維陣列則為多列,所有資料分佈成面。
其陣列索引樣式為arr(0,0)
因為儲存格範圍,EXCEL會視為二維陣列
所以如果儲存格範圍為單列,如[A1:F1]
如果一次轉置,會變成直向陣列,是二維陣列
再一次轉置後,變成橫向,就是一維陣列。
學海無涯_不恥下問

TOP

  1. Sub ex()
  2. Dim A As Range, Sh As Worksheet
  3. Set d = CreateObject("Scripting.Dictionary")
  4. For Each Sh In Sheets(Array("User A", "User B", "Match A & B"))
  5. With Sh
  6.    For Each A In .Range(.[D1], .[D1].End(xlDown))
  7.       mystr = A.Offset(, -3) & A.Offset(, -2) & A
  8.       d(mystr) = Application.Transpose(Application.Transpose(A.Offset(, -3).Resize(, 6).Value))
  9.    Next
  10. End With
  11. Next
  12. Sheets("Match A & B").[A1].Resize(d.Count, 6) = Application.Transpose(Application.Transpose(d.items))
  13. End Sub
複製代碼
回復 11# li_hsien
學海無涯_不恥下問

TOP

回復 13# li_hsien


    不懂什麼A,B一樣A&B不一樣
把資料上傳說明看看
學海無涯_不恥下問

TOP

回復 15# li_hsien
是這樣的意思嗎?
若USER有對照到MATCH_A&B則更新MATCH_A&B
若無對照到MATCH_A&B應則新增USER資料列到MATCH_A&B
若MATCH_A&B資料未出現在USER則保留
  1. Sub ex()

  2.     Dim A As Range, Sh As Worksheet
  3.     Set d = CreateObject("Scripting.Dictionary")
  4.     For Each Sh In Sheets(Array("User A", "User B"))
  5.     With Sh
  6.        For Each A In .Range(.[C2], .[C2].End(xlDown))
  7.           Debug.Print A
  8.           d(A & A.Offset(, 1) & A.Offset(, 2)) = Array(A.Value, Sh.Name, A.Offset(, 1).Value, A.Offset(, -1).Value, A.Offset(, 2).Value, A.Offset(, 3).Value, "", A.Offset(, 4).Value)
  9.        Next
  10.     End With
  11.     Next
  12.     With Sheets("Match A & B")
  13.       For Each A In .Range(.[A2], .[A2].End(xlDown))
  14.          mystr = A & A.Offset(, 2) & A.Offset(, 4)
  15.          If d.exists(mystr) Then A.Resize(, 8) = d(mystr): d.Remove mystr
  16.       Next
  17.       For Each ky In d.keys
  18.         .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(, 8) = d(ky)
  19.       Next
  20.    End With
  21. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 18# li_hsien
15#說到
如果UserA沒有的,但matchA&B有的欄位(EX:使用者)則留空
表示USER內無資料則保留原存在於MATCH的資料
18#說到
MATCH的來源是依UsetA,UserB來的
所以如果UserA,UserB沒有的
MATCH那邊必須整欄都刪掉
這是完全不管MATCH的資料,只留下USER的資料
這兩種敘述好像是衝突的
學海無涯_不恥下問

TOP

        靜思自在 : 看別人不順眼,是自己修養不夠。
返回列表 上一主題