• ベストアンサー

複数列の条件が合致する重複行を削るマクロ

1行目は項目が書いてあり、データ自体は2行目以降になります。 B列、D列、F列が重複するデータについては、一番上の行のひとつだけを残して残りの行を削除する方法です。 削除した空白行は作らないようにします。 その際、最終的に、B列を基準にソートになるように並び変えます。 ひとつだけの列が該当する場合の削除はわかるのですが、この場合、どのように記述したらいいのでしょうか。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.2です。 >作業用シートを作りたくないので、出来れば同一シート内で作業したいのですが・・・ とありますので、元データそのものを変更します。 シートモジュールにしていますので、Sheet1のVBE画面にコードをコピー&ペーストしてマクロを実行してみてください。 Sub Sample1() Dim i As Long, k As Long Application.ScreenUpdating = False Range("A:B").Insert i = Cells(Rows.Count, 3).End(xlUp).Row Range(Cells(2, 1), Cells(i, 1)).Formula = "=D2&""_""&F2&""_""&H2" Range(Cells(2, 2), Cells(i, 2)).Formula = "=IF(COUNTIF(A$2:A2,A2)=1,1,"""")" For k = i To 2 Step -1 If Cells(k, 2) = "" Then Rows(k).Delete End If Next k Range("A:B").Delete Cells(1, 1).CurrentRegion.Sort key1:=Cells(1, 2), Order1:=xlAscending, Header:=xlYes Application.ScreenUpdating = True End Sub こんなんではどうでしょうか?m(_ _)m

hiro5314
質問者

お礼

ありがとうございます ばっちりでした!

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

その他の回答 (2)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! 一例です。 Sheet1のデータをSheet2に表示するようにしてみました。 ↓のコードを標準モジュールにコピー&ペーストしてマクロを実行してみてください。 尚、A列で最終行の取得、データの範囲指定を行っていますので、 A列には必ずデータが入っている!という前提です。 Sub Sample1() Dim i As Long, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") Application.ScreenUpdating = False wS2.Cells.ClearContents wS1.Range("A:B").Insert i = wS1.Cells(Rows.Count, 3).End(xlUp).Row Range(wS1.Cells(2, 1), wS1.Cells(i, 1)).Formula = "=D2&""_""&F2&""_""&H2" Range(wS1.Cells(2, 2), wS1.Cells(i, 2)).Formula = "=IF(COUNTIF(A$2:A2,A2)=1,1,"""")" wS1.Cells(1, 1).CurrentRegion.AutoFilter , field:=2, Criteria1:=1 wS1.Range("C:H").Copy wS2.Cells(1, 1) wS2.Cells(1, 1).CurrentRegion.Sort key1:=wS2.Cells(1, 2), order1:=xlAscending, Header:=xlYes wS1.Range("A:B").Delete wS1.AutoFilterMode = False Application.ScreenUpdating = True End Sub こんな感じではどうでしょうか?m(_ _)m

hiro5314
質問者

補足

ありがとうございます。 作業用シートを作りたくないので、出来れば同一シート内で作業したいのですが、可能でしょうか? Sheets("Sheet2").Select Cells.Select Selection.Copy Sheets("Sheet1").Select Cells.Select ActiveSheet.Paste と最後に加えることでシート1に結果を出力できるのですが、 たとえば、シート2に結果を出すのでなく、シート1のG列以降のスペースを使って結果出力し、それをA列にコピー、G列以降の元データを削除 こんな感じはどうすればいいでしょうか

全文を見る
すると、全ての回答が全文表示されます。
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

一列追加して =B列&","&D列&","&F列 を計算する数式をマクロで並べ、それを使って >ひとつだけの列が該当する場合の削除はわかる のマクロに引き継ぐのが、たぶん一番あなたにとって手っ取り早い方法です。 #そもそも何のソフトのご相談なのかも書かれてませんが、普段あなたが使うソフトのバージョンもしっかりご相談に書いてください。それによっては、もっと簡単な方法が使える場合もあります。今回はこれ以上フォローはしませんが、次のご相談からは覚えておいてください。

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

関連するQ&A

  • 複数列の重複と空白を削除するマクロ(VBA)

    マクロの初心者です。 添付写真のように、複数列の重複セルと空白セルの両方を削除し、各列のデータを10列目から並べたいのですが、この場合、どのようなマクロを書けばよいでしょうか。 データの個数: 列によりますが、最大1000行程度 列数: A~J(空白列はありません)

  • SQLでの複数列が重複してる行の削除(SQLite)

    こんにちは。 複数の列で重複した列がある場合の行削除のクエリが思い付きません。 A表 A    B   C   D   ==== === === ==== 1 ああああ 100 200 ABCD 2 いいいい 200  90 ASKB 3 うううう 300 800 ALTE 4 ええええ 400 200 ABCD B表   ==== === === ==== 1 ああああ 100 200 ABCD 2 ああああ 400 100 ABCD このとき、A表とB表を比較し、B,C,D列で重複したデータをB表から削除した行を表示したいのです。 ほしいデータは B表   ==== === === ==== 2 ああああ 400 100 ABCD です。よろしくお願いします。

  • Excel2003 マクロで同じ文字列の行を消す

    Excel2007からは重複したデータを消すことは出来ますが、同じ文字列を全部消す(ひとつものこらず)方法が無いか悩んでいます。 例えば、A1に「1234」 A2に「4231」 A3に「1234」がある場合、A1とA3どちらも削除したいです。 このような事が自動で出来るマクロをどのようにすれば作れるでしょうか? 私が考えているのは、 1)A列をソート 2)一つ前の行と比較して同じならどちらの行も消す (同じデータは、2つ以上ないです) という具合なのですが、2の部分の書き方が分かりません。

  • セルの値が同じ行を条件に従って行削除するマクロ

    A~E列までデータがあり 行数は約30,000行あります。 A列は半角英数字と-で桁数は11桁又は14桁です。 数字のみもあれば数字と英字の組み合わせもあります。 (英字はどこの桁にあるか何個あるかは不規則です) 例 ABCD123456789X 124345678901234 55555-55555 ABC12345DEF678 E列には半角の 1 か 2 しかありません。 A列が同じ値の行を検出して重複している行は1行だけ残して 後は行削除をしたいです。 行削除はE列の値によって判定したいです。 重複行は1つの値に対して何行あるか不明です。 30,000行のうち、重複行を削除すると10,000行くらいになる予定です。 (1)重複行にてE列の値が1だけの場合    どれでもいいので1行残して残りは行削除 (2)重複行にてE列の値が2だけの場合   どれでもいいので1行残して残りは行削除 (3)重複行にてE列の値が1も2もある場合   E列の値が2の行をどれでもいいので1行残して残りは削除 例 (1) 1234567890XXXX-1 1234567890XXXX-1 1234567890XXXX-1 ↓ 1234567890XXXX-1 (2) 123ABCDE901234-2 123ABCDE901234-2 ↓ 123ABCDE901234-2 (3) 12345678901234-1 12345678901234-2 ↓ 12345678901234-2 ABC45678901234-1 ABC45678901234-2 ABC45678901234-1 ABC45678901234-2 ↓ ABC45678901234-2 手作業では5時間かかりましたがミスだらけです。 まだ数ファイル残っており手作業では厳しいのでマクロを 作成したいのですが、どう記述していのかまったく検討が付きません。 どうかよろしくお願いします。

  • セルの値が指定条件なら対象行を削除するマクロ

    ボタンクリックでプロシージャーが起動します。 そのマクロの中で以下の2つの処理を追加させたいです。 マクロの記述を教えてください。 A~F列までデータが有ります。 1行目は項目で2行目からデータがあります。 行数は都度相違しますが10,000行はあります。 (1) F列の値は標準で、ここが0の場合その行全体を削除します。 入っている値の例 -1234→削除しない 345→削除しない 12346→削除しない 0→削除する セルの空白はぜったいありません。 (2)-1 E列の値は標準で英数字3ケタです。ところどころ空白があります。 E列の値が先頭7B以外は行全体を削除します。 7B1→削除しない 7B2→削除しない 7BW→削除しない 77C→削除 47B→削除 空白→削除 F列を優先なのでE列が7Bで始まっている行でも F列が0なら削除となります。 (2)-2 (2)-1と同じでE列の値は標準で英数字3ケタです。 ところどころ空白があります。 E列の値が 先頭 7Bと72以外 又は CとDと7B以外は 行全体を削除します。 のように(2)-1のように1条件ではなく2~複数になる。 それが1文字の場合、2文字の場合、3文字全部の場合がある F列を優先なのは(2)-1と同じです。 条件例 ・Cと73以外 ・CとFと72以外 ・Gと7Vと8D以外 ・Gと88と8D5以外 以下の記述ですが、(1)は思ったとうり動作しましたが ●の部分が分かりません。 現在の記述では7BB以外は全部行削除されてしまいます。 (2)-1と(2)-2の対応のために 記述内で(2)-1と(2)-2を 書き換える事が出来るような記述にしたいです。 あと凄く処理が遅いので高速化もしたいです。 よろしくお願いします。 Sub test01() 'A~K列のデータにて 'E,F,H,I,K列を列削除する Columns("E:F").Select Selection.Delete Shift:=xlToLeft Columns("F:G").Select Selection.Delete Shift:=xlToLeft Columns("G:G").Select Selection.Delete Shift:=xlToLeft 'データがA~F列になりました。 With ActiveSheet 'アクティブなシートについて x = .UsedRange.Cells(.UsedRange.Count).Row 'xに最終行を取得 For i = x To 2 Step -1 '最終行から2行目まで下から順に 'F列が"0"だったらその行を削除 If .Cells(i, 6) = 0 Then .Rows(i).Delete Next '繰り返し End With With ActiveSheet 'アクティブなシートについて x = .UsedRange.Cells(.UsedRange.Count).Row 'xに最終行を取得 For i = x To 2 Step -1 '最終行から2行目まで下から順に 'E列の値の先頭文字が"7B"でなかったら削除(空白の場合も削除) ●If .Cells(i, 5) <> "7BB" Then .Rows(i).Delete Next '繰り返し End With End Sub

  • 重複行削除のマクロ

    重複行を削除するマクロを作っていますが、うまくいきません。 2行目にタイトルが入っていて、3行目以降が必要なデータになります。 この中でA列が一致しているデータ行を削除したいと考えており、 重複データが削除された後、タイトル行がなぜか一番下の行にはりついてしまいます。 どなたか詳しい方助けてください!!!よろしくお願いします。 ちなみに以下が現在使用しているVBAコードです。 =============================================================== Sub GoodRemoveDuplicates() 'A列にデータが入力されており、そのデータを並べ替えた後、 '重複するデータが含まれている行を削除するマクロ Worksheets("貼り付け用用マクロ").Range("A1").Sort _ key1:=Worksheets("貼り付け用用マクロ").Range("A1") Set currentCell = Worksheets("貼り付け用用マクロ").Range("A1") Do While Not IsEmpty(currentCell) Set nextCell = currentCell.Offset(1, 0) If nextCell.Value = currentCell.Value Then currentCell.EntireRow.Delete End If Set currentCell = nextCell Loop End Sub ===============================================================

  • エクセルVBAで複数条件とデーターの重複チェック

    ユーザーフォーム(UserForm1)からSheets("データー")に転記しています 今現在はUserForm1のデーターを入力後「CommandButton2」でシートに書き込みしていますが、重複データーが出て来るので、「CommandButton2」を押した時に重複を防ぎたいのです データーはSheets("データー")の最終行に次々と転記していってます Sheets("データー")に見出し行あり Dim RowNum As Long '最終行 その中で[Me.textbox1]&[Me.textbox3]は必須項目したい .Cells(RowNum, 3).Value = Me.textbox1.Value  'メイン:必須項目 .Cells(RowNum, 4).Value = Me.textbox2.Value  'サブキー:空白でもOK .Cells(RowNum, 5).Value = Me.textbox3.Value  'キー:必須項目 やりたいこと ユーザーフォーム(UserForm1)のテキストボックス入力完了後「CommandButton2」でシートに書き込み時に重複チェック 【UserForm1上の空白チェック】 (1)Me.textbox1&Me.textbox2&Me.textbox3の空白チェック 条件 Me.textbox2は空白でもOK (2)Me.textbox1が空白の場合UserForm1に入力したデーターを保持したままtextbox1をフォーカスする(できれば背景色と文字色を変える。入力後背景色と文字色は元に戻す) (3)Me.textbox3が空白の場合UserForm1に入力したデーターを保持したままtextbox3をフォーカスする(できれば背景色と文字色を変える。入力後背景色と文字色は元に戻す) (4)Me.textbox2が空白の時はメッセージを表示「空白のままでいいですか?はい・いいえ」 (5)はいの時は処理を続行 (6)いいえの場合は場合UserForm1に入力したデーターを保持したままtextbox2をフォーカスする(できれば背景色と文字色を変える。入力後背景色と文字色は元に戻す) 【データーシートとの重複チェック】 (7)textbox3&Sheets("データー")の該当全セル列の重複チェック 条件1 textbox2が空白の時 Me.textbox1&&Me.textbox3とSheets("データー")メイン&キー該当全セル列との重複チェック (8)重複の場合はメッセージを表示「キーが重複しています!修正して下さい」OKボタンのみ (9)OKが押されるとUserForm1に入力したデーターを保持したままtextbox3をフォーカスする(できれば背景色と文字色を変える。入力後背景色と文字色は元に戻す) 条件2 textbox2にデーターがある場合Sheets("データー")のサブキー&キー該当全セル列との重複チェック (10)重複の場合はメッセージを表示「キーが重複しています!修正して下さい」OKボタンのみ (11)OKが押されるとUserForm1に入力したデーターを保持したままtextbox3をフォーカスする(できれば背景色と文字色を変える。入力後背景色と文字色は元に戻す) (12)重複が全てなくなったらSheets("データー")の最終行に書き込み (13)UserForm1をブランク状態で表示 以上よろしくお願い致します

  • マクロにて重複データの削除を行う方法

    エクセルにてD列、H列において重複が両方に存在する場合に (D列にて重複かつH列にても重複する場合) そのデータを行ごと削除したいのですが、 上記のマクロの記述が分からず困っております。 どなたか方法をご伝授いただけたらうれしいです。

  • エクセルで重複行を削除

    エクセルで重複行を削除したいのですが、 どうすればいいでしょうか? たとえば名前が1列に並んでいて ××○○ 山田太郎 △田□□ 山田太郎 こんなとき、山田太郎を1行だけに、 まとめたいのですが・・・ データが多いのでソートして 1件1件削除していくのも時間がかかります。 何かいい方法がありましたら よろしくお願いします。

  • 行挿入マクロをご教示ください

    A列の5行目から1000行ほどK列までデータが入っています。 A列からK列をB列優先でソートを行うと、B列にところどころ同じ番号が2行あったり、3行あったり、また4行とバラバラで、出てきます。 この場合、同じ番号が2行以上あるセルの上に空白の行1行を挿入し、同じ番号行分を合計して整理したいと考えています。 2行以上ある行の上に空白行を1行挿入するようなマクロをご教示ください。 どなたか、よろしくお願いします。

専門家に質問してみよう