• ベストアンサー

エクセルのデータ照合

AとB2つのエクセルシートがあって、Aのシートのデータが Bのシートにもあるかどうかを調べる時どのようにすればいいのでしょうか? 例えば・・・、 <シートA>    A  B C D E F G <シートB> A B H I というエクセルデータがあって、シートBのデータがシートAにあるか どうか(AとBはあるのでYES、HIはないのでNO)など一発で 検索する方法を教えていただけないでしょうか? 宜しくお願いします。

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

  • ベストアンサー
  • rukuku
  • ベストアンサー率42% (401/933)
回答No.6

>オートフィルすると、“範囲”の数値までずれこんでいくようです。 >範囲は固定でオートフィルする方法はありますか?? “範囲”をたとえば VLOOKUP(A1,SheetB!A2:A10,1,FALSE) のように指定すると、下にオートフィルすると VLOOKUP(A2,SheetB!A3:A11,1,FALSE) VLOOKUP(A3,SheetB!A4:A12,1,FALSE) VLOOKUP(A4,SheetB!A5:A13,1,FALSE) … とずれていきます。 それを防ぐには VLOOKUP(A1,SheetB!A$2:A$10,1,FALSE) と範囲の行番号の前に“$”をつけます。 検索する値である“A1”にはつけてはいけません。 オートフィルしたときに、ずれていってほしいからです。 オートフィルしたときに「固定したい行番号または列記号の前に“$”をつける」と覚えてください。 詳しくは、このサイトでも「相対参照」「絶対参照」として多くのQ&Aがあるので、そちらを参考にしてみてください。 http://oshiete.goo.ne.jp/search_goo/result/?PT=&from=&nsMT=&mt_opt=a&qatype=qa&st=all&sr=norm&tf=all&MT=%C1%EA%C2%D0%BB%B2%BE%C8%A1%A1%C0%E4%C2%D0%BB%B2%BE%C8&c= ……… 私の例では、SheetBのA列を丸ごと“範囲”としましたので、下にオートフィルしても“範囲”がずれることはありません。ただし、横にオートフィルすると“範囲”がずれます。

ukiukigirl
質問者

お礼

ありがとうございます! とてもよく分かりました!! 助かりました(^^)

その他の回答 (5)

  • argument
  • ベストアンサー率63% (21/33)
回答No.5

VBAでの回答です Sub mycheck() Sheets("A").Select For i = 1 To 65536 If Range("a" & i).Value = "" Then Exit For asheet = asheet & Range("a" & i).Value & vbCrLf Next asheet = Split(asheet, vbCrLf) MsgBox UBound(asheet) - 1 Sheets("b").Select: ct = 0 For j = 0 To UBound(asheet) - 1 For i = 1 To 65536 If Range("a" & i).Value = "" Then Exit For If Range("a" & i).Value = asheet(j) Then MsgBox (asheet(j) & "が一致しました。"): ct = ct + 1 If Range("a" & i).Value = asheet(j) Then Range("b" & i).Value = "yes" Next Next MsgBox ct & "件重複がありました。" End Sub A シートA列に A  B C D E F G B シートA列に A B H I の状態でマクロを実行すると Aが一致しました。 Bが一致しました。 を表示し、Bシートには重複したデータの隣 つまりBシートB列の重複データがある場所にyesと書き込みます 処理違いや補足・修正が欲しい場合言ってください。書き直します。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

#2です。 なければNoをいれるんでしたね。修正します。 Sub test02() x = Sheet1.Cells(Rows.Count, "A").End(xlUp).Row y = Sheet2.Cells(Rows.Count, "A").End(xlUp).Row Sheet1.Columns("B:B").ClearContents Sheet2.Columns("B:B").ClearContents For i = 1 To x For n = 1 To y If Sheet1.Cells(i, "A") = Sheet2.Cells(n, "A") Then Sheet1.Cells(i, "B") = "Yes" Sheet2.Cells(n, "B") = "Yes" Else If Sheet1.Cells(i, "B") = "" Then Sheet1.Cells(i, "B") = "No" If Sheet2.Cells(n, "B") = "" Then Sheet2.Cells(n, "B") = "No" End If Next n Next i End Sub

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.3

シートB の B2セルに =COUNTIF(シートA!A:A,A2) 下までコピィすると シートAにデータが何個あるかが出ます。 あるものが 1以上 ないものが 0ですが、如何でしょうか。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

VBAのやりかた AシートはSheet1 BシートはSheet2 とします。 Sub test01() x = Sheet1.Cells(Rows.Count, "A").End(xlUp).Row y = Sheet2.Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To x For n = 1 To y If Sheet1.Cells(i, "A") = Sheet2.Cells(n, "A") Then Sheet1.Cells(i, "B") = "Yes" Sheet2.Cells(n, "B") = "Yes" End If Next n Next i End Sub

ukiukigirl
質問者

お礼

回答ありがとうございました! ただPC初心者の私にはむずかしかったです(><)

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.1

はじめまして Vlookup関数を使えばできると思います。 シートAとシートBのA列の1行目からそれぞれ、ご質問の様なデータが入っているとします。 そのときに、シートAのB列に「あり・なしの判定」を表示させるなら A1に =IF(ISNA(VLOOKUP(A1,SheetB!A:A,1,FALSE)),"No","Yes") 以下オートフィルでできます。 ご質問通りの結果を表示させるために関数が複雑になっていますが、 メインは VLOOKUP(A1,SheetB!A:A,1,FALSE) です。(検索の型で"FALSE"を指定しないと、うまくいきません) シートBの範囲A:A(A列)からA1の文字列を探します。結果は 見つかった場合→その文字列 見つからなかった場合→#N/A(該当なし) となります。 IF関数とISNA関数を使っているのは、判定結果の表示のために入れました。 ISNA関数で#N/Aが出ているか判定し、if関数で、#N/Aが出ていればNo、出ていなければYesを表示させています。

ukiukigirl
質問者

お礼

分かりやすい説明ありがとうございます! ただ、オートフィルすると、“範囲”の数値までずれこんでいくようです。範囲は固定でオートフィルする方法はありますか??

関連するQ&A