空白セルだけ処理
「空白セルだけを狙って処理したい」—大量データでも手早く、安全に扱うための定番テクニックを、初心者向けに短いコードでまとめました。最速は Range.SpecialCells(xlCellTypeBlanks)。条件分岐なら IsEmpty や Trim を使い分けます。
基本:空白セルだけを一気に取得して処理
Sub FillBlanks_NA()
Dim tgt As Range, blanks As Range
Set tgt = Range("B2:B200") '対象範囲
On Error Resume Next
Set blanks = tgt.SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not blanks Is Nothing Then
blanks.Value = "未入力" '空白セルだけ一括書き込み
End If
End Sub
VB- ポイント:
- xlCellTypeBlanks: 空白セルだけを抽出。一括処理で圧倒的に速い。
- 0件エラー対策: SpecialCellsは該当なしでエラー。On Error+Nothingチェックが定番。
行単位:キー列が空なら行ごと処理(削除・フラグ)
Sub DeleteRows_IfKeyBlank()
Dim last As Long, r As Long
last = Cells(Rows.Count, "A").End(xlUp).Row 'キー列Aの最終行
For r = last To 2 Step -1
If Trim(Cells(r, "A").Value) = "" Then Rows(r).Delete
Next r
End Sub
Sub FlagRows_IfKeyBlank()
Dim last As Long, r As Long
last = Cells(Rows.Count, "A").End(xlUp).Row
For r = 2 To last
If Trim(Cells(r, "A").Value) = "" Then Cells(r, "G").Value = "空行"
Next r
End Sub
VB- ポイント:
- 下から削除: 行削除は逆ループが安全。
- Trimの意味: スペースだけのセルも「空」と判定したいときに有効。
表示中の空白だけ処理(フィルタ連動)
Sub FillVisibleBlanks_Only()
Dim rg As Range, visBlanks As Range
Set rg = Range("A1").CurrentRegion
rg.AutoFilter Field:=2, Criteria1:="=営業A" '例:B列で抽出
On Error Resume Next
Set visBlanks = rg.Offset(1).Resize(rg.Rows.Count - 1).Columns(3).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not visBlanks Is Nothing Then
On Error Resume Next
Set visBlanks = visBlanks.SpecialCells(xlCellTypeBlanks) '可視かつ空白だけ
On Error GoTo 0
If Not visBlanks Is Nothing Then visBlanks.Value = "未入力"
End If
End Sub
VB- ポイント:
- 二段絞り: 可視セル → 空白セルの順で再度 SpecialCells。
- 列を絞る: 行重複を避けたいときは対象列を1本に限定。
ハイライト・入力支援:空白セルを見つけやすくする
Sub HighlightBlanks_Yellow()
Dim blanks As Range
On Error Resume Next
Set blanks = Range("C2:C500").SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not blanks Is Nothing Then blanks.Interior.Color = RGB(255, 255, 153)
End Sub
Sub DataValidation_OnlyBlanks()
Dim blanks As Range
On Error Resume Next
Set blanks = Range("D2:D200").SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not blanks Is Nothing Then
blanks.Validation.Delete
blanks.Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:="営業A,営業B,営業C"
End If
End Sub
VB- ポイント:
- 見える化: 背景色で入力漏れを即発見。
- バリデーション: 空白だけに選択リストや制約を付与できる。
置換・補完:隣列や固定値で空白を埋める
Sub FillBlanks_FromLeft()
Dim tgt As Range, blanks As Range, c As Range
Set tgt = Range("E2:E300")
On Error Resume Next
Set blanks = tgt.SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not blanks Is Nothing Then
For Each c In blanks
c.Value = Cells(c.Row, "D").Value '左隣の値で補完
Next c
End If
End Sub
Sub FillBlanks_WithZero()
Dim blanks As Range
On Error Resume Next
Set blanks = Range("G2:G300").SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not blanks Is Nothing Then blanks.Value = 0
End Sub
VB- ポイント:
- 隣列参照: 行番号で補完元を取得。
- 一括代入: 固定値はそのまままとめて代入が最速。
テーブル(ListObject):空白セル処理の定番
Sub Table_FillBlankAmounts()
Dim lo As ListObject, tgt As Range, blanks As Range
Set lo = ActiveSheet.ListObjects("売上テーブル")
Set tgt = lo.ListColumns("金額").DataBodyRange
On Error Resume Next
Set blanks = tgt.SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not blanks Is Nothing Then blanks.Value = 0
End Sub
VB- ポイント:
- 列名指定: ListColumns(“列名”)で壊れにくく。
- DataBodyRange: 見出し除外でデータ部のみ。
空白の判定をより厳密に(IsEmpty/Len/Trim)
Function IsBlankStrict(v As Variant) As Boolean
IsBlankStrict = (VarType(v) = vbEmpty) Or (Trim(CStr(v)) = "")
End Function
Sub FillBlanks_Strict()
Dim r As Long, last As Long
last = Cells(Rows.Count, "B").End(xlUp).Row
For r = 2 To last
If IsBlankStrict(Cells(r, "B").Value) Then Cells(r, "B").Value = "未入力"
Next r
End Sub
VB- ポイント:
- IsEmpty: 真の空(未設定)を判定。
- Trim+空文字: スペースのみも空扱いに。
例題で練習
例題1:売上表で「顧客名が空の行」に赤帯を付ける
Sub Example_MarkEmptyCustomer()
Dim last As Long, r As Long
last = Cells(Rows.Count, "B").End(xlUp).Row
For r = 2 To last
If Trim(Cells(r, "B").Value) = "" Then Rows(r).Interior.Color = RGB(255, 199, 206)
Next r
End Sub
VB例題2:可視の「金額列の空白」だけゼロ補完
Sub Example_FillVisibleAmountBlanks()
Dim rg As Range, vis As Range
Set rg = Range("A1").CurrentRegion
rg.AutoFilter Field:=2, Criteria1:="=営業A"
On Error Resume Next
Set vis = rg.Offset(1).Resize(rg.Rows.Count - 1).Columns(5).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not vis Is Nothing Then
Dim blanks As Range
On Error Resume Next
Set blanks = vis.SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not blanks Is Nothing Then blanks.Value = 0
End If
End Sub
VB例題3:テーブルの「日付列の空白」に今日の日付を入れる
Sub Example_TableFillDate()
Dim lo As ListObject, tgt As Range, blanks As Range
Set lo = ActiveSheet.ListObjects("売上テーブル")
Set tgt = lo.ListColumns("日付").DataBodyRange
On Error Resume Next
Set blanks = tgt.SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not blanks Is Nothing Then blanks.Value = Date
End Sub
VB実務の落とし穴と対策
- 空白とゼロ長文字の違い: 数式で “” を返すセルは「空白でない」扱いになることがある。厳密判定は Trim(CStr(v))=”” を併用。
- SpecialCellsの範囲: CurrentRegionは空行で途切れる。必要なら最終行・列を計算して範囲を組む。
- 0件エラーの標準対策: On Error Resume Next → Set …SpecialCells → On Error GoTo 0 → Nothingチェックをテンプレ化。
- 速度最適化: 固定値一括代入、列を絞る、画面更新・自動計算を一時オフにすると大幅に高速化。
Sub SpeedWrap_Blanks()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'…空白セルの一括処理…
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
VB