• ベストアンサー

VBAを使った、Excelでのシート間データ抽出

はじめまして。みなさまどうか教えてください。 Sheet1にはA列に250行程、コードが存在します。 Sheet2にはA列(コード)からI列まで、そして1000行程データが存在します。 Sheet1にあるコードは重複はなく、Sheet2のコード内に必ず同じコードがあります。 Sheet2にも重複コードはありません。 そこでSheet1のコードを使い、Sheet2を検索し、同一コードのデータ(A列からI列の行すべて)を全て(250件分)、Sheet1のコード記載順(A1、A2、A3・・・・)で、Sheet3に抽出したいのです。 どうか、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

Sub Test() Dim c As Range, i As Long Dim myR As Variant With Sheets("Sheet1") For Each c In .Range("A1", .Cells(Rows.Count, "A").End(xlUp)) myR = Application.Match(c.Value, Sheets("Sheet2").Columns(1), 0) If Not IsError(myR) Then i = i + 1 Sheets("Sheet3").Cells(i, "A").Resize(, 9).Value = _ Sheets("Sheet2").Cells(myR, "A").Resize(, 9).Value End If Next End With End Sub

osaryo
質問者

お礼

ありがとうございました。 無事完成いたしました。

その他の回答 (3)

  • mar00
  • ベストアンサー率36% (158/430)
回答No.4

Sheet1にあるコードは重複はなく、Sheet2のコード内に必ず同じコードがあるという事ですが もしSheet2にコードが無い場合、該当なしと表示します。 Sub Macro1() Set WS01 = Sheets("Sheet1") Set WS02 = Sheets("Sheet2") Sheets("Sheet3").Select Application.ScreenUpdating = False For i = 1 To WS01.Cells(Rows.Count, 1).End(xlUp).Row Range("A" & i) = WS01.Range("A" & i) Range("B" & i).FormulaR1C1 = "=MATCH(RC[-1],Sheet2!C[-1],0)" Myrow = Range("B" & i) If Not IsError(Myrow) Then WS02.Range("B" & Myrow & ":I" & Myrow).Copy Range("B" & i).PasteSpecial Paste:=xlPasteValues Else Range("B" & i) = "該当なし" End If Next i Application.CutCopyMode = False Application.ScreenUpdating = True End Sub

osaryo
質問者

お礼

ありがとうございます。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

一例です。 重複したレコードは無視するようにしています。 Sub sample() Set st1 = Worksheets("sheet1") Set st2 = Worksheets("sheet2") Set st3 = Worksheets("sheet3") keys = st1.Cells(Rows.Count, "A").End(xlUp).Row st2.Columns("A:I").AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=st1.Range("A1", "A" & keys), _ CopyToRange:=st3.Range("A1"), _ Unique:=True End Sub

osaryo
質問者

お礼

ありがとうございます

  • o_chi_chi
  • ベストアンサー率45% (131/287)
回答No.2

下記でどうでしょう。 A250、I1000、a.コード=b.コード は環境に合うように修正のこと でないと実行時エラー(パラメータが少なすぎます)等のエラーがでます。 あとSheet3のタイトル行は自分で修正のこと -- Sub sSelect() Dim strSql As String Dim cn As Object Dim rs As Object Const adOpenForwardOnly = 0 Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") With cn .Provider = "MSDASQL" .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _ "DBQ=" & ThisWorkbook.FullName & "; ReadOnly=True;" .Open End With strSql = "Select b.* " _ & "From " _ & " (Select * " _ & " From [Sheet1$A1:A250]) a " _ & "left join " _ & " (Select * " _ & " From [Sheet2$A1:I1000]) b " _ & " on a.コード=b.コード " Debug.Print strSql rs.Open strSql, cn, adOpenForwardOnly Worksheets("Sheet3").Cells(2, 1).CopyFromRecordset rs rs.Close Set rs = Nothing cn.Close Set cn = Nothing MsgBox "Sheet3に出力しました" End Sub

osaryo
質問者

お礼

ありがとうございました。