Lesson5 その他のフロー制御構文

 これまで、Lesson3でIf...Then...Elseステートメント、Lesson4でFor...Nextステートメントという2つのフロー制御ステートメントについて述べましたが、このLesson5ではVBSで用いられるそのほかのフロー制御文について述べたいと思います。

 前に述べたこの2つの構文は、非常に重要で、この2つがあれば基本的に他のフロー制御構文を使わなくてもなんとかなります。しかし、実際にスクリプトを組むときは、これらの構文では不便なことがあります。そこでこのLessonでは

条件制御としてIf...Then...Elseステートメントに続いてSelect Caseステートメントを
ループ制御としてFor...Nextステートメントに続いてDo...Loopステートメントを

紹介していきたいと思います。

まずは次のスクリプトをご覧ください。 このスクリプトは、Select Caseステートメントを使った、「おみくじスクリプト」です。

Rem おみくじスクリプト
Dim intNumber
Const Title="今日の運勢" '(1)メッセージボックスのタイトルを決める
Randomize '(2)乱数を初期化
intNumber=Int(Rnd*10) '(3)intNumberに0から9の数字を入れる
Select Case intNumber '(4)Select Case文ここから
	Case 0 '(5)intNumberが0のとき
		MsgBox "大吉",,Title
	Case 1,2 '(6)intNumberが1か2のとき
		MsgBox "中吉",,Title
	Case 3,4,5
		MsgBox "小吉",,Title
	Case 6
		MsgBox "末吉",,Title
	Case 7,8
		MsgBox "凶",,Title
	Case Else '(7)intNumberが他の値の時
		MsgBox "大凶",,Title
End Select '(8)Select Case文の終わり

 このスクリプトの説明に入る前に、「VBSのコードを書く上で、実行には直接影響しないが、知っておくと便利なことがら」を紹介したいと思います。

コメント行

 コメント行とは、その名の通り、コード中に入れるコメントで、スクリプトを後で見直したときに参考になるように書いておくものです。VBSでは上のように、' (シングルクォーテーション)を書くと、それより右の文字がコメントとなります。このようにして書いたコメントは、実行するときには何の影響も及ぼしません。
 また、

Rem これはコメントです

のようにRemステートメントを用いても、コメント扱いになります。

改行

 VBSのコードは通常、行の順番通りに実行されていきますが、下のように: (コロン)を入れるとそれが改行とみなされ、複数行の内容を一行に記述できます。

A = 1 : B = 2 : C = 3
MsgBox A + B + C

逆に、一行が長すぎて見にくいときは、 _ (スペース+アンダースコア)を行の最後に入れると、それは改行とは見なされないため、複数行に一行の内容を記述できます。

MsgBox "このようにメッセージボックスの引数を複数行に分けて記述できます。", _
vbOKOnly, _
"アンダースコア使用例"

 では本題に入りましょう。まず(1)でConst ステートメントで、後で表示するメッセージボックスのタイトルを定数として宣言しています。VBSの定数についてはLesson3で既に解説しましたが、このようにConstを使うと、自分で定数を宣言することもできるのです。ここではTitleという定数に"今日の運勢"という文字列を入れています。こうしておくと、後でMsgBoxの行を書くとき、いちいち"今日の運勢"と書かずにすみます。

 (2)ではRandomizeステートメントで乱数を初期化しています。これは次の行で登場するRnd関数を使うためには欠かせない文です。乱数とは、文字通り何の脈絡もない、でたらめな数字の集合のことです。Randomizeステートメントを実行すると、コンピュータが現在の時刻を元にして乱数を生成してくれます。
 このように生成した乱数を(3)で、Rnd関数を用いて呼び出しています。
 Rnd関数は、0以上1未満の乱数を返します。よって、Rnd*10 (*は「かける」という意味) では0以上10未満の数を表していることになります。この数字は小数を含む数字ですが、Int関数を使うと、小数部分を切り捨て、整数部分だけを返してくれます。
 まとめると、Rnd関数でたとえば0.2341345 という数が得られたとします。この時Rnd*10は 2.341345 となり、さらにInt(Rnd*10) とすることで小数部分を切り捨て、2 を返します。よって、この場合 intNumberには2という整数が代入されることになります。

 このようにするとintNumberには0から9のどれかの整数が入っていることになります。このintNumberの値によって、あなたの今日の運勢を占ってみましょう。

 まず(4)で、Select Case ステートメントを記述しています。これから、intNumberという変数に、どんな数が入っているか、評価しますよ、という宣言です。
 以下、Case 何とか、という文が続きますが、これはintNumberが何とかならば、下の行を実行する、という意味です。たとえば、intNumberが0だった場合は、Case 0となるので、この下のMsgBox関数によって、「大吉」というメッセージが表示されます。またその次の行(6)では、Case 1,2とありますが、これは「intNumberが1か2の場合」という意味で、このようにカンマで区切って二つ以上の場合を記述することもできます
 また、Case の行に関しては、

Case 0 MsgBox "大吉",,Title

のように1行で記述することも可能です。 
 (7)でCase Else とありますが、これは、「今まで記述したCaseのどれにも当てはまらない場合」に実行されます。この場合では、ここまででintNumberが0から8までの場合を網羅していますので、intNumberが9の場合が当てはまります。ので、Case 9と書いても同じことになります。
 最後に(8)でEnd Select と書いてSelect Case文を終わらせています。

 上の例で、Select Case 文の代わりにIf文を使うとどうなるでしょうか。

If intNumber=0 Then
	MsgBox "大吉",,Title
ElseIf intNumber=1 Or intNumber=2 Then
	MsgBox "中吉",,Title
ElseIf .....		

Else
	MsgBox "大凶",,Title
End If

と、このようにIf文でも書けますが、intNumberという文字を大量に書かないといけません。このような同一変数の値を評価する場合は、Select Case文の方が便利です。

 次に、Do...Loop文の例を挙げます。

Dim intNumber
intNumber=1
MsgBox "1という数字を倍々にしていったとき、最初に10000を越える値はいくつでしょう?"
Do While intNumber<=10000
	intNumber=intNumber*2
Loop 
MsgBox "1を倍々にすると" &  intNumber & "で、はじめて10000を越えます。"

 これは、1という数を倍々にしていったとき、最初に10000を突破する値はいくつか、を求めるものです。
 Do と Loopの間の行を繰り返し実行する、というのがDo...Loopステートメントの基本です。この例では、intNumberを2倍する、という内容を繰り返していることになります。しかし、永遠に繰り返しても意味がないので、何らかの方法でループを中断させる必要があります。そこでDo While 何とか、のように指定することで、「While以下の条件が成り立つ間ループを続ける」というようにループを続ける条件を決めることができます。この例では、intNumberが10000以下の間、ループを繰り返す、という意味になります。
 また、Do...Loopステートメントの部分を次のようにも書くことができます。

Do Until intNumber>10000
	intNumber=intNumber*2
Loop 

 こうすると、intNumberが10000を越えるまでループを繰り返す、という意味になり、同じ結果になります。
 また、While や Until は上のように Doの直後に書くことも、Loop の直後に書くこともできます。
 Do...Loopだと、For文の時のようにIf文を併用しなくてもループを脱出することができ、コードが簡略化されます。下のようにしてループを脱出させることもできます。

Do
	intNumber=intNumber*2
	If intNumber>10000 Then Exit Do
Loop 

 While や Untilなどでは記述できないような、複雑な条件分岐が必要なときは、このようにしてIf文を併用してExit Doでループを抜けるようにするとよいでしょう。

 ところで、Do...Loop文を利用するときは、これらの例のように、必ずループを脱出する道を用意してください。さもないと、DoとLoopの間が永遠に繰り返されるという、無限ループに陥ってしまいます。(もし無限ループに陥ってしまった場合の解決法については、ここをご覧ください)

 また、ループ制御文には他にWhile...Wendステートメントというのもありますが、Do...Loopさえ覚えておけば、いらないと思います。

 なお、今回登場したSelect CaseとDo...Loop構文を含めて、すべてのフロー制御ステートメントはネストが可能です。


 今回は、Select CaseとDo...Loopの2つのフロー制御ステートメントについて解説しました。これでLesson3から始まったフロー制御ステートメントの説明は一応終わりです。よく復習しておきましょう(笑)
 次は、サブルーチンのお話です。


Home Up Back Next