プロが教えるわが家の防犯対策術!

エクセル2000で同じ内容のセルが複数あったとき、ひとつだけを残し他を削除する方法を教えてください。
ただし少し条件があります。

データーは5列100行位からなっています。
A列にある重複したデーターのセルを削除したいのですが、A列は同一なのですがB列は異なっています。B列に数字が入っているセルとうでないセルがあるのですが、数字が入っているものを残したいのです。

具体例は次のとおりです。
A列に 「ホンダCIVIC」 B列 「-」と書かれた行と
A列に 「ホンダCIVIC」 B列 「2」と書かれた行、
A列に 「ホンダCIVIC」 B列 「5」と書かれた行、
のA列だけを見ると重複した3行が有ったとします。
B列に「5」または「2」の入った行ひとつだけ残し、他を削除したいのです。
何かよい方法があればお教えください。よろしくお願いします。

A 回答 (6件)

済みません、直ぐ気がついたのですが、Sheet2へSheet1のセルから移すところ


For k = 1 To 4
sheet2.Cells(j, k) = sheet1.Cells(i, k)
Next k
の真中行の右辺を
sheet2.Cells(j, k) = RTRim(sheet1.Cells(i, k))
として見てください。
For K=1 ・・が3箇所あるので、3箇所修正してください。これが原因ではないでしょうか。
比較して見るときだけRTrimしていました。セルへセットする部分もRTrimしましょう。
それとRTrimで無くTrimで統一してみて、どちらが良いか、結果を見てください。

この回答への補足

たびたびで申し訳ありません。
ご指摘部分を修正したのですが、変化はありませんでした。
RTrim Trimともに同じです。
まだ何か有りましたらよろしくお願いいたします。
最終的には次のようになっています。

Sub test01()
Dim sheet1, sheet2 As Worksheet
Set sheet1 = Worksheets("sheet2")
Set sheet2 = Worksheets("sheet3")
'-----ソート
sheet1.Range("A3:D1500").Sort Key1:=sheet1.Range("A1"), Order1:=xlAscending, Header:=xlNo, _
Key2:=sheet1.Range("B1"), Order2:=xlAscending, Header:=xlNo
'-----
d = sheet1.Range("a1").CurrentRegion.Rows.Count
'--------初期設定
m = RTrim(sheet1.Cells(1, 1))
j = 1
For k = 1 To 4
sheet2.Cells(j, k) = RTrim(sheet1.Cells(1, k))
Next k
'--------前行とダブり判定
For i = 2 To d
If m = RTrim(sheet1.Cells(i, "A")) Then
b = sheet1.Cells(i, "B")
If IsNumeric(b) = True Then
For k = 1 To 4
sheet2.Cells(j, k) = RTrim(sheet1.Cells(i, k))
Next k
End If
Else
j = j + 1
m = RTrim(sheet1.Cells(i, "A"))
For k = 1 To 4
sheet2.Cells(j, k) = RTrim(sheet1.Cells(i, k))
Next k
End If
Next i
End Sub

補足日時:2003/06/14 15:08
    • good
    • 0
この回答へのお礼

何度もご迷惑をおかけし申し訳ありません。
#6さんの回答をきっかけに原因がわかってきました。
問題は私のデーターにあるようです。

webファイルで出力しソースを確認したところ、半角スペースが特殊文字である で記入されていました。これが半角スペースが除去できなかった原因であると思われます。
ご迷惑をおかけし申し訳ありませんでした。

今回教えていただいたことで改めてVBAがいろいろできることを認識しました。
もしよろしければご推奨のサイトとか書籍があればお教えいただけないでしょうか。
よろしくお願いします。

お礼日時:2003/06/14 16:31

#5です。



補足します。
検索条件を入力後、最後に「すべて置換」のボタンを押してください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
少しずつ原因がわかってきました。
問題は私のデーターにあるようです。

ご指摘の方法で取れるはずでやってみたのですが、取れません。
おかしいと思い、webファイルで出力しソースを確認したところ、半角スペースが特殊文字である で記入されていました。これが半角スペースが除去できなかった原因であると思われます。
どうもありがとうございました。

お礼日時:2003/06/14 16:24

こんにちは。



半角のスペースを除去するのでしたら、A列を選択状態にした後、「編集」→「置換」で、いかがでしょうか。


「検索する文字列」を、「 」(半角スペース)
「置換後の文字列」を、「」(なにも入力しない)

で、半角スペースをすべて取り除けます。
    • good
    • 0

>、文字のあとに半角スペースが1個ついていたり2個ついていたりばらばらの状態でした。


RTrim(右側のスペースをのぞく)と言うVBの関数があります。それを使うと、下記変更だけで、追加行コーディング不要です。
m = sheet1.Cells(1, 1) -->m = RTrim(sheet1.Cells(1, 1))
m = sheet1.Cells(1, 1) -->m = RTrim(sheet1.Cells(1, 1))
If m = sheet1.Cells(i, "A") Then -->
If m = RTrim(sheet1.Cells(i, "A")) Then
m = sheet1.Cells(i, "A") -->
m = RTrim(sheet1.Cells(i, "A"))
と変更してやって見てください。
場合によればB列データもTrimする必要があるかもしれません。Trimは前後両方のスペースを取り除くので
こちらがベターかも知れません。

この回答への補足

早速連絡いただきありがとうございます。
教えていただいた変更を加え実行してみたのですが、何も変化はありません。
A列の半角スペースも前と同様2個だっり3個だったりバラバラのままです。
次のような形でマクロを実行しているのですが、どこがおかしいのでしょうか。
たびたびで申し訳ありませんがよろしくお願いいたします。

Sub test01()
Dim sheet1, sheet2 As Worksheet
Set sheet1 = Worksheets("sheet2")
Set sheet2 = Worksheets("sheet3")
'-----ソート
sheet1.Range("A1:D1500").Sort Key1:=sheet1.Range("A1"), Order1:=xlAscending, Header:=xlNo, _
Key2:=sheet1.Range("B1"), Order2:=xlAscending, Header:=xlNo
'-----
d = sheet1.Range("a1").CurrentRegion.Rows.Count
'--------初期設定
m = RTrim(sheet1.Cells(1, 1))
j = 1
For k = 1 To 4
sheet2.Cells(j, k) = sheet1.Cells(1, k)
Next k
'--------前行とダブり判定
For i = 2 To d
If m = RTrim(sheet1.Cells(i, "A")) Then
b = sheet1.Cells(i, "B")
If IsNumeric(b) = True Then
For k = 1 To 4
sheet2.Cells(j, k) = sheet1.Cells(i, k)
Next k
End If
Else
j = j + 1
m = RTrim(sheet1.Cells(i, "A"))
For k = 1 To 4
sheet2.Cells(j, k) = sheet1.Cells(i, k)
Next k
End If
Next i
End Sub

補足日時:2003/06/14 13:08
    • good
    • 0

この類のものは関数式では無理でしょう。


へたくそなVBAでやって見ました。ただし定石です。
少数例でしかテストをやってないので、よろしく。
ワークシート画面でALTキーを押しながらF11キーをおす。更にALTキーを押しながらI(挿入)更にM(標準モジュール)の画面に下記を貼りつけて実行する。
Sheet2にデータがあり、Sheet3に望みのものを出す。
Sub test01()
Dim sheet1, sheet2 As Worksheet
Set sheet1 = Worksheets("sheet2")
Set sheet2 = Worksheets("sheet3")
'-----ソート
sheet1.Range("A3:B15").Sort Key1:=sheet1.Range("A1"), Order1:=xlAscending, Header:=xlNo, _
Key2:=sheet1.Range("B1"), Order2:=xlAscending, Header:=xlNo
'-----
d = sheet1.Range("a1").CurrentRegion.Rows.Count
'--------初期設定
m = sheet1.Cells(1, 1)
j = 1
For k = 1 To 9
sheet2.Cells(j, k) = sheet1.Cells(1, k)
Next k
'--------前行とダブり判定
For i = 2 To d
If m = sheet1.Cells(i, "A") Then
b = sheet1.Cells(i, "B")
If IsNumeric(b) = True Then
For k = 1 To 9
sheet2.Cells(j, k) = sheet1.Cells(i, k)
Next k
End If
Else
j = j + 1
m = sheet1.Cells(i, "A")
For k = 1 To 9
sheet2.Cells(j, k) = sheet1.Cells(i, k)
Next k
End If
Next i
End Sub
(1)シート名は本番に合わせて、
Set sheet1 = Worksheets("sheet2")
Set sheet2 = Worksheets("sheet3")
の()内を変えてください。
(2)3箇所あるFor k = 1 To 9の9に付いて、
シートのデータのある列をI列=9までとしていますが、G列なら7、k列まであるなら11と変えてください。
(3)データは第1行目から始まっているものとしています。
    • good
    • 0
この回答へのお礼

ありがとうございます。できました!!!
しかし残念ながら私のデーターに不備があり期待した結果は得られませんでした。

頂いたマクロを実行したところ、A列が一見同じであるにもかかわらず、削除できていないものが多数見つかりました。
元のデーターを見直したところA列が一見同じに見えるのですが、文字のあとに半角スペースが1個ついていたり2個ついていたりばらばらの状態でした。

もしできれば、A列の半角スペースを除去するマクロなどあれば、独立したマクロとしてお教えいただけるとありがたいのですが。

お礼日時:2003/06/14 10:41

こんにちは



-と2と5が残った場合、どれを残すかは確実に決まっていないのでしょうか?

まず、ソートしましょう。
[データ]→[並べ替え]
列A
列B
でソートします。
C2セルに
=IF(AND(A1=A2,B1=B2),"重複","")
として、C3セルよりも下にもコピーします。
重複している行に重複と表示されます。
検索とかで、重複を検索して、その行を削除して行けば良いと思います。

この回答への補足

早速回答いただきありがとうございます。
残すのは数字が入っていればどれでもOKです。

書き忘れがあり申し訳ないのですが、このようなデーターが入ったページが300ほど有ります。
できれば機械的に削除できる方法があればありがたいのですが。
よろしくお願いします。

補足日時:2003/06/13 15:35
    • good
    • 0

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