スクリプトを書いていて、ある条件ではAというコードを、別の条件ではBというコードを実行させたい、つまり条件分岐をさせたいケースが多々ある。そこで登場するのがIf〜Then〜Elseステートメントだ。実例で使い方を具体的に説明していこう。
Option Explicit
Dim x, y
x = 5
y = 3
If x > y Then MsgBox x & "は" & y & "より大きい。"
ここではIf〜Then〜Elseステートメントを用いて、xとyの大小を確認している。Ifの後に条件を書くと、その条件が満たされるとき(真、Trueであるとき)、Thenの後のステートメントが実行される。この例では、条件に「x > y」を指定しているが、これは「xがyより大きい」という意味である。全体として、「xがyより大きければ、メッセージ・ボックスを表示する」という意味になる。ここではxに5、yに3を代入しており、条件「x > y」は真になるので、メッセージ・ボックスが表示される。
ここで、xとyの値を逆にすれば、すなわちxに3、yに5を代入すれば、条件「x > y」は満たされなくなり(偽、Falseとなる)、メッセージ・ボックスは表示されなくなるので試してもらいたい。
なお、「より大きい」を意味する「>」は比較演算子という。ほかの比較演算子には次のようなものがある。
比較演算子 | 意味 |
---|---|
< | より小さい |
<= | 以下 |
> | より大きい |
>= | 以上 |
= | 等しい |
<> | 等しくない |
比較演算子 |
同じ条件式を使って、今度はxとyの値の大小によって、異なったメッセージを表示する例を考えよう。
Option Explicit
Dim x, y
x = 5
y = 3
If x > y Then MsgBox x & "は" & y & "より大きい。" Else MsgBox x & "は" & y & "以下だ。"
このようにIf〜Then〜Elseステートメントを使うと、条件式「x > y」が成り立つ場合は、Thenの後の文が実行される。条件式が成り立たない場合(x <= y の場合)はElseの後の文が実行される。この場合、xはyより大きいので「5は3より大きい。」というメッセージ・ボックスが表示されることになる。
この例で、xとyの値を入れ替えると(x=3、y=5とすると)、「3は5以下だ。」というメッセージ・ボックスが表示されることが分かる。
なお、このコードは「ブロック形式の構文」というものを用いると、次のように書き直せる。
Option Explicit
Dim x, y
x = 5
y = 3
If x > y Then
MsgBox x & "は" & y & "より大きい。"
Else
MsgBox x & "は" & y & "以下だ。"
End If
前のように、1行に複数の要素を詰め込むより、ブロック形式で表記した方がコードを見やすいことがお分かりいただけるかと思う。ブロック形式を使うときは、最後にEnd Ifでステートメントを閉じる必要がある。なお、ブロック形式を使うときは、この例のようにタブや半角スペースで文(ここではMsgBox関数の文)の行頭を字下げすることで、より読みやすいコードが記述できる。
今度は、ユーザーの入力内容によってコードを分岐させる例を見ていこう。
Option Explicit
'MsgBox関数の戻り値を格納する変数
Dim Msg
'MsgBoxのダイアログ・タイトルを示す定数
Const TITLE = "ダイアログ・クイズ"
'MsgBox関数の戻り値がMsgという変数に代入される
Msg = MsgBox("「アルプスの少女○○ジ」○○のところになにがくる?", vbQuestion + vbYesNoCancel, TITLE)
If Msg = vbYes Then 'もしMsgがvbYesなら
MsgBox "正解!たいしたもんだ。" , vbInformation, TITLE
ElseIf Msg = vbNo Then 'もしMsgがvbNoなら
MsgBox "ブー!「アルプスの少女イイエジ」ってことはないだろ。" , vbCritical, TITLE
Else 'それ以外の場合なら
MsgBox "キャンセルを押しました。" ,vbExclamation, TITLE
End If
本題に入る前に、ここで2つのことを説明しておく。1つは、2行目などで用いている「コメント行」である。コード中に何かコメント(コード上には記載するが、実行には影響しない文字列)を記述しておきたいときは、'(シングル・クオーテーション)を書き、その後に記述する。これは本文中のどこにでも使え、' から改行(その行の最後。行末)まではコメントと見なされ実行はされない。2行目のようにコメントだけの行があってもいい。コメントは、何をするコードなのかという説明などのメモに使うことが多い。
もう1つは、5行目「Const TITLE = "ダイアログ・クイズ" 」というところで、Constステートメントを用いて定数を定義している点である。ここではTITLEという定数を「ダイアログ・クイズ」という文字列になるように定義している。この文字列は後で何回も呼び出すので、1度定義してしまえば同じ文字列を何度も書かなくて済むという利点がある。
定数と変数の使い分けだが、コードの途中で値を変更しないものは定数、代入などによって値が変わり得るものは変数として宣言するのがよい。
本題に戻って、8行目でMsgBox関数の戻り値をMsgという変数に代入している。ここでMsgBox関数のヘルプを引くと、次のような記述がある。
MsgBox(prompt[, buttons][, title][, helpfile, context])
Inputbox関数のときと読み方は同様だが、これを見ると、省略は可能だが第2引数にダイアログに表示するボタンを指定できることが分かる。その後にダイアログ・タイトルを指定する引数もある。今回はこれらを使っている。
「MsgBox("「アルプスの少女○○ジ」○○のところになにがくる?", vbQuestion + vbYesNoCancel,TITLE)」のように、第2引数のメッセージ・ボックスに「?」マーク(問い合わせメッセージ・アイコン)を出すという意味の定数vbQuestionと「はい」「いいえ」「キャンセル」の3つのボタンを表示させるという意味の定数vbYesNoCancelの合計を指定している。合計を指定することで、それぞれの定数が指定する外観を同時に指定したことになる。またダイアログ・タイトルには、先ほど宣言した定数TITLEを指定する。これにより、表示されるメッセージ・ボックスは次のようなものになる。
このメッセージ・ボックスで押したボタンの種類が、MsgBox関数の戻り値となる。具体的には「はい」をクリックすると6、「いいえ」をクリックすると7、「キャンセル」をクリックすると2が戻り値となる。が、これらの数字はそれぞれvbYes、vbNo、vbCancelという定数で定義されているので、実際の値は知らなくてもコードを記述できる。
これらの戻り値によって、次に表示させる結果のメッセージ・ボックスを分岐させるのに、If〜Then〜Elseステートメントを用いている。
最初のIfの後の条件式“Msg = vbYes”が真の場合、1つ目のThen以下のステートメントが実行される。ここで用いられる比較演算子(=)は、算数の = と同じ意味で、「MsgとvbYesが等しい」という意味である。比較演算子(=)は、前回説明した代入演算子(=)と同じ記号だが、意味が違う点に注意していただきたい。もしMsg = vbYesではない場合は、次のElseIfの後の条件式Msg = vbNoが評価される。これが真の場合、2つ目のステートメントが実行される。さらにvbYesでもvbNoでもなかった場合(vbCancelの場合は)、Elseの後のステートメントが実行されるというわけである。Elseはどの「If」にも「ElseIf」にも掛からなかった場合実行されるという意味なのだが、今回のようにどの値か分かっている場合は、「ElseIf Msg = vbCancel Then」と記述してもよい。
結果を表示させるためのMsgBox関数の第2引数には、それぞれvbInformation(情報メッセージ・アイコン)、vbCritical(警告メッセージ・アイコン)、vbExclamation(注意メッセージ・アイコン)を指定して、それぞれのアイコンを表示している。MsgBox関数のほかの定数についてはヘルプを参照してもらいたい。
If〜Then〜Elseステートメントを使いこなすために、次のような例題を考えてみてもらいたい。人間の肥満度を示すBMI(Body Mass Index)というものがある。BMIは体重(kg単位)を身長(m単位)の2乗(2回掛け合わせたもの)で割ったものであり、BMIが25以上の場合を肥満、BMIが18以下の場合をやせ、そのほかの場合は標準的であるとするものである。ここではInputBox関数を使って、ユーザーに身長と体重を入力させ、BMIを求める。そして、その値が肥満かやせか標準かを判定し、結果を表示するスクリプトを書いてみよう。
マーカーで隠れたところを選択してチェックしてみよう。
Option Explicit
Dim Height, Weight, BMI
Const TITLE = "BMI肥満度チェック"
'身長と体重を入力する
Height = InputBox("あなたの身長をm単位で入力してください。", TITLE)
Weight = InputBox("あなたの体重をkg単位で入力してください。", TITLE)
'BMIを求める
BMI = Weight / (Height * Height)
'BMIから肥満度を判定する
If BMI >= 25 Then
MsgBox "あなたは、肥満です。BMI=" & BMI, vbExclamation, TITLE
ElseIf BMI <= 18 Then
MsgBox "あなたは、やせです。BMI=" & BMI, vbExclamation, TITLE
Else
MsgBox "あなたは、標準です。BMI=" & BMI, vbInformation, TITLE
End If
6行目と7行目でInputBox関数を用い、身長と体重を入力させ、それぞれ変数に値を代入している。10行目ではBMIを定義に従って計算している。なお、/ と * の計算の優先順位は同じであるため、*を先に計算させるために( )を使っていることに注意してもらいたい。そして13行目からIf〜Then〜Elseステートメントを用い、計算したBMIの値によって条件分岐している。
このスクリプトを実行すると、入力ダイアログが2回表示されるが、いずれも数値を入力するようにする。さもないと「型が一致しません」というエラーが発生してしまう。なお、このエラーの回避方法については次回以降に述べる予定である。
今回は算術演算子を用いた計算、If〜Then〜Elseステートメントを用いた条件分岐の方法について説明した。次回は、InputBox関数とMsgBox関数以外の関数を取り上げながら、VBScriptのもう少し高度な使い方を説明する予定である。
Copyright© Digital Advantage Corp. All Rights Reserved.