【入門編】Null値とEmpty値、長さ0の文字列の違いを完全攻略 – Excel VBA解析バイブル

スポンサーリンク

【VBAの深淵】「何も入っていない」は1つじゃない!Null, Empty, “” を完全制覇する

こんにちは。業務自動化の世界へようこそ。
マクロの記録から一歩踏み出し、現場で戦えるコードを書こうとすると、必ずぶつかる壁があります。それが「値がない」という状態の正体です。

「セルが空っぽだから判定しよう」と思って `If cell.Value = “” Then` と書いたのに、なぜかエラーで止まる。あるいは、データベースから取得したデータが判定をすり抜ける。これらはすべて、VBAにおける「無」の定義を混同していることが原因です。

今日は、この「無」の正体を暴き、あなたのVBAスキルを一段上のレベルへ引き上げます。ここをクリアすれば、もう判定エラーで夜中に泣くことはありませんよ。

1. VBAにおける「3つの無」の正体

VBAには、似ているようで全く異なる「何もない状態」が3つ存在します。まずは直感的に理解しましょう。

| 状態 | 意味 | 発生源 |
| :— | :— | :— |
| Empty | 「まだ一度も値が代入されていない」初期状態 | 変数宣言直後、セルが本当に空のとき |
| 長さ0の文字列 (“”) | 「文字数は0だが、文字列型である」状態 | `Range.Value = “”` としたとき、空の計算結果 |
| Null | 「データベース等で、値が未定義・不明」状態 | DB連携、Access操作、一部のAPI戻り値 |

なぜこれが混乱を招くのか?

それは、VBAが「良かれと思って値を勝手に型変換してしまうから」です。これを「暗黙の型変換」と言いますが、これがバグの温床になります。

2. 実践的な判定ロジック:最強の「無」判定

初学者が陥りやすい罠は、`If x = “” Then` と書いて全てを解決しようとすることです。しかし、`Null` を比較するとエラーになったり、期待通りに動かなかったりします。

現場で私が愛用している、「絶対に壊れない最強の判定関数」を伝授します。

‘ 【現場の知見】値の空判定関数
‘ どんな値が来ても、正しく「空であるか」を判定します
Public Function IsTrulyEmpty(ByVal targetValue As Variant) As Boolean
‘ 1. Empty値の判定
If IsEmpty(targetValue) Then
IsTrulyEmpty = True
Exit Function
End If

‘ 2. Null値の判定 (データベース連携で必須)
If IsNull(targetValue) Then
IsTrulyEmpty = True
Exit Function
End If

‘ 3. 長さ0の文字列の判定
‘ トリムすることで、スペースのみの文字列も「空」とみなす現場仕様
If Trim(targetValue) = “” Then
IsTrulyEmpty = True
Exit Function
End If

IsTrulyEmpty = False
End Function

3. なぜ `If x = “”` だけで済ませてはいけないのか?

例えば、データベースから顧客名を取得する際、その値が `Null` だった場合、`If x = “”` を実行した瞬間に「実行時エラー 94: Null の使い方が不正です」という警告と共にプログラムが停止します。

また、セルに「スペース」が1つ入っている場合、`If x = “”` は `False` になりますが、業務的には「空」として扱いたいケースがほとんどですよね。

上記の関数を使えば、これらを一網打尽にできます。

活用例:セルをチェックして処理を分岐する

Sub Sample_Process()
Dim val As Variant
val = Range(“A1”).Value

‘ 最強の判定関数を使って安全に処理
If IsTrulyEmpty(val) Then
Debug.Print “A1は空です。処理をスキップします。”
Else
Debug.Print “値は [” & val & “] です。処理を開始します。”
End If
End Sub

4. エンジニアとしてのアドバイス:型を信じるな

最後に、アーキテクトからのアドバイスです。

VBAで「変数の型」を `Variant` にしていると、中身が何であるか(数値なのか、文字列なのか、Nullなのか)をVBAが裏で勝手に解釈します。「何が入ってくるかわからない」という前提に立ち、常に `IsEmpty` や `IsNull` を使って、相手の正体を確かめる癖をつけてください。

特に、Excelからデータベース(SQL ServerやAccess)に接続するプロジェクトでは、この「Null判定」の有無が、開発の安定度を天と地ほど分かちます。

今日のまとめ

  • Empty は「初期化前」。`IsEmpty()` で判定する。
  • Null は「未定義」。`IsNull()` で判定する。
  • “” は「文字列」。`= “”` で判定するが、スペース対策に `Trim()` を忘れない。
  • 迷ったら、今回紹介した `IsTrulyEmpty` をコピペして使ってください。

ここをマスターしたあなたは、もう「動くけれど脆いコード」を書く卒業生です。自信を持って、次の自動化へ進んでください。応援していますよ!

タイトルとURLをコピーしました