VBA技術解説
If条件式のいろいろな書き方:TrueとFalseの判定とは

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2017-06-15 最終更新日:2018-01-28

If条件式のいろいろな書き方:TrueとFalseの判定とは

If条件式の書き方で、VBAプログラムは大きく様相が変わってきます、


VBAを習い始めは、
比較演算子で比較した結果が
正しければTrue、
間違っていればFalse
という事で理解するはずです。

しかし、いろいろなサンプルコードを見ていると、
「あれっ」比較演算子が無い・・・
というようなIfステートメントやSelect Caseに出くわします。

IfやSelect Caseにおける、True判定、False判定について、もう少し詳しく解説します。


まず、VBAにおけるTrueの正体は何か、
論理値として書かれたTrue,Falseを数値変換してみましょう。
これには、CLng関数CInt関数、もしくは計算します。

MsgBox CLng(True)
MsgBox CInt(True)
MsgBox True + 0

上記のいずれでも同じですが、メッセージボックスには、
-1
と表示されます。
ではFalseは、

MsgBox CLng(False)
MsgBox CInt(False)
MsgBox False + 0

こちらは、
0
と表示されます。
つまり、True,Falseの正体は、-1,0という事になります。
※ちなみに、Excelシート上では、True=1,False=0です。


しかし、上記のTrueとFalseの値は、論理値として書かれたTrue,Falseの値であり、
IfやSelect Caseでの、True判定とは違うものです。
Ifの条件式が成立する場合の結果を見てみましょう。



Dim a
Dim b
a = 1
b = 1
MsgBox CLng(a = b)

結果は、
-1
と表示されます。
論理値Trueと同じです。
では、条件が成立しない場合は、

Dim a
Dim b
a = 1
b = 2
MsgBox CLng(a = b)

結果は、
0
と表示されます。
論理値Falseと同じです。


では逆の事をしてみましょう。
数値を論理値に変換してみます。
これには、CBool関数を使います。


・CBool関数 ・CBool関数の使用例 ・ブール型 (Boolean)について ・CBool関数の参考 ・データ型変換関数一覧
Dim a
Dim b
a = -1
b = 0
MsgBox CBool(a)
MsgBox CBool(b)

順に、
True
False

と表示されます。
論理値を数値変換した時の反対になっていますので、当然納得です。


では、今度は、全く別の数値で、CBool関数を使ってみましょう。


・CBool関数 ・CBool関数の使用例 ・ブール型 (Boolean)について ・CBool関数の参考 ・データ型変換関数一覧
Dim a
Dim b
a = -2
b = 2
MsgBox CBool(a)
MsgBox CBool(b)

順に、
True
True

と表示されます。
Trueは-1なはずなのに、-2も2もTrueと変換されました。


ここまで進むと、
変数に入っている数値をIf判定できるのではないかと気づきます。

Dim a
a = 0
If a Then
  MsgBox "True判定"
Else
  MsgBox "False判定"
End If

結果は、
False判定
と表示されます。
これは、False=0なので納得です。
それでは、

Dim a
a = 2
If a Then
  MsgBox "True判定"
Else
  MsgBox "False判定"
End If

結果は、
True判定
と表示されます。
つまり、
CBool(2)はTrueなので、True判定になるということです。


結論としては、
数値であれば、そのままIfの条件式とすることが出来るという事です。
その時の判定は、
0ならFalse
0以外はTrue

になるという事です。

ここまで理解すると、以下のような書き方が出来ます。

Dim a
On Error Resume Next
a = 1 / 0
If Err Then
  MsgBox "エラー"
End If

結果は、
エラー
と表示されます。
Errオブジェクトの既定のプロパティはNumberで、エラーが無い場合はNumberは0が返されます。
ここではErr.Numberは11となりますので、11を論理値として判定すればTrueになるという事です。
つまり、エラーが無ければ0が返されるのでFalse、エラーがあれば0以外が返されるのでTrue判定となるという事です。
もちろん、
Err.Number <> 0
と書くのが省略しない正しい書き方です。
でも、Errと書けば、なんとなくErrだったらと直感的にわかり易いということです、


以下のような使い方もできます。

Dim a
a = "Excel2013"
If InStr(a, "ce") Then
  MsgBox "文字列は含まれます"
End If

結果は、
文字列は含まれます
と表示されます。
Instr関数は、文字列が含まれていなければ0を、含まれていればその位置を数値で返します。

・InStr関数 ・InStrB関数 ・InStr関数の使用例 ・InStr関数の応用例1 ・InStr関数の応用例2 ・InStr関数の応用例3 ・InStr関数の練習問題 ・ ・
上記では、InStr(a, "ce")は3を返しますので、True判定となります。
こちらももちろん、
InStr(a, "ce") > 0
と書くのが省略しない正しい書き方になります。
Errと同様に、InStrだけで、文字が含まれていればと直感的に理解できるものです。

これは、Excelを作った人が意図したものかどうかは知る由もありませんが、
関数やオブジェクト等の戻り値は、
正しい時は0、エラーや見つからない時は0以外を返すようになっています。
これを理解すれば、条件式を簡略化した書き方が出来るようになります。

これは、自分でFunctionを作った時にも使えます。
戻り値の型をBooleanにするだけでなく、
エラーコードを返すようなFunctionを作った時には、
正しければ0を、間違っている場合は0以外を返すように作れば、
条件式が書きやすくなるという事です。

ここまで理解できれば、IFやSelect Caseの書き方の幅も大分広がると思います。
ですが、以下のような使い方は、やめた方がよいでしょう。

c = a = b

このような書き方を見かけることがありますが、これはいかがなものか
これは、以下の書き方を、極端に短く書いてしまったものです。

If a = b Then
  c = True
Else
  c = False
End If

VBAコードは短ければ良いというものではありません。
わかり易さというものも、極めて重要な要素です。
ただし、そのわかり易さというのは人それぞれで、その人のVBAスキルに依存するものです。
まずは自分にとってわかり易いVBAコードを書くようにして下さい。
そしてその先では、VBAコードを共有する人たちにとってわかり易いコードを書くようにして下さい。




同じテーマ「マクロVBA技術解説」の記事

プログラミングの基本~ロジックの組み立て
実は奥が深いIfステートメント
論理積(And)論理和(Or)と真(True)偽(False)の判定
If条件式のいろいろな書き方:TrueとFalseの判定とは
VBAでの括弧()の使い方、括弧が必要な場合
VBAにおけるピリオドとカンマとスペースの使い方
変数とプロシージャーの命名について
文字列置換の基本と応用(Replace)
データクレンジングと名寄せ
ForとIfのネストこそがVBAの要点


新着記事NEW ・・・新着記事一覧を見る

カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ