Visual Basic 初級講座 |
Visual Basic 中学校 > 初級講座 >
第6回 条件判断
プログラムをしていると「もし、・・・の場合はこうして、そうじゃないときはこうする」のように場合に応じて処理を変えたいときがあります。そんなときにつかうのが「条件判断構造(じょうけんはんだんこうぞう)」と呼ばれる物で、これは条件に応じて処理を変える命令や構造のことを指します。VBには条件判断構造として If文(イフ文) と Select文(セレクト 文) が用意されていてどちらもよく使い大変重要です。
この回の要約 ・場合によって処理をわけるときは If文 を使う。
・If文の中で AndAlso や OrElse を使うことで複雑な条件判断ができる。 ・Select Case文を使ってもIf文と同様の条件判断ができる。 |
1.文字列の長さ
まずはテキストボックスに文字が入力されているか判断してみましょう。文字が入力されているかチェックするには入力されている文字数を調べます。文字数が0ならば何も入力されていないことになります。
VBで、文字数を数えるには前回登場したLen関数(レン)を使います。おさらいしておきましょう。たとえば、MsgBox(Len("あいうえお"))とすると、 「5」 と表示されるのでしたね。それでは、これを利用して入力した文字の数を数えるプログラムを作ってみましょう。
■プログラム1:これから作成するプログラムはこんな感じです。
まず、フォームにボタン(Button)とテキストボックス(TextBox)を1つずつ配置してください。
そして、ボタンをダブルクリックしてClickイベントプロシージャに次のようにコーディングしてください。
Private
Sub Button1_Click(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles Button1.Click Dim Moji As String Moji = TextBox1.Text MsgBox(Len(Moji) & "文字が入力されています。") End Sub |
■リスト1:テキストボックスに入力された文字数を数えるプログラム
解説しますと、2行目の Dim Moji As String は 文字列型の変数Mojiを使うという宣言でしたね。このことは前に解説していますがわからなくても気にしないで先に進んでください。。3行目の Moji = TextBox1.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 |
■リスト2
3行目のEnd Ifは条件判断の終了を示すものです。もしこれがなければVBはどこからどこまでが条件(今回の例では0文字の時)の場合に実行されるコードなのか判断することができなくなってしまいます。今回は条件(今回の例では0文字の場合)のときに実行されるコードが1行なのでいいですが、このIfとEnd Ifの間には他の部分と同じように何行でも書くことができるのです。
次に、何か入力されているときは今まで通りの表示をさせます。なにか入力されていれば、文字数が0より大きいはずですから、「もし、何か入力されていれば・・・」という条件は「もし、文字数が0より大きければ」となりますから、次のようにすればOKです。
If
Len(Moji) > 0 Then MsgBox(Len(Moji) & "文字が入力されています。") End If |
■リスト3
記号 > は算数・数学でもでてきて「左にある物は右にある物より大きい」を表すのでしたね。ここでは使いませんがこの他に < を使用することもできます。「以上」「以下」を使いたい場合はそれぞれ「>=」「<=」とします。これは算数・数学とは少し違います。(算数・数学で は「≧」、「≦」を使います)。はまた <> という記号を使うと「・・・じゃないとき」と言う意味が表現できます。
では、改良を加えて完成したプログラムの全体を見てみましょう。
Private
Sub Button1_Click(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles Button1.Click Dim Moji As String Moji = TextBox1.Text If Len(Moji) = 0 Then MsgBox("何も入力されていません") End If If Len(Moji) > 0 Then MsgBox(Len(Moji) & "文字が入力されています。") End If End Sub |
■リスト4:条件によって表示されるメッセージが変わる
実行して試してみてください。
以上で、かんたんな条件判断をするプログラムが完成したわけですが、正直に言うとはじめて If を使う人には少しきついと思います。これは なれるしかありません。がんばってください。
3.その他の場合
今度はクイズを作ります。アメリカの最初の大統領は誰かを答えてもらうものを作りましょう。答えはもちろんジョージ・ワシントン(1732年〜1799年)です。
先ほどと同じようにフォームにテキストボックス(TextBox)とボタン(Button)、それにラベル(Label)を1つづつ貼り付けてください。そしてフォームをダブルクリックして、Loadイベントプロシージャに次のように記述してください。Loadイベントはフォームが開始されるときに自動的に発生するイベントです。
Private
Sub Form1_Load(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles MyBase.Load Label1.Text = "アメリカの初代大統領は?" End Sub |
■リスト5
そして、クイズの答えはあのテキストボックスに書き込んでもらいましょう。答えたらボタンを押してもらうことにします。もし、答えが「ワシントン」なら「正解」と表示して、それ以外なら「残念でした」と表示することにします。
「もし、こたえがワシントンなら」というところが条件判断なのですね。
この部分はどうやればいいか分かりますか? 次のようにすればよいのです。
Private
Sub Button1_Click(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles Button1.Click If TextBox1.Text = "ワシントン" Then MsgBox("正解") End If End Sub |
■リスト6
ここまでの全コードを下に示します。
Private
Sub Button1_Click(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles Button1.Click If TextBox1.Text = "ワシントン" Then MsgBox("正解") End If End Sub |
Private
Sub Form1_Load(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles MyBase.Load Label1.Text = "アメリカの初代大統領は?" End Sub |
■リスト7:正解の場合に「正解」と表示する
博士のワンポイントレッスン
|
さて、「ワシントン」の場合は・・・ というところは完成しましたが、「その他の場合は・・・」の部分はどうしたらいいでしょうか?
If文 で「その他の場合」を使いたいときには キーワード Else ( 読み方:Else = エルス) を使います。具体的には次のようになります。
Private
Sub Button1_Click(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles Button1.Click
If
TextBox1.Text = "ワシントン"
Then |
■リスト8
これで、
もし、TextBox1に入力されているのが「ワシントン」 なら "正解"と表示しなさい。 その他の場合は "残念でした"と表示しなさい。
という意味になります。なかなか便利なElseですね。最初の文字の長さを表示する例でもElseを使えばもっと短くプログラムできます。
それでは、もうお分かりかと思いますが念のためにこの簡単なクイズプログラムの全コードを掲載しておきます。
Private
Sub Button1_Click(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles Button1.Click
If
TextBox1.Text = "ワシントン" Then |
Private
Sub Form1_Load(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles MyBase.Load Label1.Text = "アメリカの初代大統領は?" End Sub |
■リスト9:正解の場合に「正解」、不正解の場合には「残念でした」と表示する。
Elseを使うとその他の場合がすべて一緒にされてしまいますが、その他の場合でも区別したいときがあります。そのためにElse節でもう一度条件判断ができる ElseIf (読み方:ElseIf=エルスイフ)が用意されています。
上記の例で回答者が「ワシントン」ではなく2代目大統領のアダムズを回答してしまったときに、少し違うメッセージを表示するには次のようになります。
Private
Sub Button1_Click(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles Button1.Click
If
TextBox1.Text = "ワシントン"
Then |
Private
Sub Form1_Load(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles MyBase.Load Label1.Text = "アメリカの初代大統領は?" End Sub |
■リスト10
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 の時」から説明すると、この場合は 条件同士を AndAlso ( 読み方:AndAlso=アンドオールソー)でつなぎます。
If K = 5 AndAlso M = 8 Then ・・・・・ |
のようになります。3つあれば、もう一つ AndAlso でつないでください。いくつでもつなげます。
そして、「Kが5 か Mが8 の時」は、条件同士を OrElse ( 読み方:OrElse=オアエルス)でつなぎます。
If K = 5 OrElse M = 8 Then ・・・・・ |
のようになります。この場合も3つ以上つなぐこともできます。
ところで、次のようにしたらどうでしょうか?
If
K = 5 OrElse M = 8
AndAlso P = 31 Then MsgBox("成就されました。") End If |
■リスト11
注意:小中学生へ、「成就」は「じょうじゅ」と読みます。「なしとげる」という意味です。たとえば、「太郎と遊ぶ約束は成就された。」といえば、「太郎と遊ぶ約束が果たされた。」というような意味になります。(これは国語の問題ですね)。
「成就されました。」と表示されるのはどんな場合でしょう?
OrElse と AndAlso の両方が同じ文で使われたときは AndAlso の方が強い結合力をしめします。つまり、この例で「成就されました。」と表示されるのは 「k=5 の時」か「M=8 で P=31の時」のどちらかです。(どちらでもいいです)。
この場合を表にまとめると次のようになります。
K = 5 | M = 8 | P = 31 | |
○ | ○ | ○ | 「成就されました。」と表示される。 |
○ | ○ | × | 「成就されました。」と表示される。 |
○ | × | ○ | 「成就されました。」と表示される。 |
○ | × | × | 「成就されました。」と表示される。 |
× | ○ | ○ | 「成就されました。」と表示される。 |
× | ○ | × | (何も表示されない) |
× | × | ○ | (何も表示されない) |
× | × | × | (何も表示されない) |
しかし、結合力は ( )をつけることにより変化させることができます。たとえば、この例に()をつけて下のようにします。
If
(K = 5 OrElse M = 8)
AndAlso P = 31 Then MsgBox("成就されました。") End If |
■リスト12
こうすると、「成就されました。」と表示されるのは「K=5 で P=31の時」か「M=8 で P=31の時」のどちらかになります。(どちらでもいいです)。
この場合を表にまとめると次のようになります。
K = 5 | M = 8 | P = 31 | |
○ | ○ | ○ | 「成就されました。」と表示される。 |
○ | ○ | × | (何も表示されない) |
○ | × | ○ | 「成就されました。」と表示される。 |
○ | × | × | (何も表示されない) |
× | ○ | ○ | 「成就されました。」と表示される。 |
× | ○ | × | (何も表示されない) |
× | × | ○ | (何も表示されない) |
× | × | × | (何も表示されない) |
かっこ1つで意味が大きく変わってしまって紛らわしいので特に必要のない場合でもかっこをつけることをお勧めします。たとえば最初の例では次のように書くと良いです。
If
K = 5 OrElse (M = 8
AndAlso P = 31)
Then MsgBox("成就されました。") End If |
■リスト13
発展学習 発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。 AndAlso、OrElseの他にAndとOrを使って複数の条件を組み合わせることもできますがこれらは少しだけ機能が違います。 AndAlso、OrElseで条件をつないでいった場合、VBは条件が成就すること、または成就しないことが確実になった時点で直ちに条件判断を中止します。それ以上条件を調べていっても結果が変わらないからです。これを短絡評価、ショートサーキットなどと言います。 一方And、Orで条件をつないでいった場合、VBは条件が成就すること、または成就しないことが確実になっても条件判断を中止しません。 この違いは気にしなくて良い場合も多いのですが時には重要な差を生みます。たとえば、次の例1はエラーになりませんが、例2はエラーになります。例1はフォルダが存在しないことが分かった時点で処理を中断するのに、例2はフォルダが存在しないことがわかってもそのフォルダの中のファイルの数を調べようとするからです。 ※以下の例を試す場合は、C:\XXXXXX のように存在しないフォルダを指定してください。
■例1:正常に実行される
■例2:エラーになる |
6.ネスト
もう1つ複雑な条件判断として「ネスト」というものがあります。やはり 2つ以上の条件がある場合に使います。
上の例では K = 5 で M = 8 が条件の場合は AndAlsoを使って次のようにプログラムしていました。
If
K = 5 AndAlso M =
8 Then MsgBox("条件に合致しました。") End If |
■リスト14
もちろんこれでは正解ですが、「ネスト」という方法を使ってこれと同じことをすると次のようになります。
If
K = 5 Then If M = 8 Then MsgBox("条件に合致しました。") End If End If |
■リスト15
これは2つの If文 を「入れ子」のようにして使っているのです。
日本語に翻訳すると次のような意味になります。
もし、K = 5 なら、
もし、 M = 8 なら、
"条件に合致しました。"と表示しなさい
(M = 8 の場合はここまで)
(K = 5 の場合はここまで)
この「入れ子」状の構造を「ネスト」と言います。AndAlsoを使うかネスト を使うかはプログラマのお好みです。ただ「ネスト」は If の他にもいろいろでてきますから、今のうちに覚えておきましょう。ネストが特に効果を発揮するのは Forループ の時です。これについては次回解説しますのでお楽しみに。
最後にIf文の他の条件判断構造であるSelect Case(読み方: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 TextBox1.Text Case "ワシントン" MsgBox("初代大統領です。") Case "アダムズ" MsgBox("2代目大統領です。") Case Else MsgBox("不明です。") End Select |
■リスト16
この例はIf文でElseIfを使って表現することも可能です。
1つのCase節で複数の条件を判断することもできます。
Select
Case TextBox1.Text Case "ワシントン", "アダムズ" MsgBox("アメリカの大統領です。") Case "伊藤博文", "黒田清隆" MsgBox("日本の総理大臣です。") Case Else MsgBox("不明です。") End Select |
■リスト17
この例では、テキストボックスに「ワシントン」または「アダムズ」と入力すると「アメリカの大統領です。」と表示されます。
「ワシントン」または「アダムズ」という条件なのにCase節では Or が使われていないことに注意してください。Case節では単なる , (カンマ)が「または」という意味を表現します。逆に Or を使うと正常に条件判断がされません。(この場合の Or はビット演算を実行します。)
Case節には他にも便利か書き方があるので簡単にサンプルを紹介しておきます。
今日の日付によってメッセージが変わる例です。今日の日付は Now.Day (読み方:Now=ナウ、Day=デイ)で取得できます。
たとえば、6月27日 は Now.Day は 27 を返します。
Select
Case Now.Day Case 1 MsgBox("今日から新しい月ですね!") Case 2 To 15 MsgBox("まだまだ月の前半ですよ。") Case 16, 17, 18 MsgBox("そろそろ月も半ばを過ぎましたね。") Case Is >= 19 MsgBox("もうすぐ次の月です。") End Select |
■リスト18
このサンプルに登場する To (読み方:To=トゥー)や Is (読み方:Is=イズ)に注意してください。熟達してくるとこれらを組み合わせてSelect Case文はいろいろな使い方ができるのですが、今回は基本的な使い方だけ紹介しました。
なお、IfとSelect Caseの例はサンプル集にも掲載しています。
発展学習 C, C++, C#, J#, Java開発者向けの情報 C#やJavaの switch文 と VBの Select Case文は似ているようで違いますので注意してください。 たとえば、Select Case文のCase節には定数式以外の柔軟な式が指定できます。また、Case節に C#の break のような指示を入れる必要はありません。逆にC++のようにbreakをわざと省略して次のcase節を実行させようとしてもVB のCase節では不可能です。当然、他のcase節にジャンプすることもできません。 |