VBAで行削除をする方法|基本コードと失敗しないポイント

この記事はアフィリエイト広告を利用しています。
VBAで行削除をする方法

ようこそ♪ささぽんのExcel教室へ。

Excelをマクロで操作していると、「いらない行を削除したい!」と思ったことはありませんか?

手作業では簡単でも、VBAで書こうとすると意外とつまずきやすいのが「行削除」です。

今回は、VBAで行を削除する方法を基本から分かりやすくまとめました!

やりがちな失敗例も交えて紹介するので、確認してみてくださいね。

ささぽん

この記事は以下のような方におすすめです!
・行削除のコードの書き方が分からない方
・複数の行をまとめて削除するコードを書きたい方

・VBA繰り返し処理の中で行削除をしたい方

このブログは「基礎からExcelマクロを学びたいと考えている方」や、
「独学での習得に壁を感じた方」に向けて、やさしく、わかりやすく、丁寧に解説しています。

読み終わるころにはきっと、
Excelマクロって意外と簡単かも!」「もっとやってみたい!」と思えるはず。

一緒に楽しく学びながら、Excelマクロ使いを目指しましょう!

目次

1.マクロ記録で行削除のコードを確認しよう

■マクロ記録を使うメリット

■︎実際に行削除の操作を記録しよう

■記録されたコードを読んでみよう

2.行削除コードの書き方2選

■Rows.Deleteでの書き方

■Range.EntireRow.Deleteでの書き方

3.【実践】空白行だけを削除する

■WorksheetFunction.CountAで空白行を判定する

■【実践】空白行だけを削除する

4.行削除ループがうまくいかない理由と解決策

■ループ処理で行が残る?失敗する原因

■下からのループ処理で確実に削除

5.まとめ:行削除マクロの書き方おさらい

■行削除マクロの基本をおさらい!

■︎実務で役立つ応用と注意点

1.マクロ記録で行削除のコードを確認しよう

行削除をVBAで書く前に、まずはマクロ記録で動きを確認してみましょう!
記録されたコードを読むことで、自分でコードを書くときの参考になります。

マクロ記録について具体的に確認したい方は、以下の記事も併せてご覧ください。

■マクロ記録を使うメリット

マクロを使って行削除を自動化したいと思っても、「いきなりコードを書くのは難しそう…」と感じる方も多いのではないでしょうか。
そんなときに心強い味方になるのが、Excelに標準で備わっている「マクロの記録」機能 です!

この機能を使えば、実際の操作をそのまま録画してくれるので、「どんな命令が必要なのか」が一目でわかります。

特に行削除は、シンプルに見えても裏では行番号の指定削除後の動きなど、意外と注意すべきポイントがあります。

マクロ記録を通して一度動きを確認しておくと、後で自分でコードを書くときに「何を省略できるか」や「どこを変えれば応用できるか」が理解しやすくなります。

まずは、記録されたコードを読んで、基本の流れをつかんでみましょう!

■実際に行削除の操作を記録しよう

マクロ記録の便利さが分かったところで、実際に試してみましょう!
ここでは、不要な行を1行だけ削除する操作の記録方法を説明します。

  1. マクロの記録を開始する
    「開発」タブの「マクロの記録」をクリック。
  2. 削除したい行を選ぶ
    3行目を削除するなら、行番号「3」をクリックして選択。
  3. 行を削除する
    選んだ行の上で右クリック → 「削除」を選択。
  4. マクロの記録を停止する
    もう一度「マクロの記録」をクリックして終了。
  5. 記録されたコードを確認する
    「開発」タブの「Visual Basic Editor(VBE)を開き、モジュールを見てみましょう!
    操作がそのままVBAコードとして保存されています。

次は、記録されたコードを一緒に読み解いてみましょう!

■記録されたコードを読んでみよう

マクロ記録で操作を保存したら、次は実際にどんなコードが作られたのかを確認してみましょう!

Visual Basic Editor(VBE)を開いて「モジュール」を選ぶと、先ほどの操作がVBAコードとして残っています。

例えば、3行目を削除した場合はこのように記録されます:

Rows("3:3").Select
Selection.Delete Shift:=xlUp

1行目の Rows(“3:3”).Select は「3行目を選択する」という意味です。

2行目の Selection.Delete Shift:=xlUp は「選んだ行を削除して、下の行を繰り上げる」という動きを表しています。

このように、マクロ記録を使うと「自分がどの操作をしたのか」がそのままコードで確認できます

ただし、記録されたままのコードには Select や Selection等の必要ない操作が含まれているので、後で自分で書くときには省いてスッキリさせるのがポイントです。

次の章では、この記録コードを元にもっとシンプルに書けるようにしていきましょう!

2.行削除コードの書き方2選

マクロ記録で動きを確認したら、次は自分でシンプルに行削除のコードを書いてみましょう。

ここでは、代表的な2つの方法を紹介します!

■Rows.Deleteでの書き方

行削除を一番シンプルに書く方法が Rows.Delete です。

マクロ記録で作られるコードには「Select」や「Selection」が含まれていましたが、本来は必要ありません。

例えば、3行目を削除する場合には:

Rows(3).Delete

複数行をまとめて削除する場合には:

Rows("3:5").Delete

このように Rows.Delete を使えば、1行のみのシンプルなコードで処理することができます。

どの行でも同じ形で使えるので、行削除の基本形としてしっかり覚えておきましょう!

■Range.EntireRow.Deleteでの書き方

Rows.Delete 以外にもRange.EntireRow.Delete という方法があります!

これは「セルを基準に、そのセルが含まれる行をまるごと削除する」という使い方をします。

例えば、セル「A3」が含まれる行を削除したい場合:

Range("A3").EntireRow.Delete

この書き方は、特定のセルを条件にして行を削除したいときにとても便利です。

例えば、A3セルが「削除」となっている場合のみ行削除を実行したい場合:

If Range("A3").Value = "削除" Then
    Range("A3").EntireRow.Delete
End If

このコードでは、まずA3の値をチェックして、「削除」という文字が入っていたら、そのセルが含まれる行(=3行目)をまるごと削除しています。

このように、Rows.Delete は行番号で指定して削除するときに、Range.EntireRow.Delete は条件に合ったセルの行を消すときにとても便利です!

シンプルな操作から、少し条件を加えたいときまで、状況に合わせて使い分けてみてください。

3.【実践】空白行だけを削除する

行削除の基本形をマスターしたら、次は「条件付き」での行削除にチャレンジしてみましょう!

今回は業務でもよく使う、空白行だけを削除するコードの書き方を紹介します。

■WorksheetFunction.CountAで空白行を判定する

空白行だけを削除するために、まずは空白行の判定方法を押さえましょう。

空白行の判定に便利なのが、Excel関数としてもおなじみの 「COUNTA」です!

COUNTA は、指定した範囲に値がいくつ入っているかを数える関数で、VBAでは「WorksheetFunction.CountA」と書くことで呼び出すことができます。

つまり範囲として行を選択した状態で、CountAの結果が「0」だった場合には、その行の中で値の入っているセルが0という意味になり、空白行であることが分かります。

この仕組みを活用して、2行目が空白だったら削除するコードを書いてみましょう:

If WorksheetFunction.CountA(Rows(2)) = 0 Then
    Rows(2).Delete
End If

このコードでは、Rows(2) で2行目を範囲指定し、CountAで値が入っているセルの数をチェックしています。

結果が0であれば、その行を Rows.Deleteで削除するだけです!

■空白行の削除処理を繰り返す

空白行を1行だけ削除する方法を理解したので、次は同じ処理を繰り返し空白行をまとめて削除する処理を見ていきましょう!

先ほど紹介した WorksheetFunction.CountA をそのまま活かし、ループで自動化します。

例えば:

Dim i As Long
For i = 10 To 1 Step -1
    If WorksheetFunction.CountA(Rows(i)) = 0 Then
        Rows(i).Delete
    End If
Next i

この例では、10行目から1行目までを順にチェックしています。

その過程でもし空白の行を見つけたら、削除を実行する仕組みです。

ただし、繰り返し処理の中での行削除は行がずれて思いがけぬ結果になってしまうことがあるため、注意が必要です。

詳しくは次の章で見ていきましょう!

4.行削除ループがうまくいかない理由と解決策

空白行などを繰り返し削除するマクロを作ったのに、「なぜか全部削除されない…」と困った経験はありませんか?

この章では、行削除ループがうまく動かない原因と、その解決法をお伝えします。

■ループ処理で行が残る?失敗する原因

行削除のマクロを作った人がよくつまずくのが、「ループで削除しているのに、途中の行がなぜか残ってしまう」という現象です。

これ、実は削除処理で行番号がずれてしまうのが原因です!

例えば、1〜4行目のうち空白行を削除するマクロを考えてみましょう:

Dim i As Long

For i = 1 To 4
    If WorksheetFunction.CountA(Rows(i)) = 0 Then
        Rows(i).Delete
    End If
Next i

このマクロを、2・3行目が空白の状態で実行した場合の処理をご説明します。

2・3行目が空白
2・3行目が空白の状態で実行
  1. 2行目・3行目が空白の状態で実行
    (=2・3行目が削除され、1・4行目が残る想定)
  2. 1行目から順にチェックし、最初に2行目が空白行として削除される
  3. 2.で2行目が削除されたことで、元々3行目だった行が2行目に繰り上がる
  4. マクロのループ処理は2行目の処理を終えたので3行目に進み、繰り上がった行は処理せずスキップされる
2行目に空白行が残っている
実行結果

このように、上から順番に削除すると処理されず飛ばされる行が発生してしまうため、条件に一致している行が残ってしまう原因になります。

■下からのループ処理で確実に削除

行削除を繰り返すときに失敗しない方法が、下から順番に処理する「逆ループ」です!

逆ループにすると、削除しても下の行が繰り上がらないので、飛ばしミスが起こりません。

先ほどと同じく、1〜4行目のうち空白行を削除するマクロを考えてみましょう:

Dim i As Long

For i = 4 To 1 Step -1
    If WorksheetFunction.CountA(Rows(i)) = 0 Then
        Rows(i).Delete
    End If
Next i

ポイントは「 For i = 4 To 1 Step -1」の部分です。

4行目から1行目に向かって処理をしているので、途中で行削除の処理をしても処理行がズレる心配はありません。

行削除をループ処理で書くときには、必ず下から上方向へのループで書くようにしましょう!

5.まとめ:行削除マクロの書き方おさらい

ここまでで、行削除マクロの基本から条件付き、繰り返し処理の注意点までを一歩ずつ学んできました。

最後にポイントを振り返って、行削除処理をマスターしましょう!

■︎行削除マクロの基本をおさらい!

まず、行削除の基本形2つを振り返りましょう。

方法特徴
Rows.Delete行番号を直接指定して削除する
Range.EntireRow.Deleteセルを基準に、そのセルが含まれる行を丸ごと削除する

Rows.Delete は削除する行を行番号で指定する際に、Range.EntireRow.Deleteは条件に合った行を消す際に便利な書き方です。

この2つの方法をベースに、条件付き処理やループ処理を書くことができます。

条件付き処理では、空白行を削除する例を使って説明しました。

他にも色々な条件を使って処理することができるので、実際の業務に合わせてアレンジしてみてください!

ループ処理では、上から順に削除すると行番号がずれてしまい、意図した行が残ってしまうことがありましたね。

これを防ぐためには、下から上に向かって逆順で処理するのがポイントです。

■実務で役立つ応用と注意点

行削除マクロの基本を押さえたら、次は少しずつ自分の業務に合わせて応用してみましょう。

例えば条件を指定しての処理では空白行だけでなく、色々な場面に活用できます
特定の文字が含まれている行や、日付が古いデータの行など、実際の業務に合わせて書き換えてみてください!

ループ処理については、行削除の場合と同じく列削除の処理をする場合にも注意が必要です。

行削除を上から順にしてしまうと削除されず残ってしまう行があるように、列削除を左から順にしてしまうと列が残ってしまう可能性があります。

そのため列削除の場合には、右から左へ逆順で処理するように書くようにしましょう。

まずは簡単な処理から、実務に当てはめて使ってみてください!

\ Excelマクロ制作も承っています /

各種クラウドソーシングサイトにて業務効率化ツールの作成・カスタマイズを承っております。
ご相談・お見積もりは無料ですので、まずはお気軽にご覧ください!

見積もり無料!超効率化!Excelマクロ開発します ルーティンワークの煩わしさに悩んでいる方へ