• ベストアンサー

【Excel VBA】条件つき行削除

Excel2003を使用しています。 システムからCSVで落としたデータで、データの並び方に規則性があるので、それを利用して、不要部分のデータをマクロで削除できないかと思い、質問させていただきます。 A列に『累計』を含む文字があった場合、その行のD列が0だったら、その行より上の行のA列に『計上日』と入力されている行までを削除するということをしたいです。 下記でいうと、2~5行までを削除したいです。    A     B     C     D 1 2 計上日 3 4 5 累計                0 6 7 計上日 8 9 累計              1000 上記では、B列、C列には何も書いていませんが、実際はデータが入力されていたり、空欄だったりです。 D列が0の行を削除するコードはわかるのですが、さらに、条件が加わっても同じように処理は可能でしょうか? よろしくお願いします。

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

こんなマクロでもできそうです。念のため元のシートをコピーしてから実行するようにしました Sub Macro1() Dim idx As Long Dim rng As Range  Application.ScreenUpdating = False  ActiveSheet.Copy after:=ActiveSheet  For idx = Range("A65536").End(xlUp).Row To 1 Step -1   If Cells(idx, "A") = "計上日" Then    Set rng = Range(Cells(idx, "A"), Cells(65536, "A")).Find(what:="累計", LookIn:=xlValues, lookat:=xlWhole)    If Not rng Is Nothing Then     If rng.Offset(0, 3).Value = 0 Then      Range(Rows(idx), Rows(rng.Row)).Delete     End If    End If   End If  Next idx  Application.ScreenUpdating = True End Sub >さらに、条件が加わっても同じように処理は可能でしょうか? できると思いますが、その条件が指定されないとマクロは書けません。 ご自身で工夫してみてください。 あまりお急ぎの質問ではないようですが、その「工夫」を更に求めたいなら補足は早めにお願いします。 何日も経ってから補足されても再度巡回する保証はありませんので…

rx-z5815
質問者

お礼

回答ありがとうございます。 教えていただいたマクロで試してみたところ、うまくいきました。 >さらに、条件が加わっても同じように処理は可能でしょうか? >できると思いますが、その条件が指定されないとマクロは書けません。 >ご自身で工夫してみてください。 書き方が紛らわしかったようで、申し訳ありません。 “D列が0の行を削除する”という条件に、今回のようにもうひとつ条件が加わっても…という意味で、書いていたつもりでした。 今回は教えていただいたコードを参考にさせていただき、無事完成しました。 ありがとうございました。

その他の回答 (3)

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

ロジックの一例 ForNextでやると、行削除は最下行からやるほうが都合がいい。 コード データのあるシートをアクチブシートにして実行。 Sub tet01() d = Range("A65536").End(xlUp).Row For i = d To 2 Step -1 If dl = "Y" And Cells(i, "A") = "計上日" And dl = "Y" Then 'この行が計上日で、累計行 AND D列0が先にあり(dl=”Y")なら MsgBox i & "-" & x & " 削除処理" Rows(x & ":" & i).EntireRow.Delete dl = "N" '累計とのペアー待ち状態解消 End If If Cells(i, "A") = "累計" And Cells(i, "D") = 0 Then dl = "Y" 'D列0で累計行現れた x = i 'その行を記憶 End If Next End Sub ーーー 例データ 質問者の意図に沿わない部分があるかも知れないが、ご容赦を A列   B列     D列 集計 計数 1 計上日 3 4 累計 0<ーーD列,以下累計の跡の数字はD列 計上日 5 6 累計 11 計上日 7 8 累計 0 12 計上日 13 14 累計 0 15 計上日 16 17 累計 20 計上日 18 累計 1000 ーーー 結果 集計 計数 1 計上日 5 6 累計 11 12 15 計上日 16 17 累計 20 計上日 18 累計 1000 ーー 少数例のテストしかやってないこと、 万一ロジックの不完全があるかも知れないが、コード数は少ないと思う。

rx-z5815
質問者

お礼

回答ありがとうございます。 >ForNextでやると、行削除は最下行からやるほうが都合がいい。 手元にある参考書にも同様のことが書いてありました。 教えていただいたコードでも、うまくいきました。 MsgBox で、1回1回の削除の状態を確認できて、分かりやすかったです。 ありがとうございました。

  • qualheart
  • ベストアンサー率41% (1451/3486)
回答No.2

これでどうでしょう? 至極単純に作りましたが・・・ Sub Macro1() Range("A:A").Select endline = Selection.Find( _ What:="累計", _ After:=ActiveCell, _ LookIn:=xlFormulas, _ LookAt:=xlPart, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, _ MatchCase:=False _ ).Row n = 1 Do Until n = endline If Cells(n, 1) = "計上日" Then a = Cells(n, 1).Row End If If Cells(n, 1) = "累計" And Cells(n, 4) = 0 Then Range(Cells(a, 1), Cells(n + 1, 1)).EntireRow.Delete n = n - (n - a) End If n = n + 1 Loop End Sub

rx-z5815
質問者

お礼

回答ありがとうございます。 教えていただいたコードで試してみたところ、うまくいきました。 Do Until ~ Loopステートメントを使用してもできるのですね。 あまり使い慣れていないので、勉強になります。 ありがとうございました。

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.1

こんにちは。 以下のマクロを試してみてください。 Sub 削除()   Dim mR     As Long   Dim wR     As Long   Dim sR     As Long   '   With ActiveSheet     mR = Range("A" & Rows.Count).End(xlUp).Row     For wR = mR To 1 Step -1       If .Cells(wR, "A") = "累計" Then         If .Cells(wR, "D") = 0 Then           '開始行を求める           sR = Get_StartRow(wR)           .Rows(sR & ":" & wR).Delete Shift:=xlUp           wR = sR         End If       End If     Next   End With End Sub ' '開始行を求める Function Get_StartRow(wI As Long) As Long   Dim wR     As Long   '   Get_StartRow = 0   With ActiveSheet     For wR = wI To 1 Step -1       If .Cells(wR, "A") = "計上日" Then         Get_StartRow = wR         Exit For       End If     Next   End With End Function

rx-z5815
質問者

お礼

回答ありがとうございます。 記載していただいたマクロを試してみたところ、うまくいきました。 Functionプロシージャは、ここでも何度か教えていただいたことがあるものの、自分で記述するところまではまだまだです。 おかげさまで、勉強になりました。 ありがとうございました。

関連するQ&A

  • 【Excel VBA】条件を満たすデータを順に抽出

    Excel2003を使用しています。 CSVでExcelに取り込んだデータの中から、条件を満たすものを順に抽出して一覧表を作成するマクロを作りたいのですが。。。 ・Sheet2のB列に“コード”と入力されている行のC列のデータ → Sheet1のC列2行目以下 ・Sheet2のC列に“合計”と入力されている行のD列のデータ → Sheet1のD列2行目以下 に順に表示させたいのですが、うまくいきません。 以前、いただいた回答で参考になりそうなものを見てみたのですが、手順というか何かヒントのようなものをいただけたら、自分でどうにかできそうなので、質問させていただきました。 よろしくお願いします。

  • 【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を使用しております。 何卒宜しくお願いいたします。

  • Excel VBA 2つの条件を満たした行を削除

    Excel2003を使用しています。 CSVファイルを元にデータを作りたく、まずは不要なデータを削除しています。 J列=0の行とJ列=0の行のA列の値と同じ値がA列に入力されている行を削除したく、J列=0のA列の値を一旦別シートに抽出し、その抽出したデータとA列のデータをループして、一致したら削除というコードを書きました。 もし可能であれば、一旦別シートに抽出せずに処理したいのですが、その場合、どのようにコードを書けばいいでしょうか? よろしくお願いします。

  • 【Excel VBA】4つの条件を満たすデータを行ごと削除

    Excel2003を使用しています。 ある表の中のデータで、A列に次の条件に当てはまるデータを行削除したいのですが、マクロではどのように書いたらいいのでしょうか? (1) @(アットマーク)から始まる場合 (2) 数字から始まる場合 (3) ”キー”と入力がある場合 (4) 空白の場合 よろしくお願いします。

  • 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回繰り返すのは大変です。 自動化する方法はないものでしょうか?

  • 【Excel VBA】複数の条件を満たすデータを行削除

    Excel2003を使用しています。 ある表の中のデータで、次の4つの条件を満たすデータを行削除したいのですが、マクロではどのように書いたらいいのでしょうか?  E列…データが入力されている  F列…空白  G列…空白  H列…空白 よろしくお願いします。

  • 【Excel VBA】複数範囲の並べ替えは可能でしょうか?

    【Excel VBA】複数範囲の並べ替えは可能でしょうか? Excel2003を使用しています。 CSVデータを元に作成された下記のような表があります。 A列…日付、B列…受注番号、C列…摘要(会社名・品名等)、D列…金額となっています。 6行目以下に上記の内容でデータが入力されていますが、会社ごとのデータ内で日付順に並べ替えをしたいのですが、VBAで複数の範囲を選択して、それぞれの範囲内での並べ替えは可能でしょうか?     A     B     C    D 6             ○○会社 7   1/20   123   AAA   1,000 8   1/15   120   BBB   2,000 9 10              計     3,000 11 12            ××会社 13 計の1行上と下は空欄行で、以下、会社名の後にデータが続くというパターンの繰り返しで数十社分あります。 Excelのデータ⇒並べ替えでは複数選択した状態での並べ替えはできないので、VBAで可能であればと思い、質問させていただきました。 よろしくお願いします。

  • Excel2003で重複したデータを削除したい

    Excel2003で重複したデータを削除する方法を教えて下さい。 A・B・C・Dの列の全てが重複するデータを削除したいのですが、可能ですか?AとB列は重複するけど、CやDのデータは重複していなければ、残しておきたいです。 以下イメージです。 行/列  A   B    C    D 1    なす  商店  100円  3/4  2    なす  商店  200円  3/2 3    なす  商店  200円  3/2 ------------------------------------- 以下、重複データ削除後のイメージ。 1    なす  商店  100円  3/4  2    なす  商店  200円  3/2

  • EXCELで約6000行の中から同じ行を削除。

    EXCEL初心者です。 約6000行のデーターの中から同じ名前の行を削除する方法を 教えていただけないでしょうか?   A    B   c   d   e  1  ○ 2  ○ ← 削除  3  ○ ← 削除 4  △ 5  △ ← 削除 よろしくお願いいたします。

  • EXCEL2010 VBAで空白行以外をコピー

    EXCEL2010を使用しています。 シートAではセルA1からA10に順にデータを入力していきます。 A1からA10のすべてにデータを入力する場合やA1からA4のみデータを入力する場合等があります。 このA1からA10のデータをシートBのA1からJ1にコピーしたいと思っています。 空白以外のデータをコピーして、コピー後はシートBのA1:J10で空白の列は削除したいと 思っています。 (例) シートA A1 ○ A2 ○ A3 × A4以降すべて空白 シートB A1 ○ B1 ○ C1 × D1からJ1までは列ごと削除 これをVBAで作成したいのですがどなたか詳しい方押してください。

専門家に質問してみよう