• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAで重複していない行を削除したいです。)

VBAで重複していない行を削除する方法

このQ&Aのポイント
  • VBAを使って、Excelのシートから重複していない行を削除する方法について教えてください。
  • 例えば、2つのシートの特定の列の値が重複していない行を抽出し、一方のシートから削除する方法について詳しく教えてください。
  • 具体的な例を挙げて、手順を教えていただけると助かります。

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

  • ベストアンサー
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

No1の方もいわれてますが説明と結果のデータが違いますけど、一応結果のデータを信用するとして、以下のコードでいかがでしょう。気分的には、削除の後で追加するのでデータのあり方によっては、なにかしらゾンビのように復活するデータが出てくるかもしれません。 削除だけしたいのでしたら、下にある追加と書かれている部分から下のEnd Withまでを削除してください。 Sub Sample() Dim i As Long Dim c As Range Dim delFLG As Boolean Dim addFLG As Boolean '削除 Sheet2にあってSheet1にないものを削除 With Sheets("Sheet2") For i = .Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1 delFLG = True For Each c In Sheets("Sheet1").Range("A1:A" & Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row) If .Range("A" & i).Value & .Range("A" & i).Offset(0, 1).Value = c.Value & c.Offset(0, 1).Value Then delFLG = False End If Next If delFLG = True Then .Range("A" & i).Delete Shift:=xlUp End If Next i End With '追加 Sheet1にあってSheet2に無いものを追加 With Sheets("Sheet1") For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row addFLG = True For Each c In Sheets("Sheet2").Range("A1:A" & Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row) If .Range("A" & i).Value & .Range("A" & i).Offset(0, 1).Value = c.Value & c.Offset(0, 1).Value Then addFLG = False End If Next If addFLG = True Then .Range(.Cells(i, "A"), .Cells(i, "A").Offset(0, 1)).Copy Sheets("Sheet2").Range("A" & Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row + 1).PasteSpecial Application.CutCopyMode = False End If Next i End With End Sub

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

その他の回答 (7)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.8

> マクロを実行してみたのですが、 > 何も起こりませんでした。 > エラーが出てデバッグするところもありませんでした。 まじでか。ん~。もちろんこれは対象のSheet1とSheet2があるExcelブックで標準モジュールを追加しなてそちらにマクロを書き込まないと駄目だぜ。多分その辺は大丈夫だと思うんだけど。 本当はこんな事言いたくないんだが、ここは「こういう事をするマクロを作ってください」というサイトではなく「こういう事をしたいのだがどういうマクロをかけば良いのか分からないからアドバイスください」というサイトだ。つまり、最終的にマクロを作るのはあなたであって、あなたが私やもう一人の回答者さんのマクロを参考にしつつ自分でやらなきゃ身につかないぜ。 まずは得られた回答から各マクロで何をやっているのか、どうしてここにIfが来るのか、何と何の値を比較しているのか、など分かる範囲からでいいから読んで解釈してみる、マクロと対象データが目の前にあるのだからステップ実行してなぜ自分の意図通りの結果にならないのか確かめる、など、マクロの修正を要求する前にできることはいくらでもあるんじゃないか。 本気で「こういう事をするマクロを作ってください」と思っていたならばここじゃなくてクラウドワークスでも行ってください。

mayovba
質問者

お礼

頼りすぎるとよくありませんね。 いろいろありがとうございました。

mayovba
質問者

補足

返信ありがとうございます。 まだマクロが動きっぱなしで できているのかがまだはっきりとわからなかったので 返信が遅れてしまいました。すいません。 いろいろアドバイスありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.7

No6の追加です。たびたび追加ですみません。 画面の描画を解除するとVBAの実行が終わったのが分からないかもしれませんので End Subの前に追加した Application.ScreenUpdating = True の後に MsgBox " 終了しました。    ", vbInformation を入れておいてください。

mayovba
質問者

お礼

ありがとうございます。 なんとかなりました。 丁寧に教えてくださって感謝しています。

全文を見る
すると、全ての回答が全文表示されます。
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.6

No5の追加です。 時間がかかる問題で、画面の描画をVBA実行中だけ一時停止したほうがいいと思いますので コードの '削除 Sheet2にあってSheet1にないものを削除 と書かれている上に Application.ScreenUpdating = False を追加して 最後の End Sub の前に Application.ScreenUpdating = True を追加しておいてください。

全文を見る
すると、全ての回答が全文表示されます。
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.5

> データが多すぎて時間がかかってしまったのと、 確かにデータが多いと時間がかかると思います。 それで、よく見たら検索結果が出ているにもかかわらず検索を続けている部分がありましたので、以下のように修正してみてください。 削除ブロックの部分 delFLG = False のところを delFLG = False Exit For に 追加ブロックの部分 addFLG = False のところを addFLG = False Exit For に あとA列とB列で変更が無いのでしたら Range("A" & i).Offset(0, 1).Value となっているところを Range("B" & i).Value にしてみてください。 Offsetを使ったのは、もしかして、本来のデータがA列とB列ではない場合、Aの指定だけを本来の列に修正すれば楽だろうと思ってやったことなので、無駄な関数を無くすことにより時間短縮につながるかもしれません。 > できたところとできなかったところがあるみたいで このあたりは、実際のデータを確認しないとなんともこちらではわからないところですが、削除の部分と追加の部分を別に実行してみて、どちらで、おかしくなるのかを確認してみてください。 また、削除できなかったのでしたら理屈的にはSheet2にあってSheet1にもあったということになりますので、ご面倒ですがSheet1の利用していないセルに=A1&B1としてデータ分下にコピーしていただいて、その列を選択し、検索を利用し、削除できなかったSheet2のA列とB列のデータを、そのまま検索する文字列のボックスにA列B列の順にコピーしてもらって検索を掛けてみてください。 追加の場合は、削除の部分を実行後、シートを逆に考えて検索を実行してみてください。 どちらの場合も、検索でヒットしなければ何かしらコードにおかしいところがある事になりますが、現在考える限りでは、私のつたない頭ではおかしそうなところは見つかりませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.4

> sheet1とsheet2のA列とB列がそれぞれセットで一致している行は > 残しておきたいんです。 > sheet1の方が行は少ないです。 ふむふむ。 > ・sheet1とsheet2のAB列を見比べる。 > ・A列とB列はどちらも昇順に並んでいる。 > ・sheet1に無くてsheet2にものをsheet2から削除。 > まではその通りです。 おーけー。 > ・sheet1に有ってsheet2に無いA列とB列はありません。 おおうこういう条件があるなら楽勝だわ。 以下、Sheet1とSheet2いずれかのA列が空っぽになったら終わるという終了条件で 要求を満たすプロシージャーを書いてみた。 1.Excelを開いてShift+F11でVBA画面を開く 2.標準モジュールを作る。例えばModule1 ~~~~Module1の中身~~~~ Option Explicit Public Sub DeleteFromSheet2ExcludeMatchingSheet1() Dim sht1 As Excel.Worksheet Dim sht2 As Excel.Worksheet Set sht1 = ThisWorkbook.Worksheets("Sheet1") Set sht2 = ThisWorkbook.Worksheets("Sheet2") Dim l1 As Long Dim l2 As Long l1 = 1 l2 = 1 Do While sht1.Range("A" & CStr(l1)).Value <> "" And sht2.Range("A" & CStr(l2)).Value <> "" If sht1.Range("A" & CStr(l1)).Value <> sht2.Range("A" & CStr(l2)).Value _ Or sht1.Range("B" & CStr(l1)).Value <> sht2.Range("B" & CStr(l2)).Value Then Call sht2.Rows(l2).Delete Else l2 = l2 + 1 l1 = l1 + 1 End If Loop Do While sht2.Range("A" & CStr(l2)).Value <> "" Call sht2.Rows(l2).Delete Loop End Sub ~~~~~~~~ これで、Excelを開いてAlt+F8を押すと実行可能マクロ一覧画面が出てきて DeleteFromSheet2ExcludeMatchingSheet1 が選択肢にあるのでそいつを選ぶとやってくれるぜ。 もちろん、先にバックアップをとってから試してみてくれ。

mayovba
質問者

補足

返信ありがとうございます。 マクロを実行してみたのですが、 何も起こりませんでした。 エラーが出てデバッグするところもありませんでした。 以下、Sheet1とSheet2いずれかのA列が空っぽになったら終わるという終了条件で 要求を満たすプロシージャーを書いてみた。 が良く分からなかったのですが、 sheet1とsheet2の列Aと列Bが一致している行は残して、 列Aと列Bが一致していない行はsheet2から消したいです。 宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.3

No2です。訂正と補足です 削除のブロックで .Range("A" & i).Delete Shift:=xlUp のところを .Rows(i).Delete Shift:=xlUp に変更してください また、追加のブロックで現在はA列とB列を追加することにしていますがF列までデータがあるのでしたら .Range(.Cells(i, "A"), .Cells(i, "A").Offset(0, 1)).Copy のところを .Range(.Cells(i, "A"), .Cells(i, "A").Offset(0, 5)).Copy に変更するか 行のデータを全て追加でよければ .Rows(i).Copy に変更してください。

mayovba
質問者

補足

返信ありがとうございます。 マクロを実行してみたのですが、 データが多すぎて時間がかかってしまったのと、 できたところとできなかったところがあるみたいで 返信が遅れてしまいました。 できる所とできない所がなざできるのかわかりません。 どうすればいいでしょうか? 宜しくお願いします。

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

ん~。仕様をまとめると ・sheet1とsheet2のAB列を見比べる。 ・A列とB列はどちらも昇順に並んでいる。 ・sheet1に無くてsheet2に有るものをsheet2から削除。 ・sheet1に有ってsheet2に無いものをsheet1からコピー。 ←ここが正しいか要確認 という事でよいだろうか。 単純にsheet2は削除だけじゃないよね。sheet2の結果に最初はなかった「番号Fの10」が10行目に出来上がってるんだから。この場合はCDEF列はsheet1の内容をコピーするという事で良いのかい? それか結果の方が誤りなのかな? 「sheet2から重複していない行を削除」という言葉を額面通りに受け取ると、結果は以下のようになるはずだ。 sheet2 A B CDEF 1 番号A 1 2 番号A 2  3 番号A 3 4 番号C 1 5 番号C 2 どちらが正しいのか教えてもらっていいかな。

mayovba
質問者

補足

回答ありがとうございます。 わかりにくくてすいません。 sheet1とsheet2のA列とB列がそれぞれセットで一致している行は 残しておきたいんです。 sheet1の方が行は少ないです。 ・sheet1とsheet2のAB列を見比べる。 ・A列とB列はどちらも昇順に並んでいる。 ・sheet1に無くてsheet2にものをsheet2から削除。 まではその通りです。 ・sheet1に有ってsheet2に無いA列とB列はありません。 sheet1とsheet2にはもっとたくさん行が あったのでこのような形に書いてしまいました。 宜しくお願いします。

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

関連するQ&A

  • 【Excel VBA】重複行の削除

    はじめまして。 IDの重複を削除し、日付データを横1列にまとめるVBAについてご教示いただけますと幸いです。 ------------------------------------------------------- ▼シート1(データ入力がされているシート)    A   B   C   D   E   F    1   ID 日付 2  1234  1/1  1/6  1/10  1/20   3  1234  2/3  2/20 4  1234  3/2 5  7777  1/10  1/15  1/20 6  7777  2/2   2/12  2/22 7  9876  2/3 ⇓ マクロ起動後 ▼シート2(重複行を削除しまとめたシート)    A   B   C   D   E   F   G   H 1   ID 日付 2  1234  1/1  1/6  1/10  1/20  2/3  2/20  3/2 3  7777  1/10  1/15  1/20  2/2  2/12  2/22 4  9876  2/3 【補足】 列情報  ・A列…ID  ・B-F列…日付(左詰め) ※日付はIDごと月毎に行が変わるため、IDによって複数行存在する場合があります。 ※A列のIDは重複しない場合もあれば、4行以上ある場合があります。 ※シート1のデータはおおよそ1000-5000行です。 ※IDに対して、日付は5つあれば問題ありません。そのためG列以降の日付を削除しても支障はございません。 ------------------------------------------------------ VBAの知識があまりなく、調べて出てきたものをコピペ使用も試みたのですが、 上手く動かす事ができませんでした…。 お力添え頂けますと幸いです…。 Windows10でエクセル2016を使用しております。 何卒宜しくお願いいたします。

  • Excel2010で行ごとの重複削除

    Excel2010です。 A行目 1 3 5 5 2 2 3 B行目 2 3 5 5 4 4 C行目 1 9 7 9 9 ↓ A行目 1 3 5 2 B行目 2 3 4 5 C行目 1 7 9 というように、行ごとに重複の削除をしたいと思っています。 データタブに重複の削除があるのですが、列ごとにやるようなので、一度シート全体を 行と列を入れ替えて別シートにコピーして、 1列目全体を選択して、1列目で重複の削除を実行 2列目全体を選択して、2列目で重複の削除を実行 ・・・ というやり方もあるのですが、今扱っているエクセルは197行197列あります。 列選択、重複の削除アイコンをクリックするのを197回繰り返すのは大変です。 自動化する方法はないものでしょうか?

  • エクセルまたはVBAで重複行を削除

    例えば、 A B 1 1 a 2 2 b 3 3 c 4 4 d 5 4 d 6 5 e 7 6 g 8 6 g といった表があるとします。 A列をキーに、昇順にされた一覧表です。 ここで番号が重複している行、この例では4行目と5行目、7行目と8行目がそうです。 こういった重複した行を検索して、行削除したいのですがどんな方法が可能でしょうか? 最終的にはVBAでのイベントになるでしょうが、それ以前にエクセルで前準備などしておくようなことは必要でしょうか? 表自体はかなり膨大な量のデータベースです。 よろしくお願いします。

  • エクセルVBAで重複データの削除

    A列、B列、C列・・・とデータが入っていて、B~D列の5行目から10行目が関連の有るデータのかたまりとします。 C~D列の全てのデータが重複している場合に、最初のほうのデータ(行番号が小さいほう)を残すものとして、重複データを削除したいのです。 削除するときは、 B~Dの範囲で削除する。A列等は削除しない。 削除したらデータは上に詰める。 データはソートしない。 ということをやりたいのですが、簡単に出来ますでしょうか? 良く覚えていないのですが、ネット上で色々探してみても、必ずソートしている気がしたので、ソートしない方法が知りたいのですが。

  • マクロによる条件での行の入力と削除

     初めまして、よろしくお願いします。  次のような二枚のシートがあります  シート1      A  B  C   1     2       ・      99      100 23    101 25   102 31   103 34  104 43  105 44  106 49  107 50  108 55  109 60  110  111  ・  ・  シート2      A  B  C   1     2       ・      99      100 23  1 2 3   101 25  4 5 6 102 31  7 8 9     103 34  0 1 2  104 43  3 4 5     105 44  6 7 8 106 49  9 0 1 107 50  2 3 4 108 55  5 6 7 109 60  8 9 0 110  111  ・  ・ シート1とシート2のA列に入っている数字が通し番号です。シート2では加えてその通し番号のデーター数字がB列、C列、D列に入っています。 のこシート1の通し番号31が削除、代わりに通し番5番と51番を追加し、  シート1      A  B  C   1     2       ・      99      100  5 101 23    102 25     103 34  104 43  105 44  106 49  107 50  108 51 109 55  110 60  111  112  ・  ・ マクロを実行すると  シート2      A  B  C   1     2       ・      99      100  5 101 23  1 2 3   102 25  4 5 6    103 34  0 1 2  104 43  3 4 5     105 44  6 7 8 106 49  9 0 1 107 50  2 3 4 108 51 109 55  5 6 7 110 60  8 9 0 111  112  ・  ・ シート2がこように通し番号31が入っていた行番102行が削除され、新たに通し番5番が行番100に、51番が行番108に挿入追加されるマクロを教えていただきたく、よろしくお願いします。

  • VBA 特定の行を別シートへコピー・削除

    下記のように、VBAで特定の行を抽出して別シートへコピーし、コピーした行については元リストデータを削除したいです。 具体的には、【出荷sheet】(C列注文番号は、出荷があった時に入力済)へ、注文番号に対応する行を【リストsheet】から抜き出してコピーし、コピー後は、【リストsheet】から該当行を削除したいです。 検索により調べてもうまく合致する回答が見当たらず困っています。 VBAの理解度は未熟ですが、何卒ご教授いただけると幸いです。 【リストsheet】 A列 B列  C列   D列 ・ ・ ・ J列 No. 日付 注文番号  品名 ・ ・ ・ ・ 1  1/1   A111   鉛筆  ・ ・ ・ ・ ←コピー後、削除  2   1/2   B222   ペン  ・ ・ ・ ・ 3    1/5  C555 消しゴム・ ・ ・ ・ ←コピー後、削除  ・ ・   ⇓ 【出荷Sheet】 A列 B列  C列   D列 ・ ・ ・ J列 No. 日付 注文番号  品名 ・ ・ ・ ・ 1  1/1 A111   鉛筆   ・ ・ ・ ・ 3   1/5   C555 消しゴム・ ・ ・ ・

  • 重複行を削除

    重複する行をVBAコードで削除したいのですが A列 B列 C列 あ  1  a あ  1  a あ  2  a い  1  a い  2  c い  2  c A列 B列 C列 あ  1  a あ  2  a い  1  a い  2  c のようにABC列同一文字は1行にしたいのですがVBAコード、関数の解る方ご教授願います。

  • Excel VBAで値が重複する行を削除する

    Excel2000を使っています。 シートAに数千件のデータがあります。 シートBのE列にある文字とシートAのD列の文字が重複する場合に、シートAの重複するセルがある行を削除する(且つできれば行のデータを抜き出すVBAを作ろうと考えています。 最近VBAの初心者本をやっと理解したところで、ちんぷんかんぷんとまではいかないけど、知恵熱がでました。 仕事なので自分でなんとかすべきかと思いますが、きっかけの調べ方がまずわからない。 どなたか、解かるきっかけだけでも与えて頂けないでしょうか。とくに、別シートの値と重複する値を探す場合に何をいれるかわかればきっと道は開けると思うんですが…。 初めての質問なので、質問内容が至らなかったらもうしわけありません。

  • 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市  データベースが大きいため、手作業で削除して行くのは大変です。適当な方法がありましたら、是非、ご教示ください。  どうぞ宜しくお願いします。  

  • 1行複数列の中にある重複数字を削除する方法

    どなたかご存じでしたらご回答よろしくお願いします。 【質問】  エクセルシートA列~F列に1~31迄の数字が順不同に入っています。  これをG列~L列に「重複数字は1つにして昇順に並べる」方法が知りたいです。 ●エクセルシート  A  B  C  D  E   F  G  H  I  J  K  L   4  14  20  19  4  19  4  14  19  20 ←重複数字は1つになる。    15  5  9            5   9   15  6  12  12  24        6   12  24    ←重複数字は1つになる。   4  26  8   6        4   6   8  26  ●注意事項   ・使用するエクセルは2010です。 以上、よろしくお願いします。