【EXCEL VBA】空白セルがある行だけ削除する SpecialCells

スポンサーリンク

空白がある行だけ削除する

データの整理をしているときに、「どこかの列に空白がある行は削除したい」というような場合があると思います。

今回は、そんなときに便利な方法を紹介させていただきます!

こここでは、SpecialCells、EntireRow、Deleteを使って実現します!

スポンサーリンク

SpecialCells

構文

Rangeオブジェクト.SpecialCells(Type, Value)

Type・・・セルの表示形式を表す定数

Value・・・バリアント型の値(省略可)

SpecialCellsメソッドは、空白のセルを扱うだけでなく可視セルだけを取得するなど色々な使い方が出来ます。

引数のTypeでどのようにデータを取得するかを指定します。

設定できる定数は次のようなものがあります。

Typeに指定する定数説明
xlCellTypeAllFormtConditions表示形式が設定されているセル
xlCellTypeAllValidation条件の設定が含まれているセル
xlCellTypeBlanks空白のセル
xlCellTypeCommentsコメントが含まれているセル
xlCellTypeConstants定数が含まれているセル
xlCellTypeFormulas数式が含まれているセル
xlCellTypeLastCell使われたセル範囲内の最後のセル
xlCellTypeSameFormatConditions同じ表示形式が設定されているセル
xlCellTypeSameValidation同じ条件の設定が含まれているセル
xlCellTypeSameVisibleすべての可視セル

※Valueについては、引数Typeに xlCellTypeConstants または xlCellTypeFormulas を設定した場合に、特定の種類の定数や数式を含むセルだけを取得できます。 省略すると、すべての定数および数式が対象になります。

スポンサーリンク

EntireRow

指定されている範囲の行全体を表すプロパティです。

構文

Rangeオブジェクト.EntireRow

Rangeオブジェクト.EntireRow

詳しくはこちらをどうぞ

Delete

削除するやつです。

これは特に問題ないかと思います。

構文

Rangeオブジェクト.Delete

使い方

日本語で順番に言うと

①指定した範囲の中から空白のセルの範囲を取得する(SpecialCells(xlCellTypeBlanks)

②”①”の含まれる行全体を取得する(EntireRow

③”②”を消す(Delete

です。

くっつけると、次のようになります。

Rangeオブジェクト.SpecialCells(xlCellTypeBlanks).EntireRow.Delete

分かりにくい場合は、一つずつ別々に考えると分かりやすいです。

例えば次のような表があったとします。

※なんちゃって個人情報さんで取得した架空のデータです。

一つずつ順番に処理していきましょう。

まずは空白のあるセルを取得します。

Sub sample()

    '空白のセルだけ選択する
    Range("A1:G14").SpecialCells(xlCellTypeBlanks).Select
    
End Sub

Selectは分かりますね。

一旦、指定がちゃんとできているか確認するために、Selectしてみます。

実行すると以下のように、空白のセルだけが選択された状態になります。

では、こいつを変数(指定した範囲のい空白のセル達)に入れます。

Sub sample()

    Dim 指定した範囲の空白のセル達 As Range
    Set 指定した範囲の空白のセル達 = Range("A1:G14").SpecialCells(xlCellTypeBlanks)
    
End Sub

次はこの変数をRangeオブジェクトとして、そのセル範囲の行全体を取得しましょう。

ここでも、合ってるか確認するためにまずはSelectします。

Sub sample()

    Dim 指定した範囲の空白のセル達 As Range
    Set 指定した範囲の空白のセル達 = Range("A1:G14").SpecialCells(xlCellTypeBlanks)
    
    '行全体を取得
    指定した範囲の空白のセル達.EntireRow.Select
    
End Sub

実行すると

こんな具合に、空白のセルがある行の全体が選択されている状態になります。

こいつも改めて、変数にいれます。

Sub sample()

    Dim 指定した範囲の空白のセル達 As Range
    Set 指定した範囲の空白のセル達 = Range("A1:G14").SpecialCells(xlCellTypeBlanks)
    
    '行全体を取得
    Dim 指定した範囲の空白のセル達の行全体 As Range
    Set 指定した範囲の空白のセル達の行全体 = 指定した範囲の空白のセル達.EntireRow
    
End Sub

最後は削除です。


Sub sample()

    '指定した範囲内の空白のセルだけ取得
    Dim 指定した範囲の空白のセル達 As Range
    Set 指定した範囲の空白のセル達 = Range("A1:G14").SpecialCells(xlCellTypeBlanks)
    
    'その行全体を取得
    Dim 指定した範囲の空白のセル達の行全体 As Range
    Set 指定した範囲の空白のセル達の行全体 = 指定した範囲の空白のセル達.EntireRow
    
    '削除
    指定した範囲の空白のセル達の行全体.Delete
    
End Sub

実行すると

このように、空白の無い完全なデータの行だけが残ります。

こいつを一気にやってるのが、最初に出した

Rangeオブジェクト.SpecialCells(xlCellTypeBlanks).EntireRow.Delete

です。

サンプルの表に対して書くと次のようになりますね。

Sub sample()

    'どこかの列に空白のある行を削除する
    Range("A1:G14").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
End Sub

実行します。

できましたね(^o^)

数式が入り組んでいて分からない場合は、1つずつ分解すると分かりますね。

複雑な処理も、一気にやろうとするのではなくて工程を細かく整理することで簡単な処理に変わります!

コメント

  1. 匿名 より:

    複数シートある場合はどうすればいいでしょうか。
    シートSelectするとエラーが出ます。

    • hirachin より:

      コメントありがとうございます!
      複数範囲の場合は、シートをループして1つずつ処理する必要があります。

      例えば以下のようなコードです。
      ====================
      Sub sample()
      Dim sht As Worksheet, rng As Range

      ‘ワークブック内のシートを順番に全て処理する
      For Each sht In ThisWorkbook.Sheets

      ‘シートの使用している範囲を取得
      Set rng = sht.UsedRange

      ‘ブランクセルがある範囲を個別に処理する
      Dim area As Range
      For Each area In rng.SpecialCells(xlCellTypeBlanks).Areas
      area.EntireRow.Delete
      Next area
      Next
      End Sub
      ====================

      UsedRangeとかで、使ってる範疇を指定して、それに対してSpecialCells(xlCellTypeBlanks)で空白のところを指定します。
      ただし、UsedRangeとか使うと、この記事である

      .SpecialCells(xlCellTypeBlanks).EntireRow.Delete

      だと、複数の範囲に実行出来ません!と怒られるので、

      ‘ブランクセルがある範囲を個別に処理する
      Dim area As Range
      For Each area In rng.SpecialCells(xlCellTypeBlanks).Areas
      area.EntireRow.Delete
      Next area

      のように、1行ずつ処理しています(^o^)

タイトルとURLをコピーしました