返回列表 上一主題 發帖

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

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

[版主管理留言]
  • GBKEE(2014/1/11 13:28): 請附檔說明

這問題讓我有點頭大@@

整體作業流程是這樣的

我有2份EXCEL(X,Y),去除掉重複值合成1份EXCEL(Z)
(X,Y->Z)

格式欄位都一樣

目前我是用外部資料的方式

每次打開Z都會更新X,Y的資料

將X,Y的資料抓進Z的sheet2,sheet3
(X=Z的sheet2, Y=Z的sheet3)

這麼做是想說我在Z上作業就好了

如果單純把sheet2,sheet3的資料抓進sheet1,刪除重複值就是我要的了


但現在最大問題是
最後產出的sheet1有幾個欄位會讓使用者填寫,但這些欄位是在X,Y的時候不用填寫的
(設定資料連結的時候只設定sheet2,sheet3會做的欄位,sheet1才會填寫的欄位沒有做連結,因為如果都做連結那更新後就會變空的)



這樣的話我每次做一次更新合併
就會讓原本填寫在sheet1上的資料錯亂掉(因為sheet2,sheet3會變動)

EX:
欄位->            A            B               C(在sheet1時才會輸入資料)

在sheet2       000        111     
在sheet3       222        333

>sheet1        000        111         AAA
                         222        333         BBB


<<更新後>>
欄位->            A            B               C(在sheet1時才會輸入資料)

在sheet2       000        111   
                         444        555
在sheet3       222        333

>sheet1        000        111         AAA
                         444        555         BBB   
                         222        333         



表達上有些複雜

不知各位大大有沒有什麼想法可以改善

麻煩了 謝謝  :  )
用功到世界末日那一天∼∼∼

回復 19# Hsieh

板大不好意思 我敘述上好像會造成誤解

我整理一下
資料來源來自於UserA , UserB
但是UserA , UserB的欄位只有到E欄位"週別        Date        型號        類別        ID"
後面藍色的我忘了刪掉

MATCH後

Match A & B
來自於UserA , UserB
(比對原則依據先前所提的紅字部分->3個(型號,類別,ID)為一組)

但是如果Match A & B 後面藍色部分有資料
下次MATCH的時候

資料一樣來自於
UserA , UserB
可是Match A & B後面藍色部分必須保留

除非UserA , UserB 那邊資料沒了
Match A & B也要跟著整欄刪

EX:

UserA
->  AAA   BBB   CCC
       AAA   BBB    DDD
Match A & B
-> AAA   BBB   CCC    TEST123(前三個為比對的依據,第四個為Match A & B才填入的資料)
      AAA   BBB   DDD    TEST456


<再次MATCH>

UserA(資料改變了)
-> AAA  BBB  EEE
      AAA  BBB  DDD

Match A & B
-> AAA BBB DDD TEST456 (因為一開始比對時有這筆,再次比對一樣又出現時,後面那個資料要留下來)
      AAA BBB  EEE                     (此為新出現的,補在後面)




以上不知這樣清不清楚XDD

煩請大大幫忙看看

如不清楚我再說明

謝謝
用功到世界末日那一天∼∼∼

TOP

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

TOP

本帖最後由 li_hsien 於 2014-1-20 13:34 編輯

回復 17# Hsieh

[attach]17319[/attach]

MATCH比對方式是對的

不過要COPY的只有藍色前面的部分
If d.exists(mystr) Then A.Resize(, 5) = d(mystr): d.Remove mystr
我把8改成5好像就可以了

不過有一個地方怪怪的

就是MATCH的來源是依UsetA,UserB來的

所以如果UserA,UserB沒有的
MATCH那邊必須整欄都刪掉

也就是說
UserA,UserB有的,Match才需要留著


大大的語法好"新"的感覺XDD

幾乎都沒看過 哈哈

我得研究研究了
用功到世界末日那一天∼∼∼

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

回復 1# li_hsien

非常感謝謝 Hsieh 的程式與說明,
總算對 Scripting.Dictionary,Transpose 有初步的概念,
謝謝!!
to Hi-Hsieh:因為我是小學生, 無權下載檔案,
可否將你的檔案 mail 給我, 因我很想研究這個程式, 程式太神奇了
[email protected]

TOP

回復 14# Hsieh

型號&類別&ID為主要判斷準則

UserA , UserB的欄位都一樣

將兩個工作表抓到matchA&B

藍底為matchA&B才會填的欄位


UserA,UserB抓過去的時候

必須對應欄位
如果UserA沒有的,但matchA&B有的欄位(EX:使用者)則留空

因為和matchA&B欄位不一樣
所以不知該如何用原先的方式對應


附檔裡的matchA&B為該產出的結果

麻煩幫我看看 謝謝 : )

match0117.zip (20.53 KB)
用功到世界末日那一天∼∼∼

TOP

回復 13# li_hsien


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

TOP

回復 12# Hsieh

板大 如果我欄位沒有一致
(A,B一樣但和A&B的不一樣)

會變動那該如何表示呢???

因為用Transpose應該是整欄整列吧
用功到世界末日那一天∼∼∼

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

        靜思自在 : 受人點水之恩,須當湧泉以報。
返回列表 上一主題