返回列表 上一主題 發帖

VAB 資料比對及轉寫

VAB 資料比對及轉寫

大家好,最近要寫一個需求是,有二份資料表,二份資料表(資料表名稱:單頭、單身) 有一個共同的KEY 值(不會重覆),二份彼此比對後,會將二份裡面的某些欄位轉入到另一個資料表,
但要有一個判斷是,轉入到另一個資料表的值必須先核對KEY值,不知大家懂不懂我的意思......哈哈,有點難表達




因為寫了一星期 ,卻發現愈寫沒頭緒一直寫不出來,請大家可以給我個方向,謝謝

本帖最後由 luhpro 於 2016-3-25 00:38 編輯

回復 1# maggie1313
一般若遇到 "有一個共同的KEY 值(不會重覆)" 這類的需求,
我會優先使用 Directory 函數來實現.

因為你沒提供範例Excel檔案,
所以我另外做一個,
你可以參照修改實現你的需求.
  1. Private Sub cbMerge_Click()
  2.   Dim lRow&
  3.   Dim sStr$
  4.   Dim vD1, vD2
  5.   
  6.   Set vD1 = CreateObject("Scripting.Dictionary")
  7.   Set vD2 = CreateObject("Scripting.Dictionary")
  8.   
  9.   Sheets("合併").Range([B2], [C100]).Clear
  10.   
  11.   With Sheets("索引一")
  12.     lRow = 2
  13.     While .Cells(lRow, 1) <> ""
  14.       vD1(CStr(.Cells(lRow, 1))) = .Cells(lRow, 2)
  15.       lRow = lRow + 1
  16.     Wend
  17.   End With
  18.   
  19.   With Sheets("索引二")
  20.     lRow = 2
  21.     While .Cells(lRow, 1) <> ""
  22.       vD2(CStr(.Cells(lRow, 1))) = .Cells(lRow, 2)
  23.       lRow = lRow + 1
  24.     Wend
  25.   End With

  26.   With Sheets("合併")
  27.     lRow = 2
  28.     While .Cells(lRow, 1) <> ""
  29.       sStr = .Cells(lRow, 1)
  30.       .Cells(lRow, 2) = vD1(sStr)
  31.       .Cells(lRow, 3) = vD2(sStr)
  32.       lRow = lRow + 1
  33.     Wend
  34.   End With
  35. End Sub
複製代碼
Dictionary實做.zip (10.02 KB)

補充:
如果需要用到整列中不只一欄的資料,
可以索引 列號:
vD1(CStr(.Cells(lRow, 1))) = lRow
再用
Sheets("合併").Cells(lRow, 2) = Sheets("索引一").Cells(vD1(sStr), 欄號)
來取得想要的資料.

另外,建議大家開題文中儘量能一併提供已經打好範例資料的Excel檔案,
這樣回文的人才不用還要自己依照圖片內容一個一個輸入資料建Excel檔案,
可以把時間專注在如何實現你的需求上.

TOP

如果編號有重複的,姓名不同或是城市不同呢?

TOP

回復 3# kim223824
那就改以 編號_姓名 或是 編號_城市  的組合鍵值來做區分.
其中的 _ 可以改為任何系統可接受並足資區分的符號或文數字來取代.

TOP

[attach]23624[/attach]回復 6# maggie1313
你好,我想在請問一下 ,一開始我必須先要把KEY值COPY到合併的資料中,先當KEY值
這樣的方式我要怎樣用?

TOP

回復 7# maggie1313
EF20160328.rar (25.83 KB)
因為不確定是否有上傳附件成功,故重新上傳一次

TOP

本帖最後由 luhpro 於 2016-3-29 21:51 編輯

回復 5# maggie1313
你沒有提供正確結果範例,所以我只能用猜的:
  1. Sub nn()
  2.   Dim lRow&
  3.   Dim wsSou As Worksheet, wsTar As Worksheet
  4.   Dim vD
  5.   
  6.   Set vD = CreateObject("Scripting.Dictionary")
  7.   Set wsSou = Sheets("EF單身")
  8.   Set wsTar = Sheets("合併資料")
  9.   
  10.   lRow = 2
  11.   With wsSou
  12.     While .Cells(lRow, 8) <> ""
  13.       wsTar.Cells(lRow, 1) = .Cells(lRow, 8)
  14.       wsTar.Cells(lRow, 2) = .Cells(lRow, 9) & "-" & .Cells(lRow, 10)
  15.       vD(CStr(.Cells(lRow, 8) & "-" & .Cells(lRow, 9) & "-" & .Cells(lRow, 10))) = lRow
  16.       lRow = lRow + 1
  17.     Wend
  18.   End With
  19. End Sub
複製代碼

TOP

回復 7# luhpro
你好,感謝你的解答。測試後是OK的。但現在我有另個問題想請問,如圖[attach]23643[/attach]
就是我們的合併資料要從第三行開始寫入資料,但後來發現有些問題,想在請教。(如果時間允許是否可簡單加入註解,這樣我就可以自已試著調整才不用每次都麻煩你們)
想在請問二個進階的問題。
1.:延續一開始所問的,如果我有了KEY值,後續我會開始把「EF單頭」跟「EF單身」的欄位開始丟到「合併資料」,那這樣的話我是一樣是依照一開始的程式套用嗎?
2:如圖的表達


謝謝大家幫忙

TOP

回復 8# maggie1313
補上 要從第三行插入資料的圖片[attach]23647[/attach]

TOP

回復 8# maggie1313
補上 要從第三行插入資料的圖片[attach]23647[/attach]

TOP

        靜思自在 : 口說好話、心想好意、身行好事。
返回列表 上一主題