空白がある行だけ削除する
データの整理をしているときに、「どこかの列に空白がある行は削除したい」というような場合があると思います。
今回は、そんなときに便利な方法を紹介させていただきます!
こここでは、SpecialCells、EntireRow、Deleteを使って実現します!
SpecialCells
Type・・・セルの表示形式を表す定数
Value・・・バリアント型の値(省略可)
SpecialCellsメソッドは、空白のセルを扱うだけでなく可視セルだけを取得するなど色々な使い方が出来ます。
引数のTypeでどのようにデータを取得するかを指定します。
設定できる定数は次のようなものがあります。
Typeに指定する定数 | 説明 |
---|---|
xlCellTypeAllFormtConditions | 表示形式が設定されているセル |
xlCellTypeAllValidation | 条件の設定が含まれているセル |
xlCellTypeBlanks | 空白のセル |
xlCellTypeComments | コメントが含まれているセル |
xlCellTypeConstants | 定数が含まれているセル |
xlCellTypeFormulas | 数式が含まれているセル |
xlCellTypeLastCell | 使われたセル範囲内の最後のセル |
xlCellTypeSameFormatConditions | 同じ表示形式が設定されているセル |
xlCellTypeSameValidation | 同じ条件の設定が含まれているセル |
xlCellTypeSameVisible | すべての可視セル |
※Valueについては、引数Typeに xlCellTypeConstants または xlCellTypeFormulas を設定した場合に、特定の種類の定数や数式を含むセルだけを取得できます。 省略すると、すべての定数および数式が対象になります。
EntireRow
指定されている範囲の行全体を表すプロパティです。
Rangeオブジェクト.EntireRow
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つずつ分解すると分かりますね。
複雑な処理も、一気にやろうとするのではなくて工程を細かく整理することで簡単な処理に変わります!
コメント
複数シートある場合はどうすればいいでしょうか。
シートSelectするとエラーが出ます。
コメントありがとうございます!
複数範囲の場合は、シートをループして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^)