次の DEMO を見にいく
Excel

VBAで空白セル判定:IsEmpty/””/Lenの違いと使い分け

k.w
\お買い物マラソン開催中/
スポンサーリンク

空白セルかどうか判定するには

VBAで「空白かどうか」を調べる方法は、主に3つあります。IsEmpty、空文字(””)、Len=0 です。どれも似ていますが、見る対象や前提が少し違います。仕組みの違いを先に知ると、後のコードが迷いません。

IsEmpty は「変数が未初期化か」を調べます。セルの値に直接使うより、Variant 型の変数に向いた関数です。セルに対して使うと、Empty と未入力が混ざって見えることがあり、勘違いの原因になります。

空文字(””)は「長さ0の文字列」です。セルに数式が入っていて、IF 関数などで “” を返すことがあります。このとき、見た目は空でも値は文字列です。計算や型チェックで差が出ます。

Len は文字列の長さを返します。Len(値) = 0 なら「文字がない」と分かります。ただし、Null やエラー値に対しては型の扱いに注意します。Trim と組み合わせて「空白だけのセル」を除外することもできます。

IsEmptyの基本(Emptyと未入力の違い)

IsEmpty(x) は、x が「まだ何も代入されていない Variant 変数」のとき True になります。セルの値に直接使うと、期待どおりにならないことがあります。Value が “” のときは False、Empty のときは True です。セルは多くの場合 Empty ではなく、空文字や数値、エラー、Null などの別の状態です。

  • 変数に対しては有効:Dim v As Variant : IsEmpty(v) = True
  • セルに対しては非推奨:IsEmpty(Range(“A1”).Value) は意図とずれることがある
  • 配列の未割当・未初期化判定にも向きます

実務では、セル判定に IsEmpty は使わず、Len や “” との比較を選ぶほうが安全です。

“”(空文字)との違い(数式で””が入るケース)

セルが数式 =IF(条件, 値, “”) のように空文字を返すとき、ユーザーには空白に見えます。しかし、VBAでは「長さ0の文字列」という実体です。数式が返す “” は、IsEmpty では空白扱いになりません。比較するなら Range(“A1”).Value = “” を使います。

また、vbNullString は長さ0の特殊な文字列参照です。”” とほぼ同じ扱いですが、結合や一部のAPIで差が出ることがあります。基本は “” で十分です。

Len関数でのチェック(Len=0の意味と限界)

文字列長が0なら、文字がありません。Len(CStr(値)) = 0 という形にすると、数値や日付も文字列化してから長さを調べられます。前後空白のみのセルを除外したいときは Len(Trim(CStr(値))) = 0 とします。

注意点として、Null やエラー値に対して Len を直接呼ぶとエラーになる場合があります。安全に書くなら、Variant に受けて型を調べてから Len を使う、または Nz 相当の自前関数で Null を空文字に変える方法があります。

ミニQA:最初にどれを使えばよい?

  • まずは Range(…).Value = “” か、Len(Trim(CStr(Range(…).Value))) = 0 を使います。
  • 数式で “” を返すセルも空扱いにしたいなら、”” 比較か Len で判定します。
  • 変数が未初期化かだけを知りたいときに限り IsEmpty を使います。
判定方法主な用途強い点弱い点
IsEmpty(x)変数が未初期化かの確認変数・配列に強いセル値の空判定には不向き
値 = “”数式の “” も空扱いにする見た目の空白と一致しやすいNull/エラーは別扱い
Len(Trim(CStr(値)))=0空白だけの文字も除外前後空白対策ができる型とエラーの扱いに注意

空白判定の書き方

ここからは、セル指定の書き方ごとに、すぐ使えるコードを示します。単一セル、範囲、ループ、変数への代入という順で進めます。まずは最も読みやすい記述から始め、徐々に再利用しやすい形に整えます。

Range(“セル座標”) での書き方(単一セル・範囲)

単一セルの基本です。数式の “” も空扱いにするなら “” 比較、空白文字も除きたいなら Len+Trim を使います。

“`vba

‘ 見た目が空なら True(”” を空扱い)

If Range(“A1”).Value = “” Then

‘ 空のときの処理

End If

‘ 空白のみ(スペース等)も空扱い

If Len(Trim(CStr(Range(“A1”).Value))) = 0 Then

‘ 空のときの処理

End If

“`

複数セルを一括で調べたいときは、SpecialCells を使うと高速です。ただし、空白セルがないとエラーになります。On Error で囲むか、CountA などで事前に確認します。

“`vba

Dim rng As Range

On Error Resume Next

Set rng = Range(“A1:D10”).SpecialCells(xlCellTypeBlanks)

On Error GoTo 0

If Not rng Is Nothing Then

‘ rng が空白セルの集合

End If

“`

Cells(y, x) での書き方(Forループと組み合わせ)

行番号と列番号で指定すると、可変範囲のループが書きやすくなります。行列の入れ替えや最終行の取得と組み合わせると、実務で使い回せます。

“`vba

Dim r As Long, c As Long

For r = 2 To Cells(Rows.Count, 1).End(xlUp).Row

If Len(Trim(CStr(Cells(r, 1).Value))) = 0 Then

‘ A列r行が空

End If

Next r

“`

速度を上げたい場合は、値を一括で配列に読み込んでから判定します。セルアクセスの回数を減らせます。

“`vba

Dim v, i As Long

v = Range(“A2:A10000”).Value ‘ 2次元配列

For i = 1 To UBound(v, 1)

If Len(Trim(CStr(v(i, 1)))) = 0 Then

‘ 空

End If

Next

“`

Rangeオブジェクト変数に代入する書き方(参照の使い回し)

何度も同じ場所を見るときは、Range を変数に取ると読みやすく、型も明確になります。

“`vba

Dim target As Range

Set target = Worksheets(“Sheet1”).Range(“B5”)

If target.Value = “” Then

‘ 空

End If

“`

範囲を可変にしたいときは、Resize や Offset を併用します。参照の基準点をひとつ決めると、後のメンテが楽です。

“`vba

Dim base As Range, area As Range

Set base = Range(“B2”)

Set area = base.CurrentRegion ‘ テーブル状の範囲

If WorksheetFunction.CountBlank(area) > 0 Then

‘ area 内に空白セルあり

End If

“`

Rangeオブジェクト変数とValue値の文字列変数に代入する書き方(型の違いとTrim活用)

セルの値をいったん変数に受けると、型のチェックや前処理をまとめて書けます。Null やエラーを先に弾くと、Len 判定が安定します。

“`vba

Dim rg As Range

Dim val As Variant ‘ 値の型が一定でないため Variant

Set rg = Range(“C3”)

val = rg.Value

If IsError(val) Then

‘ エラーの場合の処理

ElseIf IsNull(val) Then

‘ Null の場合の処理

ElseIf Len(Trim(CStr(val))) = 0 Then

‘ 実質的に空

End If

“`

文字列だけを扱うと決めている場面では、文字列変数に受けてから判定します。受け取り時に CStr を通すと、その後の処理が一定になります。

“`vba

Dim s As String

s = CStr(Range(“D2”).Value)

If Len(Trim(s)) = 0 Then

‘ 空

End If

“`

ミニQA:.Value と .Value2 はどちらを使う?

  • .Value はロケールや通貨・日付の表示形式に影響されることがあります。
  • .Value2 はより素の値を返します(通貨や日付もシリアル値)。
  • 単に空判定をしたいだけなら、どちらでも大差はありません。表示形式の影響を避けたいときは .Value2 を選びます。

セルの数式がエラーになっている場合

空白判定の前に、数式エラーを安全に扱う必要があります。#N/A や #DIV/0! などのセルに Len や比較をかけると、エラーが発生するか、意図しない結果になることがあります。まずエラーを検出し、処理を分けます。

WorksheetFunction.IsError/IsNAの使いどころ

WorksheetFunction.IsError は、セルの計算結果がエラーかどうかを返します。#N/A のみを分けたいときは IsNA を使います。エラーを先に判定し、空判定はその後に回すと安全です。

“`vba

Dim v As Variant

v = Range(“E5”).Value

If WorksheetFunction.IsError(v) Then

‘ エラーセルの処理(ログ、スキップなど)

ElseIf Len(Trim(CStr(v))) = 0 Then

‘ 空とみなす

End If

“`

VBA の IsError 関数でも判定できます。WorksheetFunction を使わない場合はこちらでも十分です。

“`vba

If IsError(Range(“E5”).Value) Then

‘ エラー

End If

“`

SpecialCells(xlCellTypeBlanks) とエラーセルの扱い

SpecialCells(xlCellTypeBlanks) は「入力されていないセル」を素早く抽出します。数式で “” を返すセルは対象外です。見た目は空でも、値は文字列だからです。一方、エラーセルは空白ではないので抽出されません。用途を分けて使います。

  • 入力そのものがない場所を一括で欲しい → SpecialCells(xlCellTypeBlanks)
  • 数式の “” も空扱いにしたい → ループ+Len/”” 比較

空白が一つもない場合はエラーになるため、必ずエラートラップを入れます。

“`vba

Dim blanks As Range

On Error Resume Next

Set blanks = Range(“A1:H100”).SpecialCells(xlCellTypeBlanks)

On Error GoTo 0

If Not blanks Is Nothing Then

‘ blanks を処理

End If

“`

ミニQA:空白とエラーが混在するときの優先チェック順

  • 1) まず IsError または WorksheetFunction.IsError でエラーを弾きます。
  • 2) 次に Len(Trim(CStr(値))) = 0 で実質空を判定します。
  • 3) 特定の表示形式の影響を避けたいなら .Value2 を使います。

この順にすると、型エラーで止まりにくく、見た目どおりの結果に近づきます。

スポンサーリンク
記事URLをコピーしました