HOWTO · VBA

Microsoft Excel VBA でセルが空かどうかを確認する方法

この記事では、Microsoft Excel VBA でセルが空かどうかを確認する方法を説明します。

このページの内容

本当に空白のワークシート セルについては、IsEmpty(Range("A1").Value) が VBA での通常の確認方法です。文字を表示しない数式にも数式自体は存在するため、その結果を空白として扱うべき場合は、文字列比較または Len を使用します。マクロが検出する必要がある内容に合った確認方法を選んでください。

セルが空かどうかを確認する方法

Excel のセルには、定数、数式、または値なしのいずれかが入り得ます。VBA の Empty は Variant の状態であり、Null は別の値です。どちらも、"" に評価される数式とは同一視できません。例では、クリアした後の A2 を使用します。ワークブックで数式を使う場合は、メソッドを選ぶ前に、"" を返す数式を空白として扱うかどうかを決めてください。

方法 1: IsEmpty 関数

IsEmpty は、引数が初期化されていない Variant の場合に True を返します。定数、数式、またはエラー値を含むセルは、数式が何も表示しなくても、初期化されていない Variant ではありません。次の構文例は A2 を確認します。標準 VBA モジュールに配置し、A2 をクリアした後で CheckA2 を実行してください。VBA は設定されたサンプル実行環境では実行できないため、このプロシージャは未実行であり、実行時出力は主張されません。これらの行を標準 VBA モジュールにコピーしてください:

Sub CheckA2()
    If IsEmpty(Range("A2").Value) Then
        MsgBox "A2 is blank"
    Else
        MsgBox "A2 contains a value or formula"
    End If
End Sub

前述のクリア済みセルの設定では、If ブランチは A2 is blank を表示するように設計されています。"" を返す A2 の数式は、セルに数式が残っているため Else ブランチに入ります。Range オブジェクトを渡すこともできますが、.Value を使うと確認対象の値が明示されます。

下の図は、値が入ったセルの別の例を示しています。A1 にはテキスト「Not empty」が含まれ、その下の行は空白です。この設定では、A1 にテキストが含まれているため、IsEmpty(Range("A1").Value) は False を返します。

A1 に「Not empty」が含まれ、その下の行が空白のワークシート

IsBlank は Excel のワークシート関数名であり、直接呼び出せる VBA 関数ではありません。ワークシート関数の動作が必要な場合は、サポートされる範囲で Application.WorksheetFunction を使用するか、タスクに合ったセマンティクスの VBA チェックを使用してください。

方法 2: vbNullString と比較する

vbNullString は、長さゼロの文字列を表す VBA 定数であり、Null 値を保持するものではありません。If Range("A2").Value = vbNullString Then は、セルの値をその文字列と比較します。これにより、クリアされたセルと "" という数式結果の両方が空白として認識されます。そのため、IsEmpty とは異なる質問に答えるものです。比較前にエラーを処理する数式対応の確認には、CheckA2 の代わりにこのプロシージャを使用してください。VBA は設定されたサンプル実行環境では実行できないため、このプロシージャは未実行であり、実行時出力は主張されません。これらの行を同じ標準 VBA モジュールにコピーしてください:

Sub CheckA2ForBlankResult()
    If IsError(Range("A2").Value) Then
        MsgBox "A2 contains an error"
    ElseIf Range("A2").Value = vbNullString Then
        MsgBox "A2 is blank or its formula returns an empty string"
    Else
        MsgBox "A2 contains a nonempty value"
    End If
End Sub

方法 3: 空文字列と比較する

リテラル "" との比較にも同様の文字列比較の動作があります: If Range("A2").Value = "" Then。クリアされたセルと "" という数式結果の両方に同じブランチをたどらせたい場合に便利です。セルに数式がないことや、本当に空白であることを証明するものではありません。区別が重要な場合は HasFormula を別途確認し、エラーが発生し得る場合は比較前に別のブランチで IsError をテストしてください。

方法 4: Len 関数

Len は、文字列としての表現の文字数を返します。条件 If Len(Range("A2").Value) = 0 Then は、結果が 0 文字かどうかを知りたい場合に便利です。"" という数式結果にも一致し得ますが、それをクリアされたセルと区別することはできません。数値は文字列としての長さが 0 以外であり、エラー値に対する Len は安全な一般チェックではありません。エラーが発生し得る場合は、先に IsError を使用してください。

方法 5: Count 関数と Counta 関数

Count は範囲内の数値セルを数え、CountA はテキストや数式を含む、データのあるセルを数えます。1 つのセルでは、Application.WorksheetFunction.Count(Range("A2")) = 0 は数値がないことを意味し、必ずしも空白であることを意味しません。CountA(Range("A2")) = 0 はクリアされたセルを検出しますが、"" を返す数式は、セルに数式が含まれているため依然としてカウントされます。複数セルの範囲では、これらの関数は個数を返すため、すべてのセルが選んだ基準を満たすかどうかを判断することが目的の場合にのみ、範囲のサイズと比較してください。

方法 6: IsNull 関数

IsNull は、Variant に VBA の Null 値が含まれているかどうかをテストします。これは、欠落したデータや不明なデータを表すためによく使われます。通常の空白のワークシート セルは Null ではないため、IsNull(Range("A2").Value) は一般的な空白セル チェックではなく、クリア済みセルの例では False を返します。VBA のデータ ソースが実際に Null を提供し得て、それが識別したい状態である場合にのみ使用してください。

結論

値のないセルには、その .Value に対して IsEmpty を使用します。"" を返す数式も空白ブランチをたどるべき場合は、vbNullString または "" と比較するか、Len を 0 と確認します。Count は数値データがあるかどうかを問い、CountA はセルにデータまたは数式が含まれているかどうかを問います。IsNull は、VBA の別個の値である Null のためのものです。ワークシート エラーが発生し得る場合は比較と Len をガードし、数式の有無が重要な場合は HasFormula を使用してください。