- 締切済み
エクセルで別シート同士の照合結果を抽出
シート1(担当者アの案件): A列に会社名 B列に担当者名 シート2(担当者イの案件): A列に会社名 B列に担当者名 シート3(担当者未定の案件): A列に会社名 B列に担当者名 シート4 シート1とシート3を照合して、シート1に存在する場合、シート4に抽出 シート2とシート3を照合して、シート1に存在する場合、シート4に抽出 としたいのです。やり方を教えていただけますでしょうか。 ちなみに結果の抽出はシート4でなくてもどこでもいいのです。 お手数ですがよろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- merlionXX
- ベストアンサー率48% (1930/4007)
ANo1.merlionXXです。 > VBAが全くわからないので、シート名の応用がきかず、わかりませんでした。 シート1からシート4とお書きのシート名はそれぞれ、Sheet1~Sheet4ではなかったということですね。 では、わかりやすくシート1やシート4と書き直しますので、そちらで本当の名前に書き変えて実行してみてください。 以下のコードの Sheets("シート1") を、Sheets("ほんとの名前") のように " と " に囲まれた部分を直します。 A列B列ともに一致したデータを対象にします。 データは1行目からあるものとします。 手順 1.エクセルの画面で、AltキーとF11キー同時に押し(以下Alt+F11キーと記述)て Visual Basic Editor を呼び出します。 2.Visual Basic Editor のメニューから「挿入」、「標準モジュール」で出てきたコードウィンド(右側の白い広い部分)に以下のコード(Sub~End Sub)をコピペします。 '********これより下********** Sub test02() Dim ws(1 To 4) As Worksheet Dim myV1, myV2, myV3, myW Dim i As Long, n As Long, j As Long Set ws(1) = Sheets("シート1") Set ws(2) = Sheets("シート2") Set ws(3) = Sheets("シート3") Set ws(4) = Sheets("シート4") myV = ws(1).Range("A1", ws(1).Cells(Rows.Count, "B").End(xlUp)).Value myV2 = ws(2).Range("A1", ws(2).Cells(Rows.Count, "B").End(xlUp)).Value myV3 = ws(3).Range("A1", ws(3).Cells(Rows.Count, "B").End(xlUp)).Value ReDim myW(1 To UBound(myV3), 1 To 2) For i = 1 To UBound(myV) For n = 1 To UBound(myV3) If myV(i, 1) & myV(i, 2) = myV3(n, 1) & myV3(n, 2) Then j = j + 1 myW(j, 1) = myV3(n, 1) myW(j, 2) = myV3(n, 2) Exit For End If Next n Next i For i = 1 To UBound(myV2) For n = 1 To UBound(myV3) If myV2(i, 1) & myV2(i, 2) = myV3(n, 1) & myV3(n, 2) Then j = j + 1 myW(j, 1) = myV3(n, 1) myW(j, 2) = myV3(n, 2) Exit For End If Next n Next i ws(4).Range("A:B").ClearContents ws(4).Range("A1").Resize(UBound(myW), 2).Value = myW End Sub '********これより上********** 3.Alt+F11キーでワークシートへもどります。 4.Alt+F8キーで出てきたマクロ名(test02)を選択して実行します。
- layy
- ベストアンサー率23% (292/1222)
シート1:ア担当 A社 担当 田中様 B社 担当 加藤様 C社 担当 青木様 シート2:イ担当 C社 担当 伊藤様 D社 担当 山本様 F社 担当 林様 シート3:担当未定 B社 担当 加藤様 E社 担当 松本様 とあれば一つのシートにまとめる。 シート5 シート1の分 A社 担当 田中様 ア担当 シート1の分 B社 担当 加藤様 ア担当 シート1の分 C社 担当 青木様 ア担当 シート2の分 C社 担当 伊藤様 イ担当 シート2の分 D社 担当 山本様 イ担当 シート2の分 F社 担当 林様 イ担当 シート3の分 B社 担当 加藤様 担当未定 シート3の分 E社 担当 松本様 担当未定 シート5の並べ替え A社 担当 田中様 ア担当 B社 担当 加藤様 ア担当 B社 担当 加藤様 担当未定 C社 担当 青木様 ア担当 C社 担当 伊藤様 イ担当 D社 担当 山本様 イ担当 E社 担当 松本様 担当未定 F社 担当 林様 イ担当 シート5の並べ替え A社 担当 田中様 ア担当 A社はシート1のみに存在 B社 担当 加藤様 ア担当 B社 担当 加藤様 担当未定 B社はシート1と3に存在 C社 担当 青木様 ア担当 C社 担当 伊藤様 イ担当 C社はシート1と2に存在 D社 担当 山本様 イ担当 D社はシート2のみに存在 E社 担当 松本様 担当未定 E社はシート3のみに存在 F社 担当 林様 イ担当 F社はシート2のみに存在 とりあえず、 こういうことで対応かと思いましたがどうでしょう。
- layy
- ベストアンサー率23% (292/1222)
確認事項。 >シート1とシート3を照合して、シート1に存在する場合、シート4に抽出 >シート2とシート3を照合して、シート1に存在する場合、シート4に抽出 「照合」「存在」 これに含まれる意味をもっと明確にしないとマクロでは実現できません。 シート1とシート3を比較して、 あ:「会社」の値がシート1とシート3ともに同じ記載がある場合、 い:「会社」の値がシート1にしか記載がない場合、 う:「会社」の値がシート3にしか記載がない場合、 「シート1に存在」というだけでは、「あ」でもあるし「い」でもあるので 誤解を招きます。 >シート2とシート3を照合して、 「シート1とシート3を比較して、」とあるので、 同じ記載をしていないか、が目的で、 しているものとしていないものとを区別つけておきたい ということだと解釈します。 シート4に残したいのは、重複分なのか、まだ担当未定のものなのか、 シート1とシート2を照合する必要はあるのかないのか。 >シート2とシート3を照合して、シート1に存在する場合、シート4に抽出 記載から察すると 「シート2とシート3を照合して、シート2に存在する場合、シート4に抽出 」 と想定される。 効率のいい比較のやり方さえわかれば、各判断方法や転記方法はなんとかなります、 というのであれば、ここの記載誤りはさほど問題ではないかも。
- layy
- ベストアンサー率23% (292/1222)
担当ウが発生すると仕組みが崩れるでしょうから、VBAがわからないなら手作業。 すべてのシートにシート名、連番を準備します。 すべてのシートをとあるシートにまとめます。 会社、シート名、連番 で並び替えをします。 ここで 3行あればシート1も2も3も存在するデータ、2行あれば、1行しかなければ、と判断できるでしょう。数式で2つ上のセルを見ます。 印がつけれたらフィルターを使えばシート4にまとめます。 マクロやVBAをしらなくても少し手間かけるとできそうです。
お礼
すみません、理解できませんでした。。。 ありがとうございました。
- keithin
- ベストアンサー率66% (5278/7941)
どのシートもA1セルに「会社名」,B1セルに「担当者名」と同じ内容で記入されているとします。 ご利用のエクセルのバージョンが明記されていないので,2003(以前)でご説明します。 ご質問2段目の >シート2とシート3を照合して、シート1に存在する場合、シート4に抽出 イミフメイなのでこれはスルーして,シート1にあるシート3をシート4を抽出する手順をお話しします。 手順: 書き出し先とするシート4を開く(<ここから始めることが必須) データメニューのフィルタから「フィルタオプションの設定」を開始する (オートフィルタのオプションではないので間違えないこと) 添付図を参考に 指定した範囲にマーク リスト範囲はオリジナルデータのシート3のデータ範囲を指定 検索条件範囲は抽出条件となるシート1のデータ範囲を指定 抽出範囲は書き出し先となるシート4のA1を指定 してOKします。
お礼
すみません、手順どおりにやったのですが、できませんでした。 シート3のデータがそのままシート4に出てしまいました。 ありがとうございました。
- merlionXX
- ベストアンサー率48% (1930/4007)
シート1からシート4とお書きのシート名はそれぞれ、Sheet1~Sheet4だとします。 A列B列ともに一致したデータを対象にします。 データは1行目からあるものとします。 VBAでの手法です。 手順は以下のとおりです。簡単ですよ。 1.エクセルの画面で、AltキーとF11キー同時に押し(以下Alt+F11キーと記述)て Visual Basic Editor を呼び出します。 2.Visual Basic Editor のメニューから「挿入」、「標準モジュール」で出てきたコードウィンド(右側の白い広い部分)に以下のコード(Sub~End Sub)をコピペします。 '********これより下********** Sub test01() Dim ws(1 To 4) As Worksheet Dim myV1, myV2, myV3, myW Dim i As Long, n As Long, j As Long For i = 1 To 4 Set ws(i) = Sheets("Sheet" & i) Next i myV = ws(1).Range("A1", ws(1).Cells(Rows.Count, "B").End(xlUp)).Value myV2 = ws(2).Range("A1", ws(2).Cells(Rows.Count, "B").End(xlUp)).Value myV3 = ws(3).Range("A1", ws(3).Cells(Rows.Count, "B").End(xlUp)).Value ReDim myW(1 To UBound(myV3), 1 To 2) For i = 1 To UBound(myV) For n = 1 To UBound(myV3) If myV(i, 1) & myV(i, 2) = myV3(n, 1) & myV3(n, 2) Then j = j + 1 myW(j, 1) = myV3(n, 1) myW(j, 2) = myV3(n, 2) Exit For End If Next n Next i For i = 1 To UBound(myV2) For n = 1 To UBound(myV3) If myV2(i, 1) & myV2(i, 2) = myV3(n, 1) & myV3(n, 2) Then j = j + 1 myW(j, 1) = myV3(n, 1) myW(j, 2) = myV3(n, 2) Exit For End If Next n Next i ws(4).Range("A:B").ClearContents ws(4).Range("A1").Resize(UBound(myW), 2).Value = myW End Sub '********これより上********** 3.Alt+F11キーでワークシートへもどります。 4.Alt+F8キーで出てきたマクロ名(test01)を選択して実行します。
お礼
すみません、VBAが全くわからないので、シート名の応用がきかず、わかりませんでした。 ありがとうございました。
お礼
すみません。理解できず、挫折しました。 ありがとうございました。