こんにちは!VBAの海原へ漕ぎ出したばかりのあなたも、マクロの記録を卒業して「自分の手で自由自在にシステムを組み上げたい」と意気込んでいるあなたも、ここまでよくたどり着きましたね。
私たちが日々向き合っているExcel VBA。実は、この言語の歴史やバックグラウンド(C言語やCOMの系譜)を知る者にとって、「Boolean(真偽値)型」の評価は、初学者が最も深くハマりやすい「美しくも危険な罠」の一つです。
今回は、このBoolean型が隠し持つ「0以外はTrue」という仕様の正体と、そこから生まれる論理エラーを華麗に回避するプロの知見を、優しく、そして徹底的に伝授しましょう。
ここをクリアすれば、あなたの書くコードの信頼性はグッと跳ね上がりますよ。
—
1. Boolean型ってそもそも何だろう?
プログラムの世界には、「はい(True)」か「いいえ(False)」の2つの状態しか持たないデータ型が存在します。それが Boolean型(ブール型・論理型) です。
スイッチで例えるなら、カチッと入っている状態が `True`、切れている状態が `False` ですね。
Dim isFinished As Boolean
isFinished = True ‘ 終わったよ
非常にシンプルですが、VBAの世界では、このBoolean型が「数値」と裏でこっそり手をつないでいるという特徴があります。ここに、すべての悲劇(そしてバグ)の源泉があるのです。
—
2. 【閲覧注意】「0以外はすべてTrue」というVBAの裏仕様
VBAのメモリ上において、Boolean型の正体は「2バイトの整数(Integer型)」です。そしてVBAの歴史的背景から、次のような強烈なルールが存在します。
- `False` = 完全に「 0 」
- `True` = 「 0 以外」のすべて(厳密には -1)
そう、「0でなければ、マイナスだろうが、100だろうが、すべてTrueとみなす」という驚きの暗黙の変換(自動変換)が行われているのです。
図解してみましょう。
[ 数値データ ] [ VBAの判定 ]
… -2 ──────┐
… -1 ──────┼──> 【 True 】 (0以外は全部こっち!)
0 ──────┴──> 【 False 】
1 ──────┐
100 ──────┼──> 【 True 】
この仕様を知らないと、現場で次のような恐ろしいバグを生み出すことになります。
陥りやすいエラーの現場
例えば、「セルに入力された値がエラーかどうか」を判定するつもりのコードを書いたとします。
Sub DangerousCode()
Dim result As Long
result = 5 ‘ 何らかの計算結果やステータスコード(0以外)
‘ 「resultがTrue(何らかの状態)なら…」と判定したい
If result Then
MsgBox “処理が実行されました!(本当はエラーかも?)”
End If
End Sub
変数 `result` は `Boolean` ではなく `Long(数値)` です。しかし、VBAは `If result Then` と書かれると、「おっ、数値が入ってきたな。じゃあ0じゃないから `True` として扱ってやろう!」と、勝手に気を利かせて(お節介にも)暗黙の変換を行ってしまうのです。
これが、意図しないバグ(動くけれど、ロジックが破綻している状態)を引き起こす最大の原因です。
—
3. プロが教える!安全な条件判定の極意
では、この「お節介な自動変換」の罠を避けて、堅牢でバグのないコードを書くにはどうすればよいのでしょうか?
答えは非常にシンプルです。
「数値は数値として、明示的に比較演算子を使って評価する」こと。これだけです。
悪い例 vs 良い例
❌ 危険な書き方(暗黙の変換に頼る)
Dim count As Integer
count = 3
‘ 0以外だからTrueと判定される(意図が曖昧)
If count Then
‘ 処理
End If
⭕ 安全で美しい書き方(明示的な比較)
Dim count As Integer
count = 3
‘ 「countが0より大きい」という条件をハッキリ明記する
If count > 0 Then
‘ 処理
End If
さらに、APIの戻り値などで「成功(True / 0)」と「失敗(非ゼロ)」を扱う場合も、以下のように「何を基準に判定しているのか」をコード上で明確に言語化するのが、一流のエンジニアの作法です。
Sub SafeCode()
Dim apiStatus As Long
apiStatus = 100 ‘ 例:エラーコードなどの数値
‘ 厳密に「0ではない(=エラーが存在する)」ことを比較する
If apiStatus <> 0 Then
MsgBox “エラーが発生しました。ステータス: ” & apiStatus, vbCritical
Else
MsgBox “正常終了です。”, vbInformation
End If
End Sub
—
4. まとめ:ここをクリアすれば、もう初級者卒業です!
今回は、Boolean型の評価における「0以外はTrue」という仕様の落とし穴と、その回避策について解説しました。
- VBAでは、0以外の数値はすべて `True` として扱われる(暗黙の変換)。
- `If 状態 Then` のように、変数をそのまま条件式に裸で置くのはバグの元。
- `If val <> 0 Then` のように、比較演算子を使って「何を比較しているのか」を明示する。
「動けばいいや」で書かれたマクロと、「仕様を完全にあやつり、破綻のない」プロのコードの差は、まさにこうした細部へのこだわりティにあります。
ここをクリアしたあなたなら、もう「マクロの記録」のオマケのようなコードから完全に脱却し、自分の意志でエラーをねじ伏せるエンジニアの階段を確実に登っていますよ。
明日からのVBAライフ、ぜひ「明示的な比較」を意識してコードを書いてみてくださいね。それでは、また次の知見でお会いしましょう!
