Excel VBAで複数行一括削除の方法

このQ&Aのポイント
  • Excel VBAで複数行一括削除の方法をご教授いただきたいです。
  • 元となるデータは15行が一塊で構成されており、14行目には"END"の文字があり、15行目には必ず空白行があります。
  • データブロック一行目E列に含まれる特定の語句(IDNo.)を検索し、これを起点として空白行までの15行一塊のデータブロックをまとめて削除できるものを作成したいです。
回答を見る
  • ベストアンサー

Excel VBA 起点からの複数行一括削除

Excel VBAで末端までだと4万行くらいのデータを整理するものを組んで います。初心者ゆえどなたかお詳しい方の知恵を拝借いたしたく。 元となるデータは15行が一塊であるデータブロックで構成されており、 14行目には"END"の文字があり、15行目には必ず空白行があります。 この15行のデータブロックが延々4万行繰り返しの形で存在しています。 どのデータブロックか判別できる数字が入っているのは1行目のE列 です。 データブロック一行目E列に含まれる特定の語句(IDNo.)を検索し、これを 起点として空白行までの15行一塊のデータブロックをまとめて削除でき るものを作成しようと思ったのですが、一行ずつ削除するところまでしか 自力では分からず、これ以降どのように追記すれば良いか見当がつか ない状態です。よろしくお願いします。 元データ     A    B   C    D    E     F   G 1   aaa   bbb  ccc  ddd   (IDNo.)  fff  ggg 2   111  222  333  444   555   666  777 (略) 14 END 15 (空白行) 16  AAA  BBB  CCC DDD  (IDNo.) FFF GGG (略) 29 END 30 (空白行) 以下 検索したもの+自分で追記してみた部分です。 Sub 特定ID削除() With ActiveWorkbook.ActiveSheet Const startrow As String = "1" '開始行を指定 Const col As String = "E" '識別文字が入力されている列 Dim Idx As Long Dim keyWord keyWord = Application.InputBox("削除対象の文字列を指定", Type:=2) If TypeName(keyWord) <> "Boolean" And Len(keyWord) > 0 Then For Idx = .Cells(65536, col).End(xlUp).Row To startrow Step -1 If InStr(.Cells(Idx, col).Value, keyWord) > 0 Then ' If Application.CountIf(Rows(Idx), "*" & keyWord & "*") > 0 Then .Rows(Idx).Delete End If Next Idx End If End With End Sub

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

  • ベストアンサー
  • heno-_-
  • ベストアンサー率100% (6/6)
回答No.3

再三すみません。 1点勘違いしておりましたので、修正させてください。 > 3.TypeName(keyWord) <> "Boolean" And Len(keyWord) > 0 > 空白の入力や、キャンセルボタンが押された場合を除く分岐だと思いますが、 > シンプルに、戻り値が空白か否か判断すれば大丈夫です。 と書きましたが、キャンセルボタンが押された場合の処理を 除外するのを忘れておりました。 ご質問者様の書き方でも大丈夫ですし、 keyWord <> "" And keyWord <> "False" のように書いてもOKです。 大変失礼致しました。 -------------------------------------------------- Sub 特定ID削除() Const blockNum As Integer = 15 ' 1ブロックの行数 Const col As String = "E" ' 識別文字が入力されている列 Const startRow As Long = 1 ' 開始行 Dim endRow As Long ' 終了行 Dim Idx As Long Dim keyWord ' 最終データブロックの先頭行を取得 endRow = Cells.SpecialCells(xlLastCell).Row - blockNum + 2 ' 削除対象文字列を取得 keyWord = Application.InputBox("削除対象の文字列を指定", Type:=2) ' 検索&削除処理 If keyWord <> "" And keyWord <> "False" Then For Idx = endRow To startRow Step -blockNum If InStr(Cells(Idx, col).Value, keyWord) > 0 Then Range(Idx & ":" & Idx + blockNum - 1).Delete Exit For '削除するブロックが1つだけの場合 End If Next Idx End If End Sub --------------------------------------------------

AKI2480
質問者

お礼

一日悩んだ結果が一瞬で解決、思った通りの動作となり感動しました。 Excellentです! 色々やり方があるものですね、大変参考になりました。 このVBAだけでなく、仕事でもScriptを組めるようになる必要があり、 書籍等で色々調べたのですが、ばっちりこれ!といったコードがある わけなく、途方にくれていました。自分でひとしきり悩んだ後、詳しい 方にかくも丁寧に回答頂いたため、素直に理解できました。 何度も丁寧に解説頂き、本当にありがとうございました。

その他の回答 (2)

  • heno-_-
  • ベストアンサー率100% (6/6)
回答No.2

No.1の者です。 気になったので、少し改良してみました。 -------------------------------------------------- Sub 特定ID削除() Const blockNum As Integer = 15 ' 1ブロックの行数 Const col As String = "E" ' 識別文字が入力されている列 Const startRow As Long = 1 ' 開始行 Dim endRow As Long ' 終了行 Dim Idx As Long Dim keyWord ' 最終データブロックの先頭行を取得 endRow = Cells.SpecialCells(xlLastCell).Row - blockNum + 2 ' 削除対象文字列を取得 keyWord = Application.InputBox("削除対象の文字列を指定", Type:=2) ' 検索&削除処理 If keyWord <> "" Then For Idx = endRow To startRow Step -blockNum If InStr(Cells(Idx, col).Value, keyWord) > 0 Then Range(Idx & ":" & Idx + blockNum - 1).Delete Exit For '削除するブロックが1つだけの場合 End If Next Idx End If End Sub --------------------------------------------------

  • heno-_-
  • ベストアンサー率100% (6/6)
回答No.1

Excel VBA初心者とのことですが、とても良くできていると思います。 色々調べながら頑張っておられるのでしょうね(*^_^*)。 肝心の、複数行の削除ですが、  Range(Idx & ":" & Idx + 14).Delete の処理で問題ないかと思います。 Range関数は複数のセル・行・列を操作するのによく使いますので、 覚えておくと便利ですよ。 尚、蛇足ですが、いくつか気になった点がありましたので、書いておきます。 1.With ActiveWorkbook.ActiveSheet アクティブなワークシートはWithステートメントを使わずとも、 Cells(***)のようにダイレクトに参照できます。 2.startrow変数 数値ですので、Long(Integer)型にしましょう。 また、変数名も単語で区切って「 startRow 」とすると分かり易いです。 3.TypeName(keyWord) <> "Boolean" And Len(keyWord) > 0 空白の入力や、キャンセルボタンが押された場合を除く分岐だと思いますが、 シンプルに、戻り値が空白か否か判断すれば大丈夫です。 4.65536 いきなり謎の数値が出てくると、プログラムが分かり辛いので、 startRowと同様に、これも定数として宣言しておくと良いです。 ファイルによって最終行が変わるなら、自動で取得する方法もあります。 5.Step -1 15行毎に固定で、特定の語句(IDNo.)が現れるなら、 一気に15行ずつ飛ばして検索した方が効率的です。 6.処理の停止 もし、削除するブロックが必ず1つだけでしたら、 削除処理が終わった後に、Exit Forでループを抜けましょう。 ( 複数ある場合は、最後まで検索が必要なので不要です ) まとめると、以下のようになります。 -------------------------------------------------- Sub 特定ID削除() Const col As String = "E" ' 識別文字が入力されている列 Const startRow As Long = 1 ' 開始行 Dim endRow As Long ' 終了行 Dim Idx As Long Dim keyWord ' 最終データブロックの先頭行を取得 endRow = ActiveSheet.Cells.SpecialCells(xlLastCell).Row - 13 ' 削除対象文字列を取得 keyWord = Application.InputBox("削除対象の文字列を指定", Type:=2) ' 検索&削除処理 If keyWord <> "" Then For Idx = endRow To startRow Step -15 If InStr(Cells(Idx, col).Value, keyWord) > 0 Then Range(Idx & ":" & Idx + 14).Delete Exit For '削除するブロックが1つだけの場合 End If Next Idx End If End Sub -------------------------------------------------- 参考になりましたら、幸いです。

関連するQ&A

  • 指定した文字列が含まれる行を削除する

    データの照合をしています。 指定した文字列が、「O列」に入っていたら、その行を削除し、 行をつめる というようなマクロを組みたいのですが、エラーがかかってしまいます。 (下のVBは、ネットで公開されていたのを使用させていただいております。) Sub Macro1() Const col As String = "A" '文字列が入力されている列 Dim idx As Long Dim keyWord keyWord = Application.InputBox("削除対象の文字列は?", Type:=2) If TypeName(keyWord) <> "Boolean" And Len(keyWord) > 0 Then   For idx = Cells(65536, col).End(xlUp).Row To 1 Step -1     If InStr(Cells(idx, col).Value, keyWord) > 0 Then '    If Application.CountIf(Rows(idx), "*" & keyWord & "*") > 0 Then       Rows(idx).Delete     End If   Next idx End If End Sub 「下から3行目のNEXTに対応するforがない」とエラーがでます。 ご教授、お願いいたします。

  • エクセルマクロ 特定の文字列を含む行のみを残す (マクロ修正)

    以下のマクロは、EXCEL2003で 「特定の文字列が含まれている列を削除する」動作をするマクロです Sub Macro1() Const col As String = "A" '文字列が入力されている列 Dim idx As Long Dim keyWord keyWord = Application.InputBox("削除対象の文字列は?", Type:=2) If TypeName(keyWord) <> "Boolean" And Len(keyWord) > 0 Then   For idx = Cells(65536, col).End(xlUp).Row To 1 Step -1     If InStr(Cells(idx, col).Value, keyWord) > 0 Then '    If Application.CountIf(Rows(idx), "*" & keyWord & "*") > 0 Then       Rows(idx).Delete     End If   Next idx End If End Sub このマクロを、 「特定の文字列が含まれている行のみを残し、それ以外を削除する」 というマクロに変更したいと思っています。 是非ご回答お願いいたします。

  • エクセル2010 VBA 行削除

    特定列が空白であれば行削除をしたいのですが、下記コードでうまく削除は出来るのですが、応答なしになったり、とても遅いのですが、もう少し早く処理出来る方法はありますか? E列が空白であれば行削除をしたいのですが・・ With Range("E13", Cells(Rows.Count, 5).End(xlUp)) .AutoFilter Field:=1, Criteria1:="" On Error Resume Next Set rng = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible) If Err.Number = 0 Then rng.EntireRow.Delete On Error GoTo 0 .AutoFilter End With

  • エクセル VBA Rowsプロパティ?

    エクセル VBAにて ある列の空白セルを調べて空白があった場合 行全体を選択して削除したいため、下記のように書き込みました。 Dim idx As Integer For idx = 5 To 2204 If ActiveSheet.Cells(idx, 2) = "" Then Rows("idx:idx").Select Selection.Delete Shift:=xlUp End If Next idx Rows("idx:idx").Selectが間違っていると思うのですが 変数を使用しての行指定がわかりません。 どなたかご教示お願いいたします。

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

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

  • エクセルVBAで表から行の削除

    添付画像のような表があります。 表はB列の名前でソートされています。 D列の比率をみて、100でないものは、必ず同じ名前で複数行にわかれ合計で100になります。この例では名前CとEとHがそうです。 同じ名前が複数行にわかれている場合、最大の比率の行を残し、他の行(例では、埼玉、栃木、長野、新潟の行)を削除したいのです。 複数行にわかれるのが名前CやEのように2行なら、以下のコードで出来ました。 しかし、めったにはありませんが名前Hのような3行以上に分かれるものには対応できません。 どうすればよいでしょうか? Sub test01()   Dim c As Range   Dim Rng As Range   Set Rng = Range(Cells(2, "D"), Cells(Rows.Count, "D").End(xlUp))   For Each c In Rng '2地区の分担の場合、分担比率高い方を残す。(3地区以上は未対応)2012/08/29     If c.Value <> 100 And c.Offset(1).Value <> 100 Then       If c.Offset(, -2).Value = c.Offset(1, -2).Value Then         If c.Value >= c.Offset(1).Value Then           c.Offset(1).Value = False         Else           c.Value = False         End If       End If     End If   Next   If Application.WorksheetFunction.CountIf(Rng, False) > 0 Then     Rng.SpecialCells(xlCellTypeConstants, xlLogical).EntireRow.Delete   End If End Sub

  • 空白行削除

    宜しくお願いします。 1枚のファイルシートに14ブロックのデータが貼り付けてあります。各ブロック行の長さは違く、ランダムに貼り付けてあります。例えば、データ 何百行の空白 データ…と繰り返されており、約3万5千行ぐらいあります。 空白行削除で多分半分近くまで上に詰められれば良いのですが、たくさんあるのでマクロで教えていただければと思います。ネットでころがってるデータ試してみたのですが(1部) ENDLESSに実行されて、出来てるのかどうかも確認はとれてません。ちなみに自分のシートに貼ってあるデータはA列からAS列まであり数字、文字混在です。また各ブロックの終わりは集計行となっており、空白セルがまじってます。宜しくお願いします。

  • VBAで行の削除

    お世話になります。 下記の様に行を削除しようとしていますが、 行を削除していくと、1行ずつずれていく為、 結果全部削除されません。 どのようにしたらうまく(空白のセルの行のみ) 削除出来ますでしょうか。 ご教示頂きたく宜しくお願い致します。          記 For k = 2 To r If Sheets("sheet1").Cells(k, 9) = "" Then Rows(k).Select Selection.Delete Shift:=xlUp End If Next k

  • Excel 改ページのマクロ

    同シート内で改ページを設定するマクロを、ここで教えてもらったのですが、改ページを判断するデータの列が関数(vlookup)で持ってきたデータの場合にうまく機能しません。下のマクロに手を加えれば可能でしょうか? Sub Macro4() Const col As String = "A" '改ページを判断するデータの列名 Dim idx As Long Dim sv sv = Cells(1, col).Value For idx = 1 To Cells(65536, col).End(xlUp).Row   If Cells(idx, col).Value <> sv Then     ActiveSheet.HPageBreaks.Add Before:=Rows(idx)     sv = Cells(idx, col).Value   End If Next idx End Sub

  • VBAの行削除について

    VBAで行を削除したいです。 データが何百行かあって、その下から空白行が最終行までできています。 その空白行部分を削除したいのですが。 どのようにコーディングすればいいのですか?