【ExcelVBA】空白行を削除して行を上に詰めるには

この記事では、空白行を削除して行を上に詰める方法についてご説明します。

【動画】空白行を削除して行を上に詰める実際の動き

本題に入る前に、まずは次の動画をご覧ください。

A列からD列のセルが空白の場合はそのセルの行を削除します。

行を削除することで、下の行が1つ上がります。

A列からD列のセルが空白の行が無くなるまで行の削除を繰り返します。

ただし今回はA列からD列のセルが空白を判定して空白なら削除を先頭からではなく、最終行から1行ずつ上に順々に繰り返しています。

マクロ作成の流れ

STEP.1
カウンタの値を最終行の行位置で設定する
カウンタの値を最終行の行位置で設定します。
STEP.2
A列からD列の最終行のセルの値が空白かどうか判定する
A列からD列の最終行のセルの値が空白かどうか判定します。
STEP.3
STEP.2で判定した結果空白の場合は行を削除する
STEP.2で判定した結果空白の場合は行を削除します。
STEP.4
カウンタの値を1つ減らす
カウンタの値を1つ減らします。
STEP.5
STEP.2からSTEP.4を繰り返す
STEP.2からSTEP.4を繰り返します。

Excelファイルの例

今回は次のExcelファイルを用意しました。

このExcelファイルのシートには21行目までデータが入力されていますが、一部の行が空白となっています。

今回のマクロでは、この空白行を削除してデータを上に詰めます。

マクロ実行後は下の通りになります。

コードの例

Option Explicit

Sub test()

    Dim rng     As Range        'Rangeオブジェクト格納用変数
    Dim ws      As Worksheet    'ワークシート用変数
    Dim cnt     As Long         'カウンタ
    
    Const lastRowPos    As Long = 21    '表の最終行
    
    'セル範囲内の行を逆順に処理を繰り返す
    For cnt = lastRowPos To 1 Step -1
    
        If WorksheetFunction.CountA(Worksheets("work").Range("A" & cnt & ":D" & cnt)) = 0 Then
        
            'A列からD列までのセルが空白の場合
        
            '行を削除
            Worksheets("work").Rows(cnt).EntireRow.Delete
            
        End If
        
        DoEvents
        
    Next cnt
    
End Sub

注目すべきコード①

最初に見て頂きたいのは9行目です。

    Const lastRowPos    As Long = 21    '表の最終行

コードの説明

以上のコードは、表の最終行を設定している定数宣言のコードです。

今回のサンプルでは21行目までの表に対して空白行を削除してデータを上に詰めます。

注目すべきコード②

次に見て頂きたいのは12行目です。

    'セル範囲内の行を逆順に処理を繰り返す
    For cnt = lastRowPos To 1 Step -1

コードの説明

以上のコードは、最終行から開始して一つずつ繰り返しマイナスしていくFor文です

今回のサンプルでは最終行から上に、空白行を削除してデータを上に詰めるので、開始は最終行の行数をカウンタに設定し、ループ用のカウンタを1つずつ値をマイナスしていきます。

注目すべきコード③

次に見て頂きたいのは14行目から21行目です。

        If WorksheetFunction.CountA(Worksheets("work").Range("A" & cnt & ":D" & cnt)) = 0 Then
        
            'A列からD列までのセルが空白の場合
        
            '行を削除
            Worksheets("work").Rows(cnt).EntireRow.Delete
            
        End If

コードの説明

以上のコードは、A列からD列までのセルが空白か判定し、空白の場合はその行を削除する処理のコードです。

コードの詳細

14行目のコードは、A列からD列までセルの値が空白かどうかを判定するIF文です。

セルの値が空白かどうかは「WorksheetFunction.CountA」メソッドを使います。

引数にはセルを指定し、空白の場合は0を返します。

「WorksheetFunction.CountA」メソッドが0を返す場合は、19行目で行を削除します。

EntireRow.Deleteメソッドは、指定した範囲を含む行全体を削除します。

削除する範囲はRows(cnt)で指定します。

cntの値が10なら10行目であることを指し、EntireRow.Deleteメソッドを実行することで10行目を削除します。

動作確認

【ケース①】A列からD列までのセルがすべて空白の行がある場合

マクロ実行前

  1. 行:21行目までデータが入力されている
  2. 列:A列からD列まで
  3. A列からD列までのセルがすべて空白の行がいくつかある

マクロ実行後

A列からD列までのセルが空白の行が削除されました。

【ケース②】A列からD列までのセルがすべて空白の行がある場合

マクロ実行前

  1. 行:21行目までデータが入力されている
  2. 列:A列からD列まで
  3. A列、B列、C列、D列のいずれか、またはA列からD列までのセルがすべて空白の行がいくつかある

マクロ実行後

A列からD列までのセルが空白の行が削除されました。

最後に

この記事では、空白行を削除して行を上に詰める方法についてご説明しました。

フィルターの機能を使って空白行を非表示にする方法がありますが、非表示ではなく空白行を削除したい場合は参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら