• ベストアンサー

EXCELで同じ内容の行を削除

こんにちは。 行に同じデータが入っていて、それを一つだけにする方法ってありますか? ↓   1 2 3 4 1 2 3 4 2 3 4 5 2 3 4 5 とあったら、 1 2 3 4 2 3 4 5 と2行にして、要らない2行は消したいのですが。 並び替えても同じデータなため必ずそばにいて削除しづらいんです^^; 1万行とかあるので手作業はちょっと・・・。 よろしくお願いします。  

質問者が選んだベストアンサー

  • ベストアンサー
  • norakuma
  • ベストアンサー率29% (293/977)
回答No.2

Excelのマクロが使えれば、こんな方法でも。 A列にデータがあると仮定します。 マクロの実行時には、ダブリのチェックを行いたい範囲を選択してから、マクロDblChkを実行してくださいね。 では。 Sub DblChk() Dim aSelect As Variant Dim aTemp() As Variant Dim sAddr As String Dim r As Long, c As Integer Dim l As Long '■■■ 範囲設定 ■■■ If Not IsArray(Selection) Then MsgBox "ダブルチェックをしたい、正しい範囲を選択してください", vbInformation, "警告" Exit Sub End If '■■■ 65000行以上のデータへの警告 ■■■ yesno = MsgBox("65000行以上のデータでは使えません!それ以下のデータですね?", vbYesNo, "警告") If yesno = vbNo Then Exit Sub End If '■■■ 並べ替えを行う(Keyは先頭列) ■■■ Selection.Sort _ Key1:=Selection.Cells(1, 1), Order1:=xlAscending, _ Header:=xlNo, OrderCustom:=1, MatchCase:=True, SortMethod:=xlStroke '■■■ 選択範囲を待避 ■■■ aSelect = Selection sAddr = Selection.Address '■■■ 重複しない値の配列を作成する ■■■ If UBound(aSelect, 1) > 1 Then ReDim aTemp(1 To UBound(aSelect, 1), 1 To UBound(aSelect, 2)) '1行目から最後の行-1までの判定 For r = 1 To UBound(aSelect, 1) - 1 If aSelect(r, 1) <> aSelect(r + 1, 1) Then l = l + 1 For c = 1 To UBound(aSelect, 2) aTemp(l, c) = aSelect(r, c) Next c End If Debug.Print r Next r '最後の行を転記(後側のデータを残す場合) l = l + 1 For c = 1 To UBound(aSelect, 2) aTemp(l, c) = aSelect(r, c) Next c End If Range(sAddr) = aTemp End Sub

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • macbain
  • ベストアンサー率37% (147/391)
回答No.4

 #1さんとよく似たやり方なので改めて書き込むのもちょっと気が引けるのですが...。  まず現在の表を昇順・降順どちらでも並び替えをしておく。(これは#1さんの方法でも同じですね)  元のデータの先頭が1行目にある場合は1行目に行を挿入して2行目からデータが始まるようにする。  元データがA2から始まっているとして、B2に次の式を入れる。 =IF(A1<>A2,"",1)  B2のセルを選択して、セル右下にカーソルを合わせてポインタが+になったらダブルクリック。これで最終行まで演算式がコピーされます。必要なデータのB列には空白、ダブりのデータのB列は1が入ります。  表全体またはシート全体を選択→コピー→形式を選択して貼り付けで値のみを貼り付け  もう一度B列をキーに並べ替えをするとB列に1が入っている行がかたまるのでこれを削除する。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.3

VBAですが Sub Macro1() d = Range("A56356").End(xlUp).Row '一番下の行数を得る MsgBox d '---A1:AdまでA列で、昇順ソート Range(Cells(1, "A"), Cells(d, "A")).Select Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin '-----1行前のデータ m = "" j = 1 'Sheet2の書き出し初めの行 For i = 1 To d If Cells(i, "A") = m Then '直前のデータと同じか '同じ場合は何もしないで次行へ Else '----違うならSheet2に書き出し Worksheets("sheet2").Cells(j, "A") = Worksheets("sheet1").Cells(i, "A") m = Worksheets("sheet1").Cells(i, "A") '前のデータを変える j = j + 1 'Sheet2の書き出し行を1行下へ End If Next i End Sub 元シートをコピーして保存しておくこと。 列数がA列だけでない場合は Worksheets("sheet2").Cells(j, "A") = Worksheets("sheet1").Cells(i, "A")を項目数(列数)-1だけコピーして,この行のすぐ下へ挿入貼りつけして、後 ・・"A")=・・・"A")となっているところを ・・"B")=・・・"B") ・・"C")=・・・"C") ・・・ と修正してください。(「・・・」は変えなくてよい部分で表現を略した記しです。)

すると、全ての回答が全文表示されます。
  • ooc
  • ベストアンサー率16% (10/61)
回答No.1

A1からA10000にデータが入っていると仮定して聞いて下さい。 まず、A列を並べ替えて下さい。 B1に次の数式を入れて下さい。 =IF(A1=A2,"削除対象","") これを10000行コピペする。 と、ダブっている行のB列に削除対象と表示される。 データ→フィルタ→オートフィルタを選択 B1の三角をクリック 削除対象を選ぶ この段階で重複したデータのみが表示されます。 まとめて削除する。 で、うまくいくと思います。

すると、全ての回答が全文表示されます。

関連するQ&A