条件分岐のための、流れ制御命令文
構文:
If expression Then [statement(s)] [Else [statement(s)]] [End If]
または
If expression Then : [statement(s)] [Else [statement(s)]] : End If
または
If expression Then
[statement(s)]
[ Elseif expression Then ]
[statement(s)]
[ Else ]
[statement(s)]
End If
備考: QB のような
EndIf (空白なし)も、下位互換のためサポートされています。
記述:
If...Then は、条件により、処理を決定する方法です。
If...Then は、状態が true の場合にだけコードを実行する仕組みです。多くの条件に対応させて、実行する代替コードを指定できます:
- 条件が真ならば、Then 直後のコードを実行します。
- 条件が真ならば、Then 直後の特定のコードを実行し、偽ならば、Else 直後の他のコードを実行します。
- 最初の条件が偽の場合は、Elseif を使って、他の条件をテストします。
expression は、いくつかの形式の一つが、使えます:
- 条件式、例:
x = 5
- 論理的ビット演算子で区切られる、複数の条件、例:
- 論理的な短絡演算子で区切られた、複数の条件、例:
y <> 0 AndAlso x \ y = 1
(この場合、"
x \ y = 1" は、"
y <> 0" が True のときだけ、評価されます。)
- あらゆる数式で、値がゼロ (0) の場合に False を表し、値か非ゼロの場合は True を表します。
複数行の構文も、単行の構文も、どちらもも、
If を入れ子にできます。
単行の構文で、
End If は、入れ子にされた
If がどこで始まって、終わるかを制御するために、役立ちます。
複数行の構文では、複数の
Elseif(ただし、
Else の後には何もない)を使えます。そして、テストは入れ子にできます(この場合、
If と同数の
End If が必要です)。
If の条件が真でない場合、
Elseif ブロックの条件が続けてテストされます:
- これらのいずれかが真であれば、対応するコードが実行されます。そして、プログラムは次のブロックをスキップして、End If の後に続きます。
- どれも真でない場合、Else(があれば)に続くコードは単独で実行されます。
-lang fb と
-lang fblite 方言では、単行で、コロン (
:) を、改行の代わりに使って、複数行
If ブロックを構成できます。
注意: If...Then Goto のショートカットとしての、一行
If...Goto 構文は、廃止され、QBとの互換性のためにのみ存在します。
例:
'' これは、判定で、1行、ただし、コロン(:)で拡張された複数のステートメントの
'' if...then を使う単純な「平方根を計算する」コードです。
Dim As Double d , r
r = -1
d = 2
'd = -3
If d > 0 Then r = Sqr(d) : Print d; " の平方根は:" Else r = 0 : Print "square root not computed:"
Print r
Sleep
'' これは、決定に if...then を使った「数を推測する」簡単なゲームです。
Dim As Integer num, guess
Randomize
num = Int(Rnd * 10) + 1 '1から10の間の乱数を作成します...
Print "1〜10の数を推測します (CTRL-C で中断します)"
Do '繰り返しを開始
Input "Guess"; guess 'ユーザが推測した数を入力します
If guess > 10 OrElse guess < 1 Then '入力した数が、範囲外
Print "入力する数は、10を超えても、1未満でも、ダメです!"
ElseIf guess > num Then 'ユーザの推測値が大きすぎます
Print "大きすぎです"
ElseIf guess < num Then 'ユーザの推測値が小さすぎます
Print "小さすぎです"
Else 'ユーザは、正しい数を推測しました!
Print "正解!"
Exit Do '繰り返しを出ます
End If
Loop '繰り返しの初めに戻ります
Sleep
方言差:
-
-lang qb と -lang fblite 方言では、If..Then ブロック内で宣言される変数は、QB の場合のように、手続き全体の scope を持ちます。
-
-lang fb と -lang deprecated 方言では、If..Then ブロック内で宣言される変数は、ブロック内だけで見えて、その外でアクセスできません。
このブロックの外側でグローバルとして定義された重複シンボルにアクセスするには、プレフィックスとして 1つまたはできれば 2つの点を追加します: .SomeSymbol またはできれば ..SomeSymbol ( With..End With ブロック内の場合は ..SomeSymbol のみ)。
-
-lang qb 方言で、新しい行か、THEN の直後に単行コメント (') があれば、IF は、複数行です。
コロン (:)、Rem または他の命令文が来ると、単行 IF になります。
-
-lang fb と -lang fblite 方言で、新しい行か、単行コメント (')か、コロン (:)か、THEN 直後の Rem 命令文があれば、その時、 IF は、複数行です。
その他の命令文なら、単行 IF になります。
QBからの違い:
- END IF は、QBASIC の単行 IF でサポートされませんでした。
参照: