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
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。