VBAで空白行を削除する方法|Excel VBA 高速技

2018/02/03


Excelをデータベースとして活用していると、メンテナンスとして「不要な行の削除」というのは当然ながら必要になってきます。

今回はタイトルのとおり、VBAを使って不要な行、とりわけ 空白行の削除方法 をピックアップします。
わたしが推奨するのは、Unionメソッド を使用して空白行を高速で一括削除する方法です。

自分の中ではこれがベストな手法なのでぜひ参考にしてください。

空白行を一括で削除する

今回サンプルとして用意したのは下のような表です。

▲空白行はわかりやすく黄色にしました

サンプルの前提として;
・A列には通し番号が振られているので空白は存在しません。
・B列が空白の場合を「空白行」「不要行」として認識させます。


Unionメソッド

ひとくちに「空白行を削除する」といってもやり方はいろいろあります。

一行ずつ検索して削除していく方法もあるのですが、その手法では何万件というデータを相手にすると処理に時間がかかるのが短所です。

例えば、上の表の 空白行を削除する場合

Sub Macro1( )
  Range ("4:4, 7:7, 8:8, 11:11") .Select
  Selection.Delete Shift:=xlUp
End Sub

このように、空白行が事前に判っていれば、対象の行を Rangeオブジェクトに書き込むこともできなくはないのですが、空白行を「検索して削除」する場合は使えません。

また、Rangeオブジェクト内に書き込めるセルのアドレスも 255文字(バイト)までしか書き込めません。
さらに処理時間もかかります。

Unionメソッドとは

そんなときに便利なのが Unionメソッド です。
Applicationオブジェクトの Unionメソッド は、引数で指定した連続しない複数セルの集合を返してくれます。

かんたんに述べると、情報をたくさん格納できる Rangeオブジェクトみたいなものです。(感覚的に)
では、下のサンプルコードを見てみましょう。


使用例

コピペで使えるサンプルコード

百聞は一見にしかずですから、実際のコードを見てみましょう。

Option Explicit


'*********************************************************
' 空白行の一括削除  Delete_Rows_w_Blank
'*********************************************************
Sub Delete_Rows_w_Blank
  Dim GYO As Long
  Dim KuhakuGyo As Range
  Dim r As Long

   ' A列をみて表の最終行を取得する ------ ※1
  GYO = Cells (Rows.Count, 1).End (xlUp).Row
  '2行目から最終行までB列のセルをチェックします
  With ActiveSheet
    For r = 2 To GYO
    'B列のセルが空白なら変数 KuhakuGyo に追加
    If IsEmpty(Cells(r, 2).Value) Then
      '最初の空白行に出会ったら行全体を KuhakuGyo にセット
      If KuhakuGyo Is Nothing Then
        Set KuhakuGyo = .Rows(r).EntireRow
      '2件目からは順次 KuhakuGyo に追加していく
      Else
        Set KuhakuGyo = Union(KuhakuGyo, .Rows(r).EntireRow)
      End If
    End If
    Next r
  End With

  '空白行があれば一括で削除する
  If Not KuhakuGyo Is Nothing Then
    KuhakuGyo.Delete
  End If
End Sub
'-----------------<< End of Source >>------------------



サンプルコード解説

上のサンプルは、Unionメソッド を使い、検索して空白行として認識された行番号を KuhakuGyo という変数にどんどん追加していきます。

そして最後の最後に KuhakuGyo に格納された行を一括で削除する、というものです。
これを実行すると、トップ画のように;


と、一瞬で空白行が削除されます。
A列には ROW関数 を仕込んでおくと、行が削除された後も通し番号がくずれません。
(今回は削除された行をわかりやすくするために、ROW関数 は仕込んでいません)

ちなみに、※1最終行を取得する方法 については過去記事で詳しく触れています。

↓↓↓ h1r0-style.net でも人気の記事です。
VBAで最終行を取得する方法と そこからできること|Excel VBA
VBA・最終行
VBAで最終行を取得する方法を解説。最終行の行番号を取得できることにより最終行の削除や、最終行までセルを選択したり繰り返したり色々なことが可能になります。

以上で、VBAで空白行を削除する方法についての解説は終了です。
業務効率化に役立ててください。

関連記事



併せて読んでおくとさらに便利

エクセルの重複データに色を付ける|「ダブり」チェック
条件付き書式・COUNTIF関数
エクセルで重複するデータに色を付ける方法を解説します。Excelでダブりチェックをする方法はいくつかありますが簡単に設定できるのでぜひ挑戦してみましょう。

VBA カレントフォルダの取得と設定・変更|Excel VBA
VBA・CurDir関数
VBAで カレントフォルダ名 を取得したり、設定(指定)したり変更(移動)したりする方法について解説します。CurDir関数 や ChDirステートメント などの使い方についても触れています。

VBAでシート数を取得する方法と そこからできること|Excel VBA
VBA・Countプロパティ
VBAでシート数を取得する方法の解説。VBAを使って各シートに同じ作業をさせる場合は流動的に変化するシート数を取得しておく必要があります。Countプロパティを使って...

VBA [ファイルを開く] ダイアログボックスを表示させる|EXCEL VBA
VBA・ダイアログボックス
VBAで [ファイルを開く] ダイアログ ボックスを表示させ、選択したファイル名をテキストボックスに表示させるまでを解説。GetOpenFilenameメソッドを、使用例もサンプルコードを公開しています。

VBA「フォルダ選択」ダイアログを表示させる|Excel VBA
VBA・ダイアログボックス
VBAを使い、ファイルではなく「フォルダ選択」をさせる ダイアログボックス を表示させ、ユーザーが選択した フォルダ名 を含むPathを テキストボックスに表示させる方法について解説。

VBA フォルダ内のファイル名一覧の取得|EXCEL VBA
VBA・一覧取得
VBAでフォルダ内のファイル名の一覧を取得する方法を解説。フォルダの中の複数ファイルを自動でひとつずつ展開しながら 連続処理をさせたいときに使える超便利テク!

※その他関連記事は、このページの下の方にもあります。

-EXCEL&VBA
-,

シェアしていただけると助かります。