Excel VBA 逆引き集 | 空白セルだけ処理

Excel VBA
スポンサーリンク

空白セルだけ処理

「空白セルだけを狙って処理したい」—大量データでも手早く、安全に扱うための定番テクニックを、初心者向けに短いコードでまとめました。最速は 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
タイトルとURLをコピーしました