【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` をコピペして使ってください。
ここをマスターしたあなたは、もう「動くけれど脆いコード」を書く卒業生です。自信を持って、次の自動化へ進んでください。応援していますよ!
