ツイッター出題回答
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のお題です。エクセルにおける日付のちょっと不思議な挙動についての、ちょっと変わった、ちょっと意地悪な問題です。お題のツイート https://twitter.com/yamaoka_ss/status/1271776939343110146 【VBA問題】 画像のVBAはエラーになる事がある…
ツイッター投稿用に文字数と特定文字で区切る
ツイッターで出したVBAのお題です。ツイッター投稿には文字数制限がありますので、セルに入れた下書き文章をツイート用に区切る問題です。お題のツイート https://twitter.com/yamaoka_ss/status/1272033174575407105 【エクセルお題】 ツイートの下書きをA1セルに入れて…
マクロ記録での色のマイナス数値について
ツイッターで出したVBAのお題です。マクロの記録で文字色などの色を指定するとマイナス数値で記録される場合がありますが、このマイナス数値は何かを問う問題です。お題のツイート https://twitter.com/yamaoka_ss/status/1272119270026051587 【エクセル問題】 マクロの記…
VBAのString型の最大文字数について
ツイッターで出したVBAのお題です。String型はVBAリファレンスでは、「可変長文字列は、最大で約20億(2^31)文字を格納できます。」と書かれています。これについて、本当は何文字まではいるのかについての問題です。
Variantの数値型と文字列型の比較
ツイッターで出したVBAのお題です。Variant型は、どんなデータ型も入れることができます。具体的なデータ型の代わりに使用することで、より柔軟にVBA記述ができるようになります。ただしその一方で、少々特殊な挙動もあり、使いこなすにはそれなりの知識が必要になる場合もあります。
Variant仮引数にRange.Valueを配列で渡す方法
ツイッターで出したVBAのお題です。Variant型は、どんなデータ型も受け入れることができます。RangeオブジェクトのValueを配列で受け取るにはVariant変数が必要です。ただし、実引数にRangeオブジェクトを直接指定する場合には注意が必要です。
Variant仮引数のByRefとByValの挙動違い
ツイッターで出したVBAのお題です。Variant型は、どんなデータ型も入れることができてしまいます。具体的なデータ型の代わりに使用することで、より柔軟にVBA記述ができるようになります。ただしこの便利さゆえに、逆に注意しなければならない挙動もあります。
100桁の正の整数値の足し算
ツイッターで出したVBAのお題です。数の単位に「無量大数」というものがあります。VBAでこの無量大数の足し算をするにはどうしたら良いでしょうか。そこで、100桁の正の整数の足し算をVBAで実現してみましょう。
「VBA Match関数の限界」についての誤解
ツイッターで出したVBAのお題です。発端はエゴサーチからです。(笑) 「教えて!goo」で引用されていたのを見つけました。あちこちで引用されているのは見かけることはあるのですが、以下ではよく言うディスられているような文章を見かけました。
VBAで数値を漢数字に変換する方法
ツイッターで出したVBAのお題です。算用数字を漢数字に変換するVBAです。滅多に必要になるものではないのに、なぜこんな問題を出したかと言うと、最近シリーズで書き始めた「Excel将棋」で必要になったからです。


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

ブール型(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)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




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


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


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