返回列表 上一主題 發帖

[發問] 如何尋找相同資料並複製其他欄位

[發問] 如何尋找相同資料並複製其他欄位

各位好,主題可能有點表意不清
但我的意思是想要將SHEET1中的A.B.C欄位跟SHEET2比對
若SHEET2欄位A.B.C資料跟SHEET1相符則複製該列DEF資料到SHEET2
要注意的是,SHEET2的筆數可能會變動

嘗試用vlookup寫過但不知道是哪裡卡住一直都寫不出來
後來也試著用 Application.WorksheetFunction.Match 來寫,但是小弟功力不到沒辦法將A欄 (日期) 跟B欄(時間)做比對
是否有高人可以指點如何才能達到我想要的目的呢?
如果問錯問題或者冒犯了,還請多多包涵

附圖


並附上檔案供參考
comparison.rar (9.27 KB)

本帖最後由 hugh0620 於 2012-9-30 19:17 編輯

回復 1# cslinmiso

============================================
在使用時~ 可能要考量一下函數的意義與比對資料的方式~
您總共要比對三個欄位的資料~ 所以~ 用vlookup與match比較不適當~
vlookup用在同一欄進行比對~ 但您有三個欄位要比對~~ 寫法上不實用~ 且複雜~
可以更直覺的用if 判斷 abc三欄同一列的資料是否一樣~
============================================

個人的寫法是當您在sheet2中輸入資料~
要判斷
1. 是否在column1.2.3輸入資料
2.  column1.2.3資料是否輸入完整
3. 最後將sheet2新入輸的資料從sheet1的第一筆資料開始比對~ 找資料是否有與sheet1相符的~
    如果有就將資料抓取到sheet2

缺點: 當sheet1中有重覆的資料~ 就會被覆蓋~

提供給您參考~
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. A = Target.Column
  3. B = Target.Row
  4. If A > 3 Then Exit Sub

  5. Select Case A
  6. Case 1
  7.      If Target.Offset(0, 1) = "" And Target.Offset(0, 2) = "" Then Exit Sub
  8. Case 2
  9.      If Target.Offset(0, -1) = "" And Target.Offset(0, 1) = "" Then Exit Sub
  10. Case 3
  11.      If Target.Offset(0, -2) = "" Or Target.Offset(0, -1) = "" Then Exit Sub
  12. End Select
  13. I = 0
  14. Do Until Sheet1.Range("A" & 2 + I) = ""
  15.    If Sheet1.Range("A" & 2 + I) = Sheet2.Range("A" & B) And Sheet1.Range("B" & 2 + I) = Sheet2.Range("B" & B) And Sheet1.Range("C" & 2 + I) = Sheet2.Range("C" & B) Then
  16.       Sheet2.Range("D" & B) = Sheet1.Range("D" & 2 + I)
  17.       Sheet2.Range("E" & B) = Sheet1.Range("E" & 2 + I)
  18.       Sheet2.Range("F" & B) = Sheet1.Range("F" & 2 + I)
  19.    End If
  20. I = I + 1
  21. Loop

  22. End Sub
複製代碼
學習才能提升自己

TOP

本帖最後由 cslinmiso 於 2012-9-30 20:44 編輯

回復 2# hugh0620

謝謝您的回應,非常感謝。
但我套用您的公式試執行後出現錯誤13 型態不符合
是否為哪裡有錯誤或者小弟哪裡弄錯了呢?
謝謝
  1. Case 1
  2.      If Target.Offset(0, 1) = "" And Target.Offset(0, 2) = "" Then Exit Sub
複製代碼
是在此發生錯誤的。
很多事情,開始做了之後才發現很簡單,
真正難的是怎麼完美地發揮自身的狀態。

TOP

回復 3# cslinmiso

要不要把您執行有誤的檔案PO上來~ 看看問題在哪~

原本我以為是版本的問題~  (我自己是用2003)
後來用2007執行也沒有問題~
學習才能提升自己

TOP

回復 1# cslinmiso
使用Dictionary物件
  1. Option Explicit
  2. Sub Ex()
  3.     Dim d As Object, Rng As Range
  4.     Set d = CreateObject("SCRIPTING.DICTIONARY")  '設立 Dictionary物件
  5.     Set Rng = Sheets("sheet1").[a2]
  6.     Do
  7.         d(Format(Rng, "yyyy/m/d") & Format(Rng.Offset(, 1), "hh:mm") & Rng.Offset(, 2)) = Rng.Offset(, 3).Resize(, 3)
  8.         '2012/9/2200:30Aaron        -> Dictionary物件的 key: Format(Rng, "yyyy/m/d") & Format(Rng.Offset(, 1), "hh:mm") & Rng.Offset(, 2)
  9.         'Rng.Offset(, 3).Resize(, 3)-> Dictionary物件的 item (D:E:F欄)
  10.         Set Rng = Rng.Offset(1)                   '變數物件 下移一列
  11.     Loop Until Rng.Value = ""                     '變數物件內容=空白字串離開迴圈
  12.     Set Rng = Sheets("sheet2").[a2]
  13.     Do
  14.         If d.Exists(Rng.Text & Rng.Offset(, 1).Text & Rng.Offset(, 2)) Then
  15.             'Exists 方法 如果在 Dictionary 物件中指定的關鍵字存在,傳回 True,若不存在,傳回 False。
  16.             Rng.Offset(, 3).Resize(, 3).Value = d(Rng & Rng.Offset(, 1).Text & Rng.Offset(, 2))
  17.              'D:F欄.Value=Dictionary物件的item
  18.         End If
  19.         Set Rng = Rng.Offset(1)
  20.     Loop Until Rng = ""
  21. End Sub
複製代碼

TOP

回復 3# cslinmiso

時間是否也要相同?
  1. Sub ex()
  2. Dim Mystr$, d As Object, A As Range
  3. Set d = CreateObject("Scripting.Dictionary")
  4. With 工作表1
  5. For Each A In .Range(.[A2], .[A2].End(xlDown))
  6.    Mystr = Join(Application.Transpose(Application.Transpose(A.Resize(, 3))), ",")
  7.    d(Mystr) = A.Offset(, 3).Resize(, 3)
  8. Next
  9. End With
  10. With 工作表2
  11. For Each A In .Range(.[A2], .[A2].End(xlDown))
  12.    Mystr = Join(Application.Transpose(Application.Transpose(A.Resize(, 3))), ",")
  13.   A.Offset(, 3).Resize(, 3) = d(Mystr)
  14. Next
  15. End With
  16. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 5# GBKEE
非常感謝GBKEE版主,試用後得到我想要的結果:)
小弟不材還需要跟各位多討教
想請問一個問題,若今日需要在另外一份檔案搜尋(假設為Sheet1的資料)
是否將    Set Rng = Sheets("sheet1").[a2] 此行
定義成worksheet.sheet("檔名").[a2] 即可呢?

hugh0620大哥
已附上檔案
若是小弟操作方面錯誤還得見諒,此外感謝大力協助


comparison.rar (17.51 KB)
很多事情,開始做了之後才發現很簡單,
真正難的是怎麼完美地發揮自身的狀態。

TOP

回復 6# Hsieh

是的,日期時間名字都必須完全符合才複製DEF欄位的資料至該欄。
謝謝協助 :)
很多事情,開始做了之後才發現很簡單,
真正難的是怎麼完美地發揮自身的狀態。

TOP

Hsieh 版主,您的程式也執行成功
但概念以及程式用法上,小弟尚有不解,可否請您簡述一下呢?
同是利用Dictionary物件
您的程式硬是少上許多,這其中有什麼差異呢?
謝謝

PS:小弟並非有意發這麼多次文,係為時間差,又想到問題想問。請見諒
很多事情,開始做了之後才發現很簡單,
真正難的是怎麼完美地發揮自身的狀態。

TOP

回復 7# cslinmiso
"是否將    Set Rng = Sheets("sheet1").[a2] 此行  定義成worksheet.sheet("檔名").[a2] 即可呢?"
你試試就知道

TOP

        靜思自在 : 世上有兩件事不能等:一、孝順 二、行善。
返回列表 上一主題