- ベストアンサー
重複データの削除、一致するセルのみ
A列とB列にそれぞれデータがあり、A列内にあるデータ と一致するものがB列内にある場合、B列内のデータ(セル)を 削除する簡単な方法がありましたら教えてください。 例 A列 B列 123 778 456 358 789 456 1011 228 1213 123 B列の「123」と「456」のデータがA列と一致 ↓ A列 B列 123 778 456 358 789 1011 228 1213 B列の「123」と「456」のデータを削除 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
http://okwave.jp/qa3606678.htmlをちょこっと改造すると出来ます。 但し、値が浮動小数点数の時はダメかもしれません。 Sub test() Dim myDic As Object, myKey As Variant Dim originalTable As Range, refTable As Range Dim i As Long Set myDic = CreateObject("Scripting.Dictionary") Set refTable = ActiveSheet.Range("A1", ActiveSheet.Range("A" & Rows.Count).End(xlUp)) With refTable For i = 1 To .Rows.Count If Not myDic.exists(.Cells(i, 1).Value) Then myDic.Add .Cells(i, 1).Value, "" End If Next i End With Set originalTable = ActiveSheet.Range("B1", ActiveSheet.Range("B" & Rows.Count).End(xlUp)) With originalTable For i = 1 To .Rows.Count If myDic.exists(.Cells(i, 1).Value) Then .Cells(i, 1).ClearContents End If Next i End With Set myDic = Nothing End Sub
その他の回答 (4)
- kuma56
- ベストアンサー率31% (1423/4527)
>B列内のデータ(セル)を削除する簡単な方法がありましたら教えてください。 簡単にって言うのなら、B列の「123」と「456」のデータにカーソルで選択してDeleteキーを押す・・・・・ って回答すると、「そうじゃなくて、エクセルの機能を使って自動的に・・・・」 とかいわれちゃうのかな。 簡単に!っと言っても質問がアバウトだと、回答も色々ばらついてしまいます。 まず、重複を削除する目的は何なのか? 画面上で目視確認しやすいようになのか、単純にデータ数を数えるためなのか・・・・・等々 そういうのでも回答が変ってくることもありえます。 たとえば、画面上で目視確認するためだけなら、条件付書式で文字色を背景と同色にしてやれば、見た目にはA列と重複したデータは表示されなくなります。 たとえばB1セルを選んで 書式 → 条件付書式 → 条件1 → 数式が → =countif(A:A,B1) → 書式 → フォント → 色 → 背景と同色(白?) として、B1セルのコピーをとりそれを下方に書式のみで貼り付ければ出来るでしょう。 そうではなくて該当のセルのデータ自体を"削除"するのなら・・・・・ たとえば、C1セルに =IF(COUNTIF(A:A,B1)>0,"",B1) こんな関数式を入力してC1セルのコピーをとりそれを下方に貼り付ければ、重複しないデータの未表示されるのでサイドコピーをとりB列に値で貼り付ければ、質問文のような結果を得ることが出来るでしょう。 更にそうではなく、入力だ、コピーだという作業も避けるのならマクロを使って処理すれば出来ます。 たとえば上記の作業を記録して実行してやってもいいし、 B列のセルを読みに行って Range("B1").Select それがA列にあるか判断して If WorksheetFunction.Countif(Range("a:a",Activecell)) > 0 Then あれば削除 Selection.ClearContents なければ下のセルに移る Else ActiveCell.Offset(1, 0).Range("A1").Select (←こんな感じ 要確認) っと言うのを繰り返して(DO ~ LOOP や FOR ~ NEXT)やる様にマクロを組めば作業列を作らなくても出来るでしょう。 一番手軽そうなのは、条件付書式かもしれないけど、キチンとデータを削除するのなら関数式を入力する方法かもしれないし、何度も繰り返す可能性があるのならVBAを組んでマクロで処理するのが簡単になります。 目的によっては"簡単な方法"も変ってきます。 ところで、エクセルでいいんですよね?出来たらバージョンなんかも書いておくとより良いアドバイスがもらいやすいと思います、
お礼
簡単=マクロか関数で・・・という意味でした。あいまいですみません。 マクロの記録もうまくできず質問しました。 セルのデータを削除したいのです。 マクロや関数で簡単に出来ました、ご返答ありがとうございます。
- imogasi
- ベストアンサー率27% (4737/17070)
質問者は、どういうエクセルの手法を用いての解決を予想しているのか。VBAが判る・出来るかどうかなど。 フィルタ 関数 VBAなど 関数は行の削除は絶対出来ないことを認識してますか。 ーー 中間作業列を使わない方法もありますが、式の理解が難しいと思うので、 関数で中間列を使って、実質削除したように見せる技を記します。自称imogasi方式。 A1:C6に質問データがあるとする。 第1行は見出しを入れるか、空白行にすること。 A列 B列 C列 番号 123 778 1 456 358 2 789 456 1011 228 3 1213 123 C2の式は =IF(ISERROR(VLOOKUP(B2,$A$2:$A$100,1,FALSE)),MAX($C$1:C1)+1,"") これを下方向に式を複写する。 結果 上記C列。 どこでも良いが E2にして =INDEX($B$1:$B$100,MATCH(ROW()-1,$C$1:$C$100,0),1) と入れて下方向に式をC列最大数行+1まで複写。 E2:E4 778 358 228 複写をやりすぎると#N/Aが出るが =IF(ROW()-1>MAX($C$1:$C$100),"",INDEX($B$1:$B$100,MATCH(ROW()-1,$C$1:$C$100,0),1)) で防げる。 ーーーーー 今までは上記のような質問が多かったが、行を上に詰めないなら =IF(ISERROR(VLOOKUP(B2,$A$2:$A$100,1,FALSE)),B2,"") とぐっと易しくなる。
お礼
簡単な関数はわかります。 上記、いろんな関数の組み合わせで難しいですが、そのまま使用できました。 ありがとうございます!
Fig-1 Fig-2 Fig-3 A B A B A B 1 data data 1 data data 1 data data 2 123 778 4 789 456 2 123 778 3 456 358 6 1213 123 3 456 358 4 789 456 4 789 5 1011 228 5 1011 228 6 1213 123 6 1213 1.Fig-1 において、 [抽出先] “選択範囲内” [リスト範囲] $B$1:$B$6 [検索条件範囲] $A$1:$A$6 上の条件で[フィルタオプションの設定]を実行して、Fig-2 を得る 2.Fig-2 において、 範囲 B4:B6 を選択して Deleteキーを叩き付けた後で、[データ]→ [フィルタ]→[すべて表示]を実行して、Fig-3 を得る
お礼
この方法でも簡単にできました! ありがとうございます!!
- hallo-2007
- ベストアンサー率41% (888/2115)
例えば C1セルに =COUNTIF(A:A,B1) 下フィルすると B列の値と同じ値がA列に何個あるか表示されると思います。 オートフィルターでC列 1以上に絞込み B列を選択して空白にしてオートフィルター解除してみてはいかがですか。
補足
オートフィルターはわかるのですが、B列に所々空欄がありまして 「空白以外のセル」という選択がでてこないので使えませんでした。
お礼
コピペで使用したところ、一瞬で消えました。 ありがとうございます!