大量のデータが含まれるExcelシートで、ところどころに現れる空白行。見た目も悪いし、集計の邪魔になることもありますよね。一つや二つなら手作業でも良いですが、何十、何百とあると、それだけで時間が溶けてしまいます。
この記事では、そんなイライラを解消する「シート内のすべての空白行を一発で削除する」VBAコードをご紹介します!
これから説明するVBAコードの大まかな動きは、「シートを一番下の行から順番にチェックしていき、もしその行が空っぽだったら削除する」というシンプルなものです。下からチェックしていくのが、実は確実な処理を行うための重要なポイントなんですよ。
Contents
コード
こちらが、空白行を根こそぎ削除する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 IfCountAを使っていた部分を、Cells(i, "B")(i行目のB列)の値が ""(空白)かどうか、というシンプルな条件に変えるだけで、特定の列を基準にした行削除ツールに早変わりします。
応用例2:「削除」と書かれた行をすべて削除する
不要なデータ行に、目印として「削除」と手入力しておき、後で一括削除する、という運用です。
改造ポイント: こちらもIf文の条件を変えるだけ!
' --- A列のセルの値が「削除」かどうかをチェック ---
If targetSheet.Cells(i, "A").Value = "削除" Then
' --- 「削除」と書かれていたら、その行を削除 ---
targetSheet.Rows(i).Delete
End Ifこれで、A列に「削除」と入力された行を自動で見つけ出して消してくれる、便利なクリーニングツールの完成です。
まとめ
いかがでしたか?
単純な繰り返し作業こそ、VBAを使った自動化が最も輝く場面です。ぜひこのコードをあなたの業務に取り入れて、貴重な時間を節約してくださいね!


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