2016-05-06 9 views
1

データを含む2つのExcelスプレッドシートがあります。これらのシートにはID番号とそれに対応する他のデータが入っています。シート1は本質的にすべての既存ID番号(および他の対応するデータ)を含むマスターシートであり、シート2はシート1にあるID番号の一部のみを含む特定のデータセットである(シート2のすべてのID番号が存在するシート1では、他の方法ではありません)。現在、シート1は列AからFのデータを含み、列CのID番号を含み、シート2は列AのID番号を有する列AからCのデータを含む。また、ID番号は移動するにつれて増加するシートを降ろし、それぞれのシートの各ID番号は一意です。Excelマクロを結合する2つのExcelデータを重複データに基づいて変換する

シート2のIDがシート1のIDと等しい場合は、シート2の列BとCをシート1の対応する行の最後までタックしたいと思いますが、その後、さらに明確にするためにシート2に同じID番号が存在しないシート1の任意の行を削除、シート1は、次のようになります。

+-------+----------+--------+--------------+ 
|Year |Country | ID #: |Columns D,E,F | 
+-------+----------+--------+--------------+ 
|2012 |CA  |123456 |data   | 
+-------+----------+--------+--------------+ 
|2015 |US  |565382 |data   | 
+-------+----------+--------+--------------+ 
|2008 |US  |765382 |data   | 
+-------+----------+--------+--------------+ 
|2012 |CA  |956471 |data   | 
+-------+----------+--------+--------------+ 

シート2は、次のようになります。

+-------+----------+--------+ 
|ID #: |Quantity |Value | 
+-------+----------+--------+ 
|123456 |435  |12523 | 
+-------+----------+--------+ 
|765382 |1136  |52342 | 
+-------+----------+--------+ 
|956471 |49  |5562 | 
+-------+----------+--------+ 

次に、同じID番号を持つ行を結合して、シート1からすべてのものを削除した後我々が得る、シート2から該当するIDが含まれていない:私のシートは数百数千行のを含んでいるので

+-------+----------+--------+--------------+-----------+---------+ 
|Year |Country | ID #: |Columns D,E,F |Quantity |Value |   
+-------+----------+--------+--------------+-----------+---------+ 
|2012 |CA  |123456 |data   |435  |12523 |   
+-------+----------+--------+--------------+-----------+---------+ 
|2008 |US  |765382 |data   |1136  |52342 |     
+-------+----------+--------+--------------+-----------+---------+ 
|2012 |CA  |956471 |data   |49   |5562  |   
+-------+----------+--------+--------------+-----------+---------+ 

、私はこれを手動で行うことができないので、私ははるかに効率的にこのタスクを完了することができ、マクロを必要としています。ここで

私がこれまで持っているものである:多分

Sub mergeSheets() 

Dim c As Range, cfind As Range, x, dest As Range, cfind1 As Range 
On Error Resume Next 
Worksheets("sheet3").Cells.Clear 
With Worksheets("Sheet1") 
.UsedRange.Copy Worksheets("sheet3").Range("a1") 

For Each c In Range(.Range("a2"), .Range("c2").End(xlDown)) 
x = c.Value 

    With Worksheets("sheet2") 
    Set cfind = .Cells.Find(what:=x, lookat:=xlWhole) 
    If cfind Is Nothing Then GoTo line1 
    .Range(cfind.Offset(0, 1), cfind.End(xlToRight)).Copy 
     With Worksheets("sheet3") 
     Set cfind1 = .Cells.Find(what:=x, lookat:=xlWhole) 
     If cfind1 Is Nothing Then GoTo line1 
     cfind1.End(xlToRight).Offset(0, 1).PasteSpecial 
     End With 'sheet3 
    End With 'sheet2 
line1: 
Next 
End With 'Sheet 1 
    Application.CutCopyMode = False 


End Sub 

おかげ

+0

何を試しましたか? SOは "私のためのコード"サイトではなく、 "自分のコードを手伝ってくれます"。質問する方法については、[How to Ask](http://stackoverflow.com/help/how-to-ask)を参照してください。これまでに試したコード/マクロ/公式を投稿してください。 – BruceWayne

+0

なぜVBAですか?単にシート1に 'VLOOKUP'を使って、'#N/A'を除外してみるのはなぜですか? –

+0

だからどこに行きましたか? – Davesexcel

答えて

0

あなたのコードとは異なるアプローチで、シート1の列Cをループし、取得した後、Sheet2の中columnAでID番号を見つけます情報、コピー、貼り付けは不要です。

Sub Get_It() 
    Dim sh As Worksheet, ws As Worksheet 
    Dim LstRw As Long, Rng As Range, c As Range, Fx As Range 

    Set sh = Sheets("Sheet1") 
    Set ws = Sheets("Sheet2") 

    With sh 

     LstRw = .Cells(.Rows.Count, "C").End(xlUp).Row 
     Set Rng = .Range("C2:C" & LstRw) 

     For Each c In Rng.Cells 

      Set Fx = ws.Columns(1).Find(what:=c, lookat:=xlWhole) 

      If Not Fx Is Nothing Then 
       c.Offset(, 4) = Fx.Offset(, 1) 
       c.Offset(, 5) = Fx.Offset(, 2) 

      Else: MsgBox c & " is Not Found"' remove msgbox if desired, just an example 

      End If 

     Next c 

    End With 

End Sub 
関連する問題