Visual Basic 6.0 初級講座
VB6対応

 

Visual Basic 中学校 > VB6 初級講座 >

第5回 条件判断 

 

プログラムをしていると「もし、・・・の場合はこうして、そうじゃないときはこうする」のように場合に応じて処理を変えたいときがあります。そんなときにつかうのが「条件判断構造(じょうけんはんだんこうぞう)」と呼ばれる物で、これは条件に応じて処理を変える命令や構造のことを指します。VBには条件判断構造として If文(イフ文) と Select文(セレクト 文) が用意されていてどちらもよく使い大変重要です。

この回の要約

・場合によって処理をわけるときは If文 を使う。

If 条件 Then

    条件に合致した場合の処理

Else

    条件に合致したかった場合の処理

End If

・If文の中で And や Or を使うことで複雑な条件判断ができる。

・Select Case文を使ってもIf文と同様の条件判断ができる。

 

1.文字列の長さ

 

まずはテキストボックスに文字が入力されているか判断してみましょう。文字が入力されているかチェックするには入力されている文字数を調べます。文字数が0ならば何も入力されていないことになります。

VBで、文字数を数えるには前回登場したLen関数(レン)を使います。おさらいしておきましょう。たとえば、MsgBox Len("あいうえお")とすると、 「5」 と表示されるのでしたね。それでは、これを利用して入力した文字の数を数えるプログラムを作ってみましょう。

 

■プログラム1:これから作成するプログラムはこんな感じです。

まず、フォームにコマンドボタンとテキストボックスを1つずつ配置してください。

■画像1:ツールボックス

そして、コマンドボタンをダブルクリックして次のようにコーディングしてください。

VB6対応

Private Sub Command1_Click()

Dim Moji As String

Moji = Text1.Text

MsgBox Len(Moji) & "文字が入力されています。"

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行なのでいいですが、このIfEnd Ifの間には他の部分と同じように何行でも書くことができるのです。

次に、何か入力されているときは今まで通りの表示をさせます。なにか入力されていれば、文字数が0より大きいはずですから、「もし、何か入力されていれば・・・」という条件は「もし、文字数が0より大きければ」となりますから、次のようにすればOKです。

If Len(Moji) > 0 Then

MsgBox Len(Moji) & "文字が入力されています。"

End If

記号 > は算数・数学でもでてきて「左にある物は右にある物より大きい」を表すのでしたね。ここでは使いませんがこの他に < を使用することもできます。「以上」「以下」を使いたい場合はそれぞれ「>=」「<=」とします。これは算数・数学とは少し違います。(算数・数学で「≧」、「≦」を使います)。はまた  <> という記号を使うと「・・・じゃないとき」と言う意味が表現できます。

では、改良を加えて完成したプログラムの全体を見てみましょう。

VB6対応

Private Sub Command1_Click()

Dim Moji As String

Moji = Text1.Text

If Len(Moji) = 0 Then

MsgBox "何も入力されていません" 

End If

If Len(Moji) > 0 Then

MsgBox Len(Moji) & "文字が入力されています。"

End If

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

とすればよいのです。ここまでの全コードを下に示します。

VB6対応

Private Sub Command1_Click()

If Text1.Text = "ワシントン" Then

MsgBox "正解"

End If

End Sub

Private Sub Form_Load()

Label1.Caption = "アメリカの初代大統領は?"

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を使えばもっと短くプログラムできます。

それでは、もうお分かりかと思いますが念のためにこの簡単なクイズプログラムの全コードを掲載しておきます。

VB6対応

Private Sub Command1_Click()

If Text1.Text = "ワシントン" Then

MsgBox "正解"

Else

MsgBox "残念でした"

End If

End Sub

Private Sub Form_Load()

Label1.Caption = "アメリカの初代大統領は?"

End Sub

■コード4:正解の場合に「正解」、不正解の場合には「残念でした」と表示する。

 

4.その他の場合で…

 

Elseを使うとその他の場合がすべて一緒にされてしまいますが、その他の場合でも区別したいときがあります。そのためにElse節でもう一度条件判断ができる ElseIf (エルスイフ)が用意されています。

上記の例で回答者が「ワシントン」ではなく2代目大統領のアダムズを回答してしまったときに、少し違うメッセージを表示するには次のようになります。

VB6対応

Private Sub Command1_Click()

If Text1.Text = "ワシントン" Then

MsgBox "正解"

ElseIf Text1.Text = "アダムズ" Then

MsgBox "おしい。アダムズは2代目の大統領です。"

Else

MsgBox "残念でした"

End If

End Sub

Private Sub Form_Load()

Label1.Caption = "アメリカの初代大統領は?"

End Sub

ElseIfはいくつでも書くことができますから、この調子ですべての大統領を判断することもできます。ただ、大統領は40人以上いますから本当にプログラムを作るならもっと別の方法をとるでしょう。

なお、1回 IfElseIf の条件に合致すると処理は 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つ以上つなぐこともできます。

 

ところで、次のようにしたらどうでしょうか?

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応

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  
「成就されました。」と表示される。
× 「成就されました。」と表示される。
× 「成就されました。」と表示される。
× × 「成就されました。」と表示される。
× 「成就されました。」と表示される。
× × (何も表示されない)
× × (何も表示されない)
× × × (何も表示されない)

 

しかし、結合力は ( )をつけることにより変化させることができます。たとえば、この例に()をつけて下のようにします。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応

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つで意味が大きく変わってしまって紛らわしいので特に必要のない場合でもかっこをつけることをお勧めします。たとえば最初の例では次のように書くと良いです。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応

If K = 5 Or (M = 8 And P = 31) Then

    MsgBox "成就されました。"

End If

 

6.ネスト

 

もう1つ複雑な条件判断として「ネスト」というものがあります。やはり 2つ以上の条件がある場合に使います。

上の例では K = 5 で M = 8 が条件の場合は And を使って次のようにプログラムしていました。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応

If K = 5 And M = 8 Then

    MsgBox "条件に合致しました。"

End If

もちろんこれでは正解ですが、「ネスト」という方法を使ってこれと同じことをすると次のようになります。

VB6対応 VB.NET2002対応 VB.NET2003対応 VB2005対応

If K = 5 Then

If M = 8 Then

MsgBox "条件に合致しました。"

End If

End If

これは2つの If文 を「入れ子」のようにして使っているのです。

日本語に翻訳すると次のような意味になります。

もし、K = 5 なら、

もし、 M = 8 なら、

"条件に合致しました。"と表示しなさい

(M = 8 の場合はここまで)

(K = 5 の場合はここまで)

この「入れ子」状の構造を「ネスト」と言います。If文の中でAndで使って条件をくっつけていくよりはネストにしたほうが性能がよくな ります。。また、「ネスト」は If の他にもいろいろでてきますから、今のうちに覚えておきましょう。ネストが特に効果を発揮するのは Forループ の時です。これについては次回解説しますのでお楽しみに。

 

7.Select Case

 

最後にIf文の他の条件判断構造であるSelect Case(セレクト ケース)を紹介します。

Select Caseは条件によって処理が3つ以上に分かれるときに使うと特に便利ですが、そうでない場合もSelect Caseの方がわかりやすいといってIf文よりもSelect Case文を好んで使う人もいます。

Select Case文はIf文とまったく同じことができます。書き方が違うだけです。

最も単純な使い方は次のようなものです。

Select Case 元となる式

Case 比較する式1

「元となる式」と「比較する式1」が一致する場合の処理を書く

Case 比較する式2

「元となる式」と「比較する式2」が一致する場合の処理を書く

 

・・・

 

Case Else

「元となる式」がどの式とも一致しなかった場合の処理を書く

End Select

Case節 (Case = ケース)はいくつ書いても構いません。Case Else節は省略することができます。1つのCase節が実行されると処理はEnd Selectにジャンプします。つまり、複数のCase節に合致する場合は合致する最初のCase節しか実行されません。

具体例では次のようになります。

VB6対応

Select Case Text1.Text

Case "ワシントン"

MsgBox "初代大統領です。"

Case "アダムズ"

MsgBox "2代目大統領です。"

Case Else

MsgBox "不明です。"

End Select

この例はIf文でElseIfを使って表現することも可能です。

1つのCase節で複数の条件を判断することもできます。

VB6対応

Select Case Text1.Text

Case "ワシントン",  "アダムズ"

MsgBox "アメリカの大統領です。"

Case "伊藤博文", "黒田清隆"

MsgBox "日本の総理大臣です。"

Case Else

MsgBox "不明です。"

End Select

この例では、テキストボックスに「ワシントン」または「アダムズ」と入力すると「アメリカの大統領です。」と表示されます。

「ワシントン」または「アダムズ」という条件なのにCase節では Or が使われていないことに注意してください。Case節では単なる , (カンマ)が「または」という意味を表現します。逆に Or を使うと正常に条件判断がされません。(この場合の Or はビット演算を実行します。)

Case節には他にも便利か書き方があるので簡単にサンプルを紹介しておきます。

今日の日付によってメッセージが変わる例です。今日の日付は Day(Now) で取得できます。

たとえば、6月27日 は Day(Now) は 27 を返します。

VB6対応

Select Case Day(Now)

Case 1

MsgBox "今日から新しい月ですね!"

Case 2 to 15

MsgBox "まだまだ月の前半ですよ。"

Case 16, 17, 18

MsgBox "そろそろ月も半ばを過ぎましたね。"

Case Is >= 19

MsgBox "もうすぐ次の月です。"

End Select

なお、さらに詳しいSelect文の解説はこちらをご覧下さい。