空白行を一行ずつ消すのはもう終わり!一瞬で削除する【コピペVBA】

icocho

この空白行、一つひとつ右クリックで削除するの、地味に面倒…

大量のデータが含まれるExcelシートで、ところどころに現れる空白行。見た目も悪いし、集計の邪魔になることもありますよね。一つや二つなら手作業でも良いですが、何十、何百とあると、それだけで時間が溶けてしまいます。

この記事では、そんなイライラを解消する「シート内のすべての空白行を一発で削除する」VBAコードをご紹介します!

これから説明するVBAコードの大まかな動きは、「シートを一番下の行から順番にチェックしていき、もしその行が空っぽだったら削除する」というシンプルなものです。下からチェックしていくのが、実は確実な処理を行うための重要なポイントなんですよ。

コード

こちらが、空白行を根こそぎ削除するVBAコードです。

Sub DeleteBlankRows()
    ' --- 変数の宣言 ---
    Dim i As Long
    Dim lastRow As Long
    Dim targetSheet As Worksheet

    ' --- 初期設定:処理対象のシートを指定 ---
    ' ActiveSheetは現在開いているシートを指します。
    ' 特定のシートにしたい場合は Sheets("シート名") に変更してください。
    Set targetSheet = ActiveSheet

    ' --- 念のため、本当に処理して良いかユーザーに確認 ---
    If MsgBox("アクティブシートの空白行を削除します。よろしいですか?" & vbCrLf & "(この操作は元に戻せません)", vbOKCancel + vbExclamation) <> vbOK Then
        Exit Sub ' キャンセルが押されたら処理を中断
    End If

    ' --- 処理中の画面更新を停止(高速化のため) ---
    Application.ScreenUpdating = False

    ' --- データ範囲の最終行を取得 ---
    lastRow = targetSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

    ' --- 最終行から1行目に向かって、下から上にループ ---
    For i = lastRow To 1 Step -1
        ' --- 行全体にデータが1つも無いか(セルの数を数えて0個か)をチェック ---
        If WorksheetFunction.CountA(targetSheet.Rows(i)) = 0 Then
            ' --- 空白と判断したら、その行を削除 ---
            targetSheet.Rows(i).Delete
        End If
    Next i

    ' --- 画面更新を再開 ---
    Application.ScreenUpdating = True

    ' --- 完了メッセージ ---
    MsgBox "空白行の削除が完了しました!"
End Sub

コードの説明

このコードの3つのポイントを解説します。

For i = lastRow To 1 Step -1

これが、このコードの最大のキモです!
Forループは通常、1 To lastRow のように上から下へ処理しますが、ここでは Step -1 をつけることで、下から上へと逆順に処理しています。

なぜ逆順?: もし上から順番に処理すると、行を削除した際に行番号が上に詰まってしまい、次にチェックすべき行を飛ばしてしまう不具合が起こります。例えば、5行目を削除すると、元の6行目が新しい5行目になりますが、プログラムは次に6行目(元の7行目)を見に行ってしまうのです。下から処理すれば、この問題は起こりません。

If WorksheetFunction.CountA(targetSheet.Rows(i)) = 0 Then

WorksheetFunction.CountA(...) は、指定した範囲に含まれる「空白ではないセル」の個数を数える関数です。つまり、CountAの結果が0ということは、その行にはデータが一つも入っていない、完全な空白行である、ということを意味します。特定のセルだけを見て判断するよりも、確実な方法です。

targetSheet.Rows(i).Delete

文字通り、指定した行(i行目)を削除(Delete)する命令です。シンプルですが、強力な命令なので、間違った行を消さないように条件設定が重要になります。

このコードを改造してみよう!

この「下からループして行を削除する」という基本構造は、様々な応用が可能です。

応用例1:特定の列が空白の行を削除する

名簿データで、例えば「B列のメールアドレスが空欄の行」をすべて削除したい、というケースです。

改造ポイント: If文の条件を変えるだけ!

' --- B列のセルが空白かどうかをチェック ---
If targetSheet.Cells(i, "B").Value = "" Then
    ' --- 空白だったら、その行を削除 ---
    targetSheet.Rows(i).Delete
End If

CountAを使っていた部分を、Cells(i, "B")(i行目のB列)の値が ""(空白)かどうか、というシンプルな条件に変えるだけで、特定の列を基準にした行削除ツールに早変わりします。

応用例2:「削除」と書かれた行をすべて削除する

不要なデータ行に、目印として「削除」と手入力しておき、後で一括削除する、という運用です。

改造ポイント: こちらもIf文の条件を変えるだけ!

' --- A列のセルの値が「削除」かどうかをチェック ---
If targetSheet.Cells(i, "A").Value = "削除" Then
    ' --- 「削除」と書かれていたら、その行を削除 ---
    targetSheet.Rows(i).Delete
End If

これで、A列に「削除」と入力された行を自動で見つけ出して消してくれる、便利なクリーニングツールの完成です。

まとめ

いかがでしたか?
単純な繰り返し作業こそ、VBAを使った自動化が最も輝く場面です。ぜひこのコードをあなたの業務に取り入れて、貴重な時間を節約してくださいね!