• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセル2003のVBAを教えてパート2)

エクセル2003のVBAで重複行削除

このQ&Aのポイント
  • エクセル2003のVBAを使用して、重複する行を削除する方法を教えてください。
  • 対象データには文字1(A列)、文字2(B列)、種類(C列)の情報があり、文字1と文字2が重複する行を削除したいです。
  • 文字1と文字2が両方共同じ場合は、1行を削除して、種類のセルを空白にします。文字1が同じで文字2が異なる場合は、2行とも残し、種類のセルもそのまま残します。文字2が同じで文字1が異なる場合も、2行とも残し、種類のセルもそのまま残します。

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

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.2

H45eAさん こんにちは。   一応、以下の処理とできるかと思います。 ご確認ください、   Sub 重複削除()  Dim I     As Long  Dim J     As Long  Dim 処理範囲  As Range    Set 処理範囲 = Range(Range("A1"), Cells(Rows.Count, "C").End(xlUp))  For I = 1 To 処理範囲.Rows.Count - 1   For J = 処理範囲.Rows.Count To I + 1 Step -1    If Cells(I, "A") = Cells(J, "A") And Cells(I, "B") = Cells(J, "B") Then     Cells(I, "C").ClearContents     Cells(J, "A").EntireRow.Delete    End If   Next J  Next I End Sub

H45eA
質問者

お礼

早速の返事ありがとうございます。希望通りの処理結果でした。プログラムの内容を自分なりに理解して 次に進みます。勝手ですみませんが、この質問の前に「エクセル2003のVBAを教えて」で質問しています。そちらの方もお願いしたいのですが。今後、色々質問すると思いますがそのときはよろしくお願いします。本当に助かりました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

既に、この丸投げに対するコードの答えは出ているようだが、こういうのは丸投げしないで、ロジックをどうすれば良いか、文章で書く勉強をすることをお奨めする。丸写ししていれば進歩しないよ。 ここが初心者に回答を教える便利コーナーになると困る。 1つの方法は 原シートをそのままに、別シートに結果を出すことにする。 原シートの行を削除するのはいろんな意味でコードが複雑になるから。 現シートで (1)A列+B列の文字列をX列に作る。 (2)そのX列でソートする。 (3)直前の行を見ながら、X列が直前行と同じなら、結果シートに書きださない(何もしない)。 A A(現在) (4)ただし同じときは同じ行数(-1)を変数に記録する。 A-0 A-1 (5)X列が変わったなら、変わったと判った段階で A.直前の同じ行数が0の場合はそのまま書く。 A-0 X(変わった) A-0をそのまま書き出す。 B。同じ行数が1以上なら最終の行を書き出す。種類は空白。 Aー0 A-1 Aー2 X(変わった) A-2のみ書き出す。 こういうロジックで良いか、考えてみるのも勉強になるだろう。 ーー コードはそれから。 こういうタイプの課題は「ソート法」(「上記)とも言うべきものが役に立つ場合が多い(役立たないものもあろうが)。 バッチ処理では、コントロールブレークという手法で色んなとことに出現する。

H45eA
質問者

お礼

忠告ならびにご教授ありがとうございます。今回回答頂いた方のVBAから考え方を学び今後のプログラムに生かすつもりです。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

VBAを使うほどのことでもないでしょう。次のように関数を使って別のシートに表示させることができます。 お示しの表がシート1のA列からC列に有って1行目は項目名でデータは2行目から下方にあるとします。D列を作業列としてD2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(COUNTBLANK(A2:C2)=3,"",IF(AND(A2=A3,B2=B3),INT(MAX(D$1:D1))+1+0.5,IF(AND(A2=A1,B2=B1),"",INT(MAX(D$1:D1))+1))) そこで別のシートの1行目は項目行として、A2セルには次の式を入力して右横方向にオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(OR(ROW(A1)>MAX(Sheet1!$D:$D),COLUMN(A1)>3),"",IF(MOD(INDEX(Sheet1!$D:$D,MATCH(ROW(A1)+0.9,Sheet1!$D:$D,1)),1)=0.5,IF(COLUMN(A1)=3,"",INDEX(Sheet1!$A:$B,MATCH(ROW(A1)+0.9,Sheet1!$D:$D,1),COLUMN(A1))),INDEX(Sheet1!$A:$C,MATCH(ROW(A1),Sheet1!$D:$D,0),COLUMN(A1)))) お示しのようなデータの場合にはA2セルには0が表示されます。 0を表示したくない場合にはA、B,C列を選択してから右クリックし「セルの書式設定」の「表示形式」で「ユーザー定義」を選び種類の窓には ;; と入力すればよいでしょう。0は空白のセルに変わります。 関数は一度設定しておけばデータに変化が有ってもあるいは追加が有っても直ちに反応しますがマクロの場合にはその都度別の操作が必要となりますね。

H45eA
質問者

お礼

ありがとうございました。検討させていただきます。