- ベストアンサー
Excel2003での行重複削除
Excel2003で、列のセル内容が同一の場合を削除・抽出することは可能でしょうか。例えば、次のようなイメージです。 行番号 A列 B列 行1 A1県 B1市 行2 A1県 B2市 行3 A1県 B3市 行4 A1県 B4市 行5 A2県 B5市 行6 A2県 B6市 ここから、A列が同一の行の重複を削除したいのです。上記では、行1から行4までは「A1県」で同一なので、1つの行だけ残し後の行は削除したい。B列の内容は重複削除で一部消えますが構いません。上記の場合、抽出結果は次のようになります(先頭行だけ残した場合ですが)。 行番号 A列 B列 行1 A1県 B1市 行5 A2県 B5市 データベースが大きいため、手作業で削除して行くのは大変です。適当な方法がありましたら、是非、ご教示ください。 どうぞ宜しくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず手作業でも、ちょっとは楽になる方法として・・・ 最初にA列をキーにしてデータをソートしておく。 C2セルに関数式 =IF(A2=A1,"",A2) を入力して下方へコピーする。 C列全体をコピーしてそのまま値で張り付ける。 C列をキーにしてデータをソートする。 C列が表示されていない行以降を削除する。 C列のデータを削除する。 この作業をマクロの記録でVBAの記述にしてやれば、マクロ化も可能です。
その他の回答 (4)
- argument
- ベストアンサー率63% (21/33)
はじめまして kotaro2 さん データは必ずA列でソートが掛かっているのでしょうか? と先に聞き忘れて作成してしまいました。まぁもし違うならばそれは後で直せばよいですね(私が)。 結局のところオートフィルや関数は便利なのですがデータの増減に弱いことは違い無いでしょう。そのつど前回の関数を張ったりそのつどオートフィルを掛けたりするのは最終的に手間以外の何者でもありません。 ですが安心してください。excelにはVBA(マクロ)という機能があります。 標準モジュールに下記を張ればそれ以降マクロを実行すれば作業を自動で行ってくれます。仮に65536行あろうと関数をオートフィルするより高速に回答を出してくれるでしょう。 Sub test() '各A列の次の行と比較 For i = 1 To Range("A65536").End(xlUp).Row If Range("A" & i).Value <> Range("A" & i + 1).Value Then num = num & i + 1 & "," Next '余計なカンマ削除 num = "1," & Left(num, Len(num) - 1) '最終要素削除(空と比較してるため(終端要素)) num = Split(Left(num, InStrRev(num, ",") - 1), ",") ReDim num2(UBound(num)) For i = 0 To UBound(num2): num2(i) = num(i): Next '読み込む列の要素指定 ar = Array("a", "b") 'データを読み込む For i = 0 To UBound(num2) data = "" For j = 0 To UBound(ar) data = data & Range(ar(j) & num2(i)).Value & "," Next MsgBox Left(data, Len(data) - 1) num2(i) = Split(Left(data, Len(data) - 1), ",") Next 'sheet2にデータを書き出す Sheets("Sheet2").Select For i = 0 To UBound(num2) For j = 0 To UBound(num2(i)) Range(ar(j) & i + 1).Value = num2(i)(j) Next Next End Sub 上記は最低限の処理と前提としてA列でソートされている事前提で作られています。またファイルを選択させて作業したい場合など追加処理あれば言ってください。 他に処理違い・補足があればあるならば言ってください修正します。
お礼
A列はソートしてあります。ご丁寧に式まで作っていただき、ありがとうございます。トライしてみます。
2007では、「データ」タブの「データツール」グループに「重複の削除」ボタンがあって、重複データを簡単に削除できます。 2003にはその機能がありませんか?
お礼
2007にそのような機能があることは聞いたことがあります。残念ながら私の職場ではまだ2003環境でして・・・^^;;。貴重なアドバイスありがとうございます。
- mshr1962
- ベストアンサー率39% (7417/18945)
1行目に県名 市町村名を追加、C列にて C1="フラグ" C2=COUNTIF($A$2:$A2,$A2) としてC2を下方にコピーする 「データ」「フィルタ」「オートフィルタ」で C列で1を選択すれば 行番号 A列 B列 行1 県名 市町村名 フラグ 行2 A1県 B1市 1 行6 A2県 B5市 1 となります
お礼
なるほど。マニュアルでもいろいろ可能なんですね。mshr1962さんありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
関数では自称imogasi方式で出来ます。 色々な例はWEBでimogasi方式で照会のこと。 例データ A列 B列 C列 県 市 A1県 B1市 1 A1県 B2市 A1県 B3市 A1県 B4市 A2県 B5市 2 A2県 B6市 C2の式は =IF(COUNTIF($A$1:A2,A2)=1,MAX($C$1:C1)+1,"") データ最終行まで式を複写。 結果 上記C列 Sheet2に行って A1には =INDEX(Sheet1!$A$1:$B$100,MATCH(ROW(),Sheet1!$C$1:$C$100,0),1) B1には =INDEX(Sheet1!$A$1:$B$100,MATCH(ROW(),Sheet1!$C$1:$C$100,0),2) Sheet1のC列のMAX行数だけ式を複写 結果 A1県 B1市 A2県 B5市 ーー ここでは他の方法をやってみます 例 データ A列 B列 A1:B7 県 市 A1県 B1市 A1県 B2市 A1県 B3市 A1県 B4市 A2県 B5市 A2県 B6市 データーフィルターフィルタオプションの設定 指定した範囲 ON リスト範囲 $A$1:$A$7 検索条件範囲 空白 抽出範囲 $F$1:$F$7(空きセルであれば任意) 重複するレコードhs無視する チェック 結果 県 A1県 A2県 初出の市名を出すなら G2セルに =VLOOKUP(F2,$A$2:$B$7,2,FALSE) (MATCHーINDEX関数でも出来るが。) と入れて、F列最終行まで式をコピー。 結果 県 A1県 B1市 A2県 B5市
お礼
imogasi方式ですね。調べてみます。それにしても同じことでもいろいろな知恵がありますね。ありがとうございます。
お礼
kuma56さんありがとうございます。現在のところ、最後に拝見した回答ですが、最もシンプルですばらしい工夫だと思いました。ありがとうございます。