Visual Basic 6.0 初級講座 |
第5回 条件判断
プログラムをしていると「もし、・・・の場合はこうして、そうじゃないときはこうする」のように場合に応じて処理を変えたいときがあります。そんなときにつかうのが「条件判断構造(じょうけんはんだんこうぞう)」と呼ばれる物で、これは条件に応じて処理を変える命令や構造のことを指します。VBには条件判断構造として If文(イフ文) と Select文(セレクト 文) が用意されていてどちらもよく使い大変重要です。
この回の要約 ・場合によって処理をわけるときは If文 を使う。
・If文の中で And や Or を使うことで複雑な条件判断ができる。 ・Select Case文を使ってもIf文と同様の条件判断ができる。 |
1.文字列の長さ
まずはテキストボックスに文字が入力されているか判断してみましょう。文字が入力されているかチェックするには入力されている文字数を調べます。文字数が0ならば何も入力されていないことになります。
VBで、文字数を数えるには前回登場したLen関数(レン)を使います。おさらいしておきましょう。たとえば、MsgBox Len("あいうえお")とすると、 「5」 と表示されるのでしたね。それでは、これを利用して入力した文字の数を数えるプログラムを作ってみましょう。
■プログラム1:これから作成するプログラムはこんな感じです。
まず、フォームにコマンドボタンとテキストボックスを1つずつ配置してください。
■画像1:ツールボックス
そして、コマンドボタンをダブルクリックして次のようにコーディングしてください。
Private Sub Command1_Click()
End Sub |
■コード1:テキストボックスに入力された文字数を数えるプログラム
解説しますと、2行目の Dim Moji As String は 文字列型の変数Mojiを使うという宣言でしたね。このことは前に解説していますがわからなくても気にしないで先に進んでください。。3行目の Moji = Text1.Text はテキストボックスに入力された文字をMojiに代入(セット)する命令です。。3行目の MsgBox Len(Moji) はMojiの文字数を表示せよ。という命令です。
それでは実行してみてください。テキストボックスに何か入力してコマンドボタンをクリックすると入力した文字の文字数が表示されます。
文字数を表示させる部分はこれだけで完成です。今度は文字数が0の時に表示されるメッセージを変えてみましょう。今のままではテキストボックスに何も入力しないでコマンドボタンを押すと 「0文字が入力されています。」と表示されます。「0文字入力されている」というのは感覚的にはおかしいですね。これでいいのだといってしまえばそれまでですが、 やはりこの場合は「何も入力されていません」などと表示したいものです。
「文字数が0の場合は」と言うところでいよいよ条件判断構造が登場します。
2.はじめての条件判断
VBで条件を判断するにはIf文(イフ)を使います。If は必ず Then(ゼン)と一緒に使います。使い方は次のような形になります。
If 条件 Then
End If |
If ・・・・・ Then ・・・・・・
で、これはそのまま日本語の
もし ・・・・・・だったら その時は ・・・・・・・・
という意味になります。
今回は 「もし、長さが0だったら」とするのですから
If Len(Moji) = 0 Then
となります。
さらに長さが0だったら 「何も入力されていません」と表示したいのですから、条件判断の部分は次のようにすれば完成です。
If Len(Moji) = 0 Then
MsgBox "何も入力されていません"
End If
3行目のEnd Ifは条件判断の終了を示すものです。もしこれがなければVBはどこからどこまでが条件(今回の例では0文字の時)の場合に実行されるコードなのか判断することができなくなってしまいます。今回は条件(今回の例では0文字の場合)のときに実行されるコードが1行なのでいいですが、このIfとEnd Ifの間には他の部分と同じように何行でも書くことができるのです。
次に、何か入力されているときは今まで通りの表示をさせます。なにか入力されていれば、文字数が0より大きいはずですから、「もし、何か入力されていれば・・・」という条件は「もし、文字数が0より大きければ」となりますから、次のようにすればOKです。
If Len(Moji) > 0 Then
MsgBox Len(Moji) & "文字が入力されています。"
End If
記号 > は算数・数学でもでてきて「左にある物は右にある物より大きい」を表すのでしたね。ここでは使いませんがこの他に < を使用することもできます。「以上」「以下」を使いたい場合はそれぞれ「>=」「<=」とします。これは算数・数学とは少し違います。(算数・数学で「≧」、「≦」を使います)。はまた <> という記号を使うと「・・・じゃないとき」と言う意味が表現できます。
では、改良を加えて完成したプログラムの全体を見てみましょう。
Private Sub Command1_Click()
End Sub |
■コード2:条件によって表示されるメッセージが変わる
実行して試してみてください。
以上で、かんたんな条件判断をするプログラムが完成したわけですが、正直に言うとはじめて If を使う人には少しきついと思います。これは なれるしかありません。がんばってください。
3.その他の場合
今度はクイズを作ります。アメリカの最初の大統領は誰かを答えてもらうものを作りましょう。答えはもちろんジョージ・ワシントン(1732年〜1799年)です。
先ほどと同じようにフォームにテキストボックス(TextBox)とコマンドボタン(Command)とラベル(Label)を1つづつ貼り付けてください。そしてフォームをダブルクリックして、Form_Loadプロシージャに次のように記述してください。
Private Sub Form_Load()
Label1.Caption = "アメリカの初代大統領は?"
End Sub
そして、クイズの答えはあのテキストボックスに書き込んでもらいましょう。答えたらコマンドボタンを押してもらうことにします。もし、答えが「ワシントン」なら「正解」と表示して、それ以外なら「残念でした」と表示することにします。
「もし、こたえがワシントンなら」というところが条件判断なのですね。
この部分はどうやればいいか分かりますか?
If Text1.Text = "ワシントン" Then
MsgBox "正解"
End If
とすればよいのです。ここまでの全コードを下に示します。
Private Sub Command1_Click()
End Sub |
Private Sub Form_Load()
End Sub |
■コード3:正解の場合に「正解」と表示する
ワンポイント コード3にはCommand1_ClickプロシージャとForm_Loadプロシージャがありますがプロシージャには順番がないので、たとえばForm_LoadプロシージャをCommand1_Clickプロシージャより上に書いてもまったく問題ありません。 |
さて、「ワシントン」の場合は・・・ というところは完成しましたが、「その他の場合は・・・」の部分はどうしたらいいでしょうか?
If文 で「その他の場合」を使いたいときには キーワード Else (エルス) を使います。具体的には次のようになります。
If Text1.Text = "ワシントン" Then
MsgBox "正解"
Else
MsgBox "残念でした"
End If
これで、
もし、Text1に入力されているのが「ワシントン」 なら "正解"と表示しなさい。 その他の場合は "残念でした"と表示しなさい。
という意味になります。なかなか便利なElseですね。最初の文字の長さを表示する例でもElseを使えばもっと短くプログラムできます。
それでは、もうお分かりかと思いますが念のためにこの簡単なクイズプログラムの全コードを掲載しておきます。
Private Sub Command1_Click()
End Sub |
Private Sub Form_Load()
End Sub |
■コード4:正解の場合に「正解」、不正解の場合には「残念でした」と表示する。
Elseを使うとその他の場合がすべて一緒にされてしまいますが、その他の場合でも区別したいときがあります。そのためにElse節でもう一度条件判断ができる ElseIf (エルスイフ)が用意されています。
上記の例で回答者が「ワシントン」ではなく2代目大統領のアダムズを回答してしまったときに、少し違うメッセージを表示するには次のようになります。
Private Sub Command1_Click()
End Sub |
Private Sub Form_Load()
End Sub |
ElseIfはいくつでも書くことができますから、この調子ですべての大統領を判断することもできます。ただ、大統領は40人以上いますから本当にプログラムを作るならもっと別の方法をとるでしょう。
なお、1回 If や ElseIf の条件に合致すると処理は End If にジャンプします。そのため、ElseIf で複数の条件に合致する場合でも最初に合致するIf節またはElseIf節しか実行されません。
5.2つ以上の条件
以上で基本的なことは終了しました。今度はもっと複雑な条件判断について説明します。
たとえば、「Kが5 で、 Mが8 の時は・・・」という条件判断です。条件が2つ以上あってもIf文1つで書くことができます。ただし、 この場合「条件の関係」に注意してください。。
条件の関係とは、「Kが5 で Mが8 の時」なのか「Kが5 か Mが8 の時」なのかということです。前者の場合は K=5 と M=8 の両方が成立しているとき ということですが、後者は K=5 か M=8 のどちらかが成立しているとき(両方でも良い)ということになります。
まず、「Kが5 で Mが8 の時」から説明すると、この場合は 条件同士を And (アンド)でつなぎます。
If K = 5 And M = 8 Then ・・・・・ |
のようになります。3つあれば、もう一つ And でつないでください。いくつでもつなげます。
そして、「Kが5 か Mが8 の時」は、条件同士を Or (オア)でつなぎます。
If K = 5 Or M = 8 Then ・・・・・ |
のようになります。この場合も3つ以上つなぐこともできます。
ところで、次のようにしたらどうでしょうか?
If K = 5
Or M = 8 And P = 31
Then
MsgBox "成就されました。" End If |
注意:小中学生へ、「成就」は「じょうじゅ」と読みます。「なしとげる」という意味です。たとえば、「太郎と遊ぶ約束は成就された。」といえば、「太郎と遊ぶ約束が果たされた。」というような意味になります。(これは国語の問題ですね)。
「成就されました。」と表示されるのはどんな場合でしょう?
Or と And の両方が同じ文で使われたときは And の方が強い結合力をしめします。つまり、この例で「成就されました。」と表示されるのは 「k=5 の時」か「M=8 で P=31の時」のどちらかです。(どちらでもいいです)。
この場合を表にまとめると次のようになります。
K = 5 | M = 8 | P = 31 | |
○ | ○ | ○ | 「成就されました。」と表示される。 |
○ | ○ | × | 「成就されました。」と表示される。 |
○ | × | ○ | 「成就されました。」と表示される。 |
○ | × | × | 「成就されました。」と表示される。 |
× | ○ | ○ | 「成就されました。」と表示される。 |
× | ○ | × | (何も表示されない) |
× | × | ○ | (何も表示されない) |
× | × | × | (何も表示されない) |
しかし、結合力は ( )をつけることにより変化させることができます。たとえば、この例に()をつけて下のようにします。
If (K = 5
Or M = 8) And P = 31
Then
MsgBox "成就されました。" End If |
こうすると、「成就されました。」と表示されるのは「K=5 で P=31の時」か「M=8 で P=31の時」のどちらかになります。(どちらでもいいです)。
この場合を表にまとめると次のようになります。
K = 5 | M = 8 | P = 31 | |
○ | ○ | ○ | 「成就されました。」と表示される。 |
○ | ○ | × | (何も表示されない) |
○ | × | ○ | 「成就されました。」と表示される。 |
○ | × | × | (何も表示されない) |
× | ○ | ○ | 「成就されました。」と表示される。 |
× | ○ | × | (何も表示されない) |
× | × | ○ | (何も表示されない) |
× | × | × | (何も表示されない) |
かっこ1つで意味が大きく変わってしまって紛らわしいので特に必要のない場合でもかっこをつけることをお勧めします。たとえば最初の例では次のように書くと良いです。
If K = 5
Or (M = 8 And P = 31)
Then
MsgBox "成就されました。" End If |
6.ネスト
もう1つ複雑な条件判断として「ネスト」というものがあります。やはり 2つ以上の条件がある場合に使います。
上の例では K = 5 で M = 8 が条件の場合は And を使って次のようにプログラムしていました。
If K = 5
And M = 8 Then
MsgBox "条件に合致しました。" End If |
もちろんこれでは正解ですが、「ネスト」という方法を使ってこれと同じことをすると次のようになります。
If K = 5
Then
End If |
これは2つの If文 を「入れ子」のようにして使っているのです。
日本語に翻訳すると次のような意味になります。
もし、K = 5 なら、
もし、 M = 8 なら、
"条件に合致しました。"と表示しなさい
(M = 8 の場合はここまで)
(K = 5 の場合はここまで)
この「入れ子」状の構造を「ネスト」と言います。If文の中でAndで使って条件をくっつけていくよりはネストにしたほうが性能がよくな ります。。また、「ネスト」は If の他にもいろいろでてきますから、今のうちに覚えておきましょう。ネストが特に効果を発揮するのは Forループ の時です。これについては次回解説しますのでお楽しみに。
最後にIf文の他の条件判断構造であるSelect Case(セレクト ケース)を紹介します。
Select Caseは条件によって処理が3つ以上に分かれるときに使うと特に便利ですが、そうでない場合もSelect Caseの方がわかりやすいといってIf文よりもSelect Case文を好んで使う人もいます。
Select Case文はIf文とまったく同じことができます。書き方が違うだけです。
最も単純な使い方は次のようなものです。
Select Case 元となる式
End Select |
Case節 (Case = ケース)はいくつ書いても構いません。Case Else節は省略することができます。1つのCase節が実行されると処理はEnd Selectにジャンプします。つまり、複数のCase節に合致する場合は合致する最初のCase節しか実行されません。
具体例では次のようになります。
Select Case
Text1.Text
End Select |
この例はIf文でElseIfを使って表現することも可能です。
1つのCase節で複数の条件を判断することもできます。
Select Case
Text1.Text
End Select |
この例では、テキストボックスに「ワシントン」または「アダムズ」と入力すると「アメリカの大統領です。」と表示されます。
「ワシントン」または「アダムズ」という条件なのにCase節では Or が使われていないことに注意してください。Case節では単なる , (カンマ)が「または」という意味を表現します。逆に Or を使うと正常に条件判断がされません。(この場合の Or はビット演算を実行します。)
Case節には他にも便利か書き方があるので簡単にサンプルを紹介しておきます。
今日の日付によってメッセージが変わる例です。今日の日付は Day(Now) で取得できます。
たとえば、6月27日 は Day(Now) は 27 を返します。
Select Case
Day(Now)
End Select |
なお、さらに詳しいSelect文の解説はこちらをご覧下さい。