- ベストアンサー
エクセルでシート間の比較をしたいのですが。。。
Excel2000を使用しています。 2つのシート間で同一データの有無の比較がしたいのです。 仮に比較したいものをシートA・Bとします。 それぞれ項目として、大字・小字・地番があり、それが同じ時に同一データと判断します。 件数にすると4000~5000件ぐらいあり、関数でやってみたのですが、うまくいきません。 比較で結果としては、下記の3パターンがあります。 1)AとBに有る。 2)Aに有って、Bに無い。 3)Bに有って、Aに無い。 希望としては、新たなシートに 2)と 3)のデータのみ抽出して、そのデータが 2)なのか 3)なのかわかるようにしたいのです。宜しくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
VBAでやってみました。 エクセルのウィンドウ左下にあるシートタブの、左から1番目と2番目のシートを比較します。 各々のシートのA列に大字、B列に小字、C列に地番を置いてください。 セルA1から下に、空白のセルがでるまで検索、比較します。 1)はSub両方()で、 2)3)はSub片方()でどうぞ。 Sub 両方() Dim c As Range, c2 As Range, c3 As Range, p As Byte Dim w As Worksheet, f As Long Set c = Worksheets(1).Range("A1:C1") Set c2 = Worksheets(2).Range("A1:C1") Set w = Worksheets.Add(, Worksheets(2)) w.Range("A1").Value = Worksheets(1).Name & _ " と、 " & Worksheets(2).Name & " 両方にある" Set c3 = w.Range("A2:C2") Do Do While c2.Columns(1).Value <> "" For p = 1 To 3 If c.Columns(p).Value <> c2.Columns(p).Value Then Exit For If p = 3 Then c3.Offset(f, 0).Value = c.Value f = f + 1 Exit Do End If Next p Set c2 = c2.Offset(1, 0) Loop Set c2 = Worksheets(2).Range("A1:C1") Set c = c.Offset(1, 0) Loop Until c.Columns(1).Value = "" End Sub Sub 片方() Dim c As Range, c2 As Range, c3 As Range, p As Byte Dim w As Worksheet, f As Long, i As Byte, n As Byte, k As Byte Set w = Worksheets.Add(, Worksheets(2)) w.Range("A1").Value = Worksheets(1).Name & " だけにある" Set c3 = w.Range("A2:C2") For n = 1 To 2 If n = 1 Then k = 2 Else k = 1 f = 0 w.Range("E1").Value = Worksheets(n).Name & " だけにある" Set c3 = w.Range("E2:G2") End If Set c = Worksheets(n).Range("A1:C1") Set c2 = Worksheets(k).Range("A1:C1") Do i = 0 Do For p = 1 To 3 If c.Columns(p).Value <> c2.Columns(p).Value Then Exit For If p = 3 Then i = 1 End If Next p Set c2 = c2.Offset(1, 0) Loop Until c2.Columns(1).Value = "" If i = 0 Then c3.Offset(f, 0).Value = c.Value f = f + 1 End If Set c2 = Worksheets(k).Range("A1:C1") Set c = c.Offset(1, 0) Loop Until c.Columns(1).Value = "" Next n End Sub
その他の回答 (5)
- sakenomo
- ベストアンサー率52% (35/67)
#5です、またまた補足です。何度もすみません。 Sub片方()の下から14行目あたり、 >If p = 3 Then >i = 1 >End If を、 If p = 3 Then i = 1 Exit Do '←を追加 End If としていただけると、処理時間が短縮されます。
- sakenomo
- ベストアンサー率52% (35/67)
3#4#です。また補足を。 見た目は同じでも、セル中の文字列の前後にスペースがあると、うまくヒットしません。スペースが入っていることが考えられる場合は、各々のSubプロシージャの If c.Columns(p).Value <> c2.Columns(p).Value Then Exit For を、 If Trim(c.Columns(p).Value) <> Trim(c2.Columns(p).Value) Then Exit For に書き換えてください。
- sakenomo
- ベストアンサー率52% (35/67)
#3です。ちょっと補足を。 >セルA1から下に、空白のセルがでるまで検索、比較します。 A列に空白のセルがでてくるまで、という意味です。 B、C列に空白のセルがあってもかまいません。 あと、各々のシートに重複するデータがある場合は想定していません。
- imogasi
- ベストアンサー率27% (4737/17069)
(1)優秀なデータベースソフトを使う(#1のご回答では桐なら易しく出来るそうです) (2)VBA等のプログラムが組めて組む のでないと難しいと思います。関数などでは、出来ても極く複雑になって、実質出来ないといえるでしょう。 敢えてやるなら、A列(大字)B列(小字)C列(番地)の 各々の内容的な最大文字数を決めて、左寄せ的に実質内容(文字)をセットし、残り(右後尾)最大文字数まではスペースを入れた文字列を作ることです。 A列の最大文字数を全角7文字と決めたとする。 山田北と入っているセルを、山田北△△△△(△は全角スペースを表す)と言う内容のセルにする。 元禄新田と入っているセルを、元禄新田△△△と言う内容のセルにする。 同じことをB、C列について行う。 そして=A1&B1&C1のようにして、結合したセルを D列ならD列に作る。 シートAとシートBの両方でそれを行う。 なぜコンな面倒なことが必要かピンとこなければ、この方法もプログラムも無理でしょう。 これでマッチングキーが出来あがります。 そしてVLOOKUP関数(第4引数はFALSE)を使って、シートBのD列を表(テーブル)と見たてて、シートAのD列の値で、表引きをする。見つからない時は#N/Aが出るので、シートAにあり、シートBになしが判ります。 逆にシートBより上記をやればシートBありシートA無しが判ります。
お礼
回答ありがとうございます。 はい。私も、関数でやる時に結合してみたのですが、うまくいかなかったのです。文字数を合わせなかったからだと、気が付きました。やってみます。
- whitepepper
- ベストアンサー率27% (683/2442)
》2つのシート間で同一データの有無の比較がしたいのです。 この類はExcelでする仕事ではない。データベースソフトでする仕事です。 》1)AとBに有る。 》2)Aに有って、Bに無い。 》3)Bに有って、Aに無い。 こんな作業はいとも簡単です。できて当たり前。 Accessをお持ちなら、それを使ったらいいけど、取っつきが悪いからね。覚えるのに暇がかかる。データベースソフトが初めてなら、「桐」をお勧めします。覚えが早いし便利だから、お金を出すだけの値打ちがあります。
補足
回答ありがとうございます。 データベースソフトでしたら、どのようにするのですか? 簡単に教えていただけませんか? Accessならあるのですが。。。
お礼
回答、ありがとうございます。 何回も補足していただき、とてもうれしいです。 貴重な時間をいただきました。感謝します。