エクセル雑感
IFステートメントの判定

ExcelマクロVBAとエクセル関数についての私的雑感
最終更新日: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ステートメントやSelectCaseに出くわします。




同じテーマ「エクセル雑感」の記事

時間に関する関数の扱い方
COUNTIF関数の結果は?
【超難問】エクセル数式問題
IFステートメントの判定
日付の謎:IsDateとCDate
ツイッター投稿用に文字数と特定文字で区切る
マクロ記録での色のマイナス数値について
VBAのString型の最大文字数について
Variantの数値型と文字列型の比較
Variant仮引数にRange.Valueを配列で渡す方法
Variant仮引数のByRefとByValの挙動違い


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

将棋とプログラミングについて~そこには型がある~|エクセル雑感(11月22日)
VBA100本ノック 30本目:名札作成(段組み)|VBA練習問題(11月22日)
VBA100本ノック 29本目:画像の挿入|VBA練習問題(11月21日)
VBA100本ノック 28本目:シートをブックに分割|VBA練習問題(11月19日)
VBA100本ノック 27本目:ハイパーリンクのURL|VBA練習問題(11月18日)
VBA100本ノック 26本目:ファイル一覧作成|VBA練習問題(11月17日)
VBA100本ノック 25本目:マトリック表をDB形式に変換|VBA練習問題(11月15日)
VBA100本ノック 24本目:全角英数のみ半角|VBA練習問題(11月14日)
VBA100本ノック 23本目:シート構成の一致確認|VBA練習問題(11月13日)
VBA100本ノック 22本目:FizzBuzz発展問題|VBA練習問題(11月12日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



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