IFステートメントの判定
ツイッターでIfステートメントの書き方が話題になっていたのを見て、
結構いろいろな要素があるということで、ちょっと意地悪な問題にしてみました。
お題のツイート
さて、いくつが表示されるでしょうか?
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,エラー
解説のツイート
If ○ Then
この○には通常は式が入りますが、式は評価して必ず値になります。
Ifステートメントでは、この結果の値をTrue/False判定します。
True/False値以外の場合は、CBoolで変換してから判定すると考えればよいでしょう。
If Not ○ Then
この場合も先にNotを求めます。
Not ○
この値を評価してから、IfステートメントがTrue/False判定します。
Trueになるのは、文字列"true"または0以外の数値
Falseになるのは、文字列"false"または0
CBoolでエラーになる場合はエラーになる。
きまりは以上です。
これで、問題の数式を見ていきます。
CBool関数は、引数をBoolean型(True,False)に変換します。
式がゼロの値に評価される場合Falseを返し、それ以外の場合はTrueを返します。
CBool関数|VBA関数
数値変換可能なものはCBoolの引数に指定できます、つまりTrue/False判定できます。
論理値Trueは0、Falseは-1に数値変換できます。
その他としては、
Empty ・・・ 0に変換される、つまりFalse
Missing ・・・ 0に変換される、つまりFalse
vbNull ・・・ 1扱い、つまりTrue
CBool("true")→True
If "1" Then
CBool("1")→True
ここまでは良いと思います。
次が問題でしょうか。
"true"は大文字小文字を問いません。
"TRUE"も"True"もTrueになります。
"false"についても同様です。
とても大きな数値、例えば "8888888888" これでも大丈夫です。
指数表記 "10E+3" これも変換可能です。
これが問題ですが、
Not演算子が付いているので"1"は数値変換されて1です。
Not 1
これは、ビット演算なので、
1のNotはFFFE、これは-2
CBool(-2)→True
Notはビット反転します。
Not 0 これは -1 です。
0000 0000
↓
1111 1111 ・・・FF FF
これが -1 を表します。
0000 0001
↓
1111 1110 ・・・FF FE
これが -2 になります。
1111 1101 ・・・FF FD
Emptyは0、Notなので-1
CBool(-1)→True
ということで、すべてTrueなので、
答えは4でした。
リプいただいた皆さんありがとうございました。
Emptyと似た感じの定数で、Missing、Null、vbNull、vbNullStringがあります。
vbNull ・・・ 1扱い、つまりTrue
これらは、この数値として考えた結果と同じになります。
Nullは何をしても答えはNullです。
四則演算しても、Notでも結果はNullです。
Null = Null
これもNullです。
そして、CBoolにNullを指定するとエラーになります。
(ただし正確には空文字""とは違うものです。)
これは数値変換できないのでCBoolではエラーになります。
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説
IFステートメントの判定の最後に
同じテーマ「ツイッター出題回答 」の記事
IFステートメントの判定
日付の謎:IsDateとCDate
ツイッター投稿用に文字数と特定文字で区切る
マクロ記録での色のマイナス数値について
VBAのString型の最大文字数について
Variantの数値型と文字列型の比較
Variant仮引数にRange.Valueを配列で渡す方法
Variant仮引数のByRefとByValの挙動違い
100桁の正の整数値の足し算
「VBA Match関数の限界」についての誤解
VBAで数値を漢数字に変換する方法
新着記事NEW ・・・新着記事一覧を見る
第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方
|生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する!
|生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。