• ベストアンサー

異なるシート間の検索を繰返しマッチした行を他のシートに転記する

シート1のG列に検索値がありシート2のB列に検索対象の数値がありますシート1のレコードは500件前後でシート2のレコードは1000件前後ありますシート1の検索値でシート2にマッチしたもの、しなかったものを別々のシートにコピーするマクロを作成しているのですがVLOOKUPの関数では手に負えませんでしたマクロをかじり始めて10日ですがよろしくお願いします。シート1はA列からI列までコピーするデータがあります。シート1と2の件数は毎回変わります。

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

仮に シート1のA2:I1000データにデータがある。 シート2のB2:B100に検索値がある。 (先頭行はそれぞれタイトル) として、シート1の空いている K2 に =MATCH(G2,Sheet2!$B$2:$B$100,0) といれ、下にコピーします。 見つからない行は #N/A となるのでオートフィルタで抽出すれば出ます。 マクロで書くとたいそうな処理になってしまいました。 IV列を作業列にしています。 試すのはテスト環境で。 Sub Test1() Dim tws As Worksheet, fws As Worksheet, LRow As Long Dim ws As Worksheet, myMatch, s As String Set tws = Worksheets("Sheet1") Set fws = Worksheets("Sheet2") LRow = fws.Range("B65536").End(xlUp).Row s = "=Match(G2," & fws.Name & "!$B$2:$B$" & LRow & ",0)" With tws   LRow = .Range("G65536").End(xlUp).Row   .Range("IV1") = "Temp"   .Range("IV2:IV" & LRow) = s   myMatch = Array("<>#N/A", "#N/A")   For i = 0 To 1     .Range("IV1").AutoFilter     .Range("IV1").AutoFilter 1, myMatch(i)     .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy     Set ws = Worksheets.Add(after:=Worksheets(Worksheets.Count))     ws.Range("A1").PasteSpecial xlPasteAll     ws.Range("A1").Select     Application.CutCopyMode = False   Next i   .Range("IV1").AutoFilter   .Range("IV1:IV65536").Delete End With End Sub

その他の回答 (3)

  • sakenomo
  • ベストアンサー率52% (35/67)
回答No.4

countif関数を使ったマクロでやってみました。 Sheet1のG列に検索値、Sheet2のB列(列の全部)を検索対象として、 マッチしたものをシート「ある」、しないものをシート「ない」にコピーします。 検索値に空白のセルがあると、Sheet2のB列の空白のセルに合致して、「ある」になりますのでご注意を。 Sub test() Dim i As Long, p As Long, n As Long, c As Range Worksheets.Add Before:=Sheets("Sheet1") ActiveSheet.Name = "ある" Worksheets.Add Before:=Sheets("Sheet1") ActiveSheet.Name = "ない" With Sheets("Sheet1") .Select Set c = .Range(Cells(1, 1), Cells(.Range("G65536").End(xlUp).Row, 9)) For i = 1 To c.Rows.Count If Application.WorksheetFunction.CountIf(Sheets("Sheet2") _ .Columns("B"), .Range("G" & i)) = 0 Then p = p + 1 Sheets("ない").Range(c.Address).Rows(p).Value = c.Rows(i).Value Else n = n + 1 Sheets("ある").Range(c.Address).Rows(n).Value = c.Rows(i).Value End If Next End With End Sub

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

#1です。シート2の項目(セル)をシート3に移すのなら sh3.Cells(j, 1) = sh2.Cells(x.row, 1) になると思います。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

>マクロをかじり始めて10日ですがよろしく この段階ではごく例外の方(例えば他の言語でプロ級の方、回りに聞く人がいる人、若くて適性があり意欲に燃えた人など)を除いて、本質問をVBAでやるのは無理でしょう。 なぜなら回答例が出ても、どこをどう変えたらよいか、 自力で判らない可能性があります。 まる写しせざるをえないでしょうから。 そうは思いますが、朝時間が無いので、ざっと作ってみました。穴だらけかもしれませんが、載せてみます。 Sub test01() Dim sh1 As Worksheet 'シート1 Dim sh2 As Worksheet Dim sh3 As Worksheet Set sh1 = Worksheets("sheet1") 'シート1 Set sh2 = Worksheets("sheet2") Set sh3 = Worksheets("sheet3") j = 1 'シート3の書きこみ用ポインタ '-----シート1最下行を知る d1 = sh1.Range("a1").CurrentRegion.Rows.Count '-----シート1最下行までA列セルに付いて繰り返す For i = 1 To d1 '-----シート1A列第i行の文字列(数字)セルに付いて '--シート2のA列に見つかるか Set x = sh2.Columns(1).Find(sh1.Cells(i, 1)) If x Is Nothing Then Else '--シート3のA列にシート1のA列データをセット sh3.Cells(j, 1) = sh1.Cells(i, 1) '--シート3のA列の次の行をセット j = j + 1 '次行を指す End If Next i End Sub 同じ数があると上記ではダメで、FindNext等を 使って複雑になります。 上記ではA列だけ移す例ですが、 シート1にB,C・・I列あるのでしたら sh3.Cells(j, 2) = sh1.Cells(i, 2) 'B列 sh3.Cells(j, 3) = sh1.Cells(i, 3) 'C列 ・・・ を付け加えてください。

関連するQ&A

  • 他ブックからのデータ検索・コピー(VBA)

    【Book2】(Sheet2)L1に「12-1」を入力 ↓ 【Book1】(Sheet1)で「12-1」をM列、T列、AA列から検索→M4に「12-1」があった ↓ 【Book1】(Sheet1)N4:S4のデータを【Book2】(Sheet2)M1:R1にコピー 各ブックは同一ファイルに保存 検索する文字列の重複はなし 現在は関数≪VLOOKUP≫を使い上記を行っています。 マクロを使った方がスムーズに処理できるのでしょうか。 マクロを使う場合はどのような方法が良いのでしょうか。 データ数は1000行程度、各行の25個のセルに≪VLOOKUP≫関数が入っています。

  • vlookupに、Indirect と Match 関数を組み合わせる

    vlookup関数で、検索値にSheet1(Book1)から、範囲は、Sheet2(Book1)のセルにある名前のついているSheet1(Book2), そして、列番号は、指定した名前とマッチするSheet1(Book2)の列番号から、導き出そうとしています。 ところが、Matchで指定した範囲は、Indirect内の関数として認識されないようで、結果が得られません。 たとえば、 Book1のA1~E1にタイトルが入っています。(Index, Title, Book, Author, Frequency) Book2には、 シート1: InputName シート2: Output シート2に以下の関数を入れてみましたが、うまくいきません。 ちなみに、VLOOKUPの列番号を Match関数の代わりに、5 とすると、結果オーライですが、Book1 の列順が変わっていることがあるので、Matchを使ってエラーを避けたいのですが、以下の関数のどこを直すべきでしょうか? =IF(ISNA(VLOOKUP(C2,INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$A$2:$E$1400"),MATCH("Frequency",$A$2:$E$2,0),FALSE)),0,VLOOKUP(C2,INDIRECT("'["&InputName!$A$2&"]"& InputName!$B$2&"'!"&"$A$2:$E$1400"),MATCH("Frequency",$A$2:$E$2,0),FALSE)) よろしくお願いします。

  • 複数のシートから検索と検索範囲の変更

    VLOOKUP関数を使ってやっと 検索できるようになりました。 しかし「あ行」「か行」・・・と参照データ そのものを整理できないものかとまた思案しています。 1、たとえばSheet3に「あ行」Sheet4に「か行」   のようにして   シートをまたがって検索できないもの   でしょうか? 2、検索元データを増やすたびに検索範囲を   変えてるのですがもっと融通が利く方法は   あるのでしょうか? 3、VLOOKUP関数をマクロで実行させようと   するとどういう風に記述すればいいの   でしょうか?   (マクロの記録からは出来ないですもんね)  以上3つですが回答できるものだけでも構いません  よろしくお願いしますm(_ _)m

  • エクセルでの検索

    エクセルで、 SUBTOTAL関数で列の集計をしているシートで、 特定の行を左から検索していった時に 最初にヒットする数値のセル位置を取得したいのです。 何か良い方法があれば、教えて下さい。 出来れば、マクロを使わない方法で宜しくお願いします。 (INDEX,MATCH関数のアスタリスク検索では文字列しかヒットしませんでしたので。)

  • 貼付用シートを更新するとデータシートの新セルに更新

    シートが2種類(データ用、貼付け用)あります。 VLOOKUPを使用して、貼付け用の数値をデータ用に表示させる。という仕様になっています。 貼付け用のシートを更新するだけで、データ用シートの新しいセルに入力されるようにしたいのですが、マクロを使って出来ることなのでしょうか? 分かればマクロのソースを教えてください。 たとえば、数値が出ると特定の列の関数が確定する用に出来ますか?

  • シートの必要な行だけをコピーしたい。

    シートの必要な行だけをコピーしたい。 sheet1にデータを取り込み、sheet2でvlookupの関数によりデータの抽出を行っています。sheet1に取り込まれる行は、2行~2600行と幅が広いので、現状はsheet2に関してMAX2600行分のvlookup関数を設定しているのですが、行が短い場合に処理時間がかかってしまい、効率がよくありません。sheet1に取り込まれた必要行分だけをsheet2にコピーペースト展開するにはどの様な対応をしたらよいか教えて 頂きたく。 1行目ににvlookupの関数が設定してあるとして、現状は下記の通り、マクロにて2600行分コピーペーストしてあります。 Range("A1:J1").Select Selection.Copy Range("A2:J2600").Select ActiveSheet.Paste

  • エクセル 別れたシートでの条件検索

    別れたシートでの検索で一致したものを探す関数について。 VLOOKUP関数だと列に対してだと思うのですが、行に対して検索したいです。うまく伝えられないので、例えば 【シート1】    A   B   C   1  555 2  666 3  777 4  222 【シート2】    A   B   C   D 1  777    555    222 2 3 上のようなシートがあり、 シート1のA列の番号がシート2の1の行に有ったら、 シート1のB列にOKと表示、無かったらNGと表示、 の様な関数ってありますか? どなたか解る方お願いします。

  • Application.Matchで特定行の検索

    Excel2007のVBAについてご教授ください。 Application.Matchで特定列の文字列検索を使いたいんですが以下のような構文で使えますでしょうか? ----------------- Set usWS = Worksheets("Sheet1") KeyIdValue = "hogehoge" JANCol = 9 m = Application.Match(KeyIdValue, usWS.Columns(JANCol), 0) ----------------- Sheet1のワークシートの9(I列)列目に"hogehoge"が入っている行数をmに入れたいです。 (最初に見つかった行数で構いません。複数は見つかりません。) 検索されません?というようなエラー(エラー2042)が出るのですが、使い方が誤っていないかご教授させて頂きたいです。 変数の宣言はコンパイルエラーが出ないので問題ありません。 Application.Matchの使い方に問題ないか教えて頂けませんでしょうか? よろしくお願いします。

  • Excel 2007 マクロ 複数シートの検索

    Excel 2007 マクロ 複数シートの検索 Sheet1とSheetに情報があります。 Sheet1にある番号とSheet2にある番号を 検索して、ヒットした場合 Sheet1の備考の文字をSheet2に備考に反映したいです。 画像にSheet1、Sheet2、完成形があります。 関数であればVlookupを使用しますが、 マクロでできるようにしたいです。 どのようなマクロになりますでしょうか。 アドバイスお願いします。

  • 別シートから値のある行を検索し、別シートに転記

    シート1とシート2があり、 シート1のA7がシート2のB列にあり、シート1のB20がシート2のその行のD列の値と同じ場合、シート2該当行のF列の値をシート1のL20に書き込むのですが、どのようにマクロを記述すればいいでしょうか 例えば、 シート1のA7に「A社」、B20に「商品A」があり、 シート2のB10に「A社」が、D10に「商品A」がある場合、F10の値をシート1のL20に返す方法です。 シート2のB列には「B社」や「C社」もあるため、B列の中からシート1のA7と合致する行を検索することになります。

専門家に質問してみよう