ツイッター出題回答
IFステートメントの判定

ExcelマクロVBAとエクセル関数についての私的雑感
公開日:2020-06-13 最終更新日:2020-06-15

IFステートメントの判定


ツイッターでIfステートメントの書き方が話題になっていたのを見て、
結構いろいろな要素があるということで、ちょっと意地悪な問題にしてみました。


お題のツイート

https://twitter.com/yamaoka_ss/status/1271402726174277632

VBA問題
さて、いくつが表示されるでしょうか?
Dim i
If "true" Then
i = i + 1
End If
If "1" Then
i = i + 1
End If
If Not "1" Then
i = i + 1
End If
If Not Empty Then
i = i + 1
End If
MsgBox i
可能性としては、
0,1,2,3,4,エラー


解説のツイート

https://twitter.com/yamaoka_ss/status/1271461072461946881

まずはIfステートメントの基本から。
If ○ Then
この○には通常は式が入りますが、式は評価して必ず値になります。
Ifステートメントでは、この結果の値をTrue/False判定します。
True/False値以外の場合は、CBoolで変換してから判定すると考えればよいでしょう。
追加解説
If Not ○ Then
この場合も先にNotを求めます。
Not ○
この値を評価してから、IfステートメントがTrue/False判定します。


https://twitter.com/yamaoka_ss/status/1271461750257287174

ではTrue/False値以外の場合はというと、
Trueになるのは、文字列"true"または0以外の数値
Falseになるのは、文字列"false"または0
CBoolでエラーになる場合はエラーになる。
きまりは以上です。
これで、問題の数式を見ていきます。
追加解説
CBool関数は、引数をBoolean型(True,False)に変換します。
式がゼロの値に評価される場合Falseを返し、それ以外の場合はTrueを返します。
CBool関数|VBA関数
CBool関数は、引数をBoolean型(True,False)に変換します。式がゼロの値に評価される場合Falseを返し、それ以外の場合はTrueを返します。CBool関数 CBool(expression) expression 任意の文字列式または数式を指定します。

数値変換可能なものはCBoolの引数に指定できます、つまりTrue/False判定できます。
論理値Trueは0、Falseは-1に数値変換できます。
その他としては、
Empty ・・・ 0に変換される、つまりFalse
Missing ・・・ 0に変換される、つまりFalse
vbNull ・・・ 1扱い、つまりTrue

https://twitter.com/yamaoka_ss/status/1271462041228730374

If "true" Then
CBool("true")→True
If "1" Then
CBool("1")→True
ここまでは良いと思います。
次が問題でしょうか。
追加解説
"true"は大文字小文字を問いません。
"TRUE"も"True"もTrueになります。
"false"についても同様です。

数値変換可能な文字列ならCBoolに指定できます。
とても大きな数値、例えば "8888888888" これでも大丈夫です。
指数表記 "10E+3" これも変換可能です。


https://twitter.com/yamaoka_ss/status/1271462421647900672

If Not "1" Then
これが問題ですが、
Not演算子が付いているので"1"は数値変換されて1です。
Not 1
これは、ビット演算なので、
1のNotはFFFE、これは-2
CBool(-2)→True
Not演算の追加解説
Notはビット反転します。
Not 0 これは -1 です。
0000 0000

1111 1111 ・・・FF FF
これが -1 を表します。

Not 1 は -2 です。
0000 0001

1111 1110 ・・・FF FE
これが -2 になります。

ちなみに、 -3 は、
1111 1101 ・・・FF FD


https://twitter.com/yamaoka_ss/status/1271462854743322624

If Not Empty Then
Emptyは0、Notなので-1
CBool(-1)→True
ということで、すべてTrueなので、
答えは4でした。
リプいただいた皆さんありがとうございました。
追加解説
Emptyと似た感じの定数で、Missing、Null、vbNull、vbNullStringがあります。

Missing ・・・ 0に変換される、つまりFalse
vbNull ・・・ 1扱い、つまりTrue
これらは、この数値として考えた結果と同じになります。

Nullは全然違ってきます。
Nullは何をしても答えはNullです。
四則演算しても、Notでも結果はNullです。
Null = Null
これもNullです。
そして、CBoolにNullを指定するとエラーになります。

vbNullStringは空文字""とほぼ同じように使われるものです。
(ただし正確には空文字""とは違うものです。)
これは数値変換できないのでCBoolではエラーになります。
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説
空文字列と書きましたが、空文字列という表現がかなり曖昧な表現になっています。ここでいう空文字列とは、文字列が入るべき場所に、何も入っていない(ように見える)状態を指しています。VBAにおいては、空文字列の状態が2つあります。


IFステートメントの判定の最後に

IFステートメントに関連するサイト内のページを紹介しておきます。

セルの値によって計算を変える(Ifステートメント)|VBA再入門
エクセルでは、他の列の値によって計算式を変えたりすることが多々あります。つまり、条件により処理を分けるということです。ワークシートではIF関数を使いますが、マクロVBAでも、IfはIfと書くのですが、その後の書き方が違ってきます。
条件分岐(IF)|VBA入門
ある条件の時だけ処理したい、ある条件の時は処理したくない、そのような条件によって処理内容を変更したい場合があります。VBAで条件により処理を分岐させたい場合に使うのが、Ifステートメントです。マクロVBAで自動化する場合の多くは、条件により処理を変えつつ一定回数繰り返すという事です。
実は奥が深いIfステートメント|VBA技術解説
プログラムと言うものは、条件により処理を分ける。これにつきます。つまり、この条件が一番問題となります。そして、その記述をするものが、Ifステートメントになります。IFステートメントの基本 まずはIFステートメントの基本を確認しましょう。
If条件式のいろいろな書き方:TrueとFalseの判定とは|VBA技術解説
If条件式の書き方で、VBAプログラムは大きく様相が変わってきます、VBAを習い始めは、比較演算子で比較した結果が 正しければTrue、間違っていればFalse という事で理解するはずです。しかし、いろいろなサンプルコードを見ていると、「あれっ」比較演算子が無い… というようなIfステートメントやSelectCas…




同じテーマ「ツイッター出題回答 」の記事

IFステートメントの判定
日付の謎:IsDateとCDate
ツイッター投稿用に文字数と特定文字で区切る
マクロ記録での色のマイナス数値について
VBAのString型の最大文字数について
Variantの数値型と文字列型の比較
Variant仮引数にRange.Valueを配列で渡す方法
Variant仮引数のByRefとByValの挙動違い
100桁の正の整数値の足し算
「VBA Match関数の限界」についての誤解
VBAで数値を漢数字に変換する方法


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

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(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)


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

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」をお願いいたします。
本文下部へ