等号、不等号、大小記号がないIfステートメント

ベテランの方が書いたIfステートメントで時々見ませんか?
普通のIfステートメントはIf A = B Thenというように書きますよね。 これを、If A Thenのような書き方を見たことはありませんか?
まあ、見なくても良いのですが、Ifステートメントの「Then側」と「Else側」は何によって区分けされているのかを確認して見ましょう。
If A Thenのような書き方は推奨することはありませんが、なぜこういう書き方ができるのかを知ることは別のケースで役に立ちます。



Ifステートメントの選択肢は「はい()」か「いいえ()」だけです。
ElseIfなどという書き方はありますが、これはElse側での再質問です。
Ifステートメントでは、判断文を書いて、正しければ「Then側」の処理、正しくなければ「Else側」の処理が行なわれるくらいのことは VBA初心者の段階で皆さんがご存じのことです。ですが、ここで話題にしたいのは、「正しければ」の「正しい」という「値」を理解されているか?ということです。
「コンピュータは2進数で動いているのだから、きっと1が正しくて、0が正しくないのだろう。」なんて思っている方があると思いますが、結構その考え方で近いようです。
「正しければ」の「正しい」という「値」を見てみましょう。
簡単なIfステートメントのサンプルを作ってみます。

Option Explicit

' 普通のIfステートメント 
Sub TEST1() 
    Dim A As Integer
    Dim B As Integer

    A = 1
    B = 1
    If A = B Then
        MsgBox "AとBは等しい"
    Else
        MsgBox "AとBは等しくない"
    End If
End Sub
このサンプルを動かすと、当然ですが、
「AとBは等しい」
とメッセージが表示されます。

ではここで、その「値」を次のようなサンプルに変えて見てみます。

Option Explicit

' 「正しい」の値? 
Sub TEST2() 
    Dim A As Integer
    Dim B As Integer

    A = 1
    B = 1
    MsgBox A = B
End Sub
これを動かしてみると、
「True」
このように表示されました。これが「正しい」の値なのです。

ついでですから、「正しくない」の値も見ておきます。

Option Explicit

' 「正しくない」の値? 
Sub TEST3() 
    Dim A As Integer
    Dim B As Integer

    A = 1
    B = 9
    MsgBox A = B
End Sub
このようにして動かせば良いわけです。
「False」
となりました。
一応、混乱しないように先に説明しておきますが、これらは「"True"」、「"False"」という文字列ではありません。 表示上では「True」、「False」という文字で表示されますが、これは実際には「ブール(Boolean)型」というデータ型でTrueFalseのどちらかしかありえないデータ型です。

Option Explicit

' 「正しい」「正しくない」のデータ型 
Sub TEST4() 
    Dim A As Integer
    Dim B As Integer

    A = 1
    B = 9
    MsgBox TypeName(A = B)
End Sub
「Boolean」

If A = 1 Or 2 Then」は常に「True」になる。
視覚的に「True」、「False」と言われても、スッキリしません。その「中身」を見てみたいものです。

Option Explicit

' Orを使った間違いのサンプル 
Sub TEST5() 
    Dim A As Integer

    A = 3
    If A = 1 Or 2 Then
        MsgBox "Aは1か2のどちらかだ"
    Else
        MsgBox "Aは1でも2でもない"
    End If
End Sub
では、このサンプルはどうでしょう。COBOLなどではこの書き方で正しく動作しますが、VBVBAではエラーにはならないものの、
「Aは1か2のどちらかだ」
となってしまいます。これはマクロを書く上で大きな問題になる場合がありますから、ここで「True」、「False」が一体何なのでろうということを考えるのが意味を持つことになります。
ここでは、Ifステートメントが結果をTrueだと判断したのですが、これはOrで区切られた2つの判断要素のいずれかがTrueだったことになります。
Orの左側のA = 1ではないわけですから、Orの右側の2がヒットしたことになります。
本来、この判断文は、本当は、

    If A = 1 Or A = 2 Then
と書かなければなりません。 これを、

    If A = 1 Or 2 Then
と書いた場合は、Orの右側だけを取り出した場合、

    If 2 Then
これを判断していることになります。
では、2Trueなのかが問題ですね。型変換関数で調べてみましょう。

Option Explicit

' 「2」は「True」なのか 
Sub TEST6() 
    MsgBox CBool(2)
End Sub
これを動かしてみると、
「True」
このように表示されました。つまり、2Trueということになります。

ヘルプで確認すると、「他の数値型をブール型の値に変換すると、0 は偽 (False) になり、0 以外の値はすべて真 (True) になります。一方、ブール型の値を他のデータ型に変換すると、偽 (False)0、真 (True)-1 になります。」と説明されています。
ベテランの方で、

    If A <> 0 Then
と書くべきところを、

    If A Then
0 以外の値はすべて真 (True)」を利用してこのように書く人がいるわけです。 但し、このことを熟知していない人が見ても理解しにくいコードですから、このような書き方はお勧めしません。