dポイントプレゼントキャンペーン実施中!

Excel2000を使用しています。
2つのシート間で同一データの有無の比較がしたいのです。
仮に比較したいものをシートA・Bとします。
それぞれ項目として、大字・小字・地番があり、それが同じ時に同一データと判断します。
件数にすると4000~5000件ぐらいあり、関数でやってみたのですが、うまくいきません。
比較で結果としては、下記の3パターンがあります。

1)AとBに有る。
2)Aに有って、Bに無い。
3)Bに有って、Aに無い。

希望としては、新たなシートに 2)と 3)のデータのみ抽出して、そのデータが 2)なのか 3)なのかわかるようにしたいのです。宜しくお願いします。

A 回答 (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
    • good
    • 0

#5です、またまた補足です。

何度もすみません。

Sub片方()の下から14行目あたり、

>If p = 3 Then
>i = 1
>End If

を、

If p = 3 Then
i = 1
Exit Do  '←を追加
End If

としていただけると、処理時間が短縮されます。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。
何回も補足していただき、とてもうれしいです。
貴重な時間をいただきました。感謝します。

お礼日時:2003/09/23 20:23

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

に書き換えてください。
    • good
    • 0

#3です。

ちょっと補足を。

>セルA1から下に、空白のセルがでるまで検索、比較します。

A列に空白のセルがでてくるまで、という意味です。
B、C列に空白のセルがあってもかまいません。

あと、各々のシートに重複するデータがある場合は想定していません。
    • good
    • 0

(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無しが判ります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
はい。私も、関数でやる時に結合してみたのですが、うまくいかなかったのです。文字数を合わせなかったからだと、気が付きました。やってみます。

お礼日時:2003/09/23 20:21

》2つのシート間で同一データの有無の比較がしたいのです。



 この類はExcelでする仕事ではない。データベースソフトでする仕事です。

》1)AとBに有る。
》2)Aに有って、Bに無い。
》3)Bに有って、Aに無い。

 こんな作業はいとも簡単です。できて当たり前。

 Accessをお持ちなら、それを使ったらいいけど、取っつきが悪いからね。覚えるのに暇がかかる。データベースソフトが初めてなら、「桐」をお勧めします。覚えが早いし便利だから、お金を出すだけの値打ちがあります。

参考URL:http://www.k3-soft.com/kiri9/index.html

この回答への補足

回答ありがとうございます。
データベースソフトでしたら、どのようにするのですか?
簡単に教えていただけませんか?
Accessならあるのですが。。。

補足日時:2003/09/22 13:02
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!