プログラミング中級2
練習


練習


中級の段階に入っていますが、「練習」のコーナーを設けることにしました。

カレンダーの6回目「追加機能」のところで、少し説明不足だと感じた部分を、ここで練習します。
どの部分かと言いますと、「祝日と祝日に はさまれた平日」の判定部分です。 And と Or が出てくる If 文で、解かり難かったのではないでしょうか?
それでも、なんとか解ったと言うかたは、ここの練習は必要ないかも知れませんが・・・ ま、お付き合いくださいませ。




And と Or


If 文で いろんな条件の判定ができること、2つ以上の条件は And や Or で続けて書けること、 は すでに皆様ご存知だと思います。
And だけの組み合わせ、または Or だけの組み合わせだと、問題はありません。
And と Or を組み合わせた場合に問題が発生します。
まず、例題を出しましょう。

例題1.月と日を入力させて、5月3日だったら「祝日です」とメッセージを出します。

これを、以下のようにコーディングしました。
  1. Sub Reidai1()
  2. Dim tuki As Integer
  3. Dim hi As Integer
  4. tuki = InputBox("月を入力してください")
  5. hi = InputBox("日を入力してください")
  6. If tuki = 5 And hi = 3 Then
  7. MsgBox "祝日です。"
  8. End If
  9. End Sub
月と日が別々の変数の中に入りますので、「5月3日」の判定は、「月が5、かつ日が3」の2つの条件の判定になります。
「月が5、かつ日が3」の部分は上記ソースの6行目です。
     If tuki = 5 And hi = 3 Then
「月が5」と「日が3」を And でつないでいます。


では、次の例題はどうでしょうか?

例題2.月と日を入力させて、5月5日だったら「祝日です」とメッセージを出します。

例題1の後だと、ひどく簡単に見えるでしょ?
例題1.の6行目の数字を変えるだけですね。
  1. Sub Reidai2()
  2. Dim tuki As Integer
  3. Dim hi As Integer
  4. tuki = InputBox("月を入力してください")
  5. hi = InputBox("日を入力してください")
  6. If tuki = 5 And hi = 5 Then
  7. MsgBox "祝日です。"
  8. End If
  9. End Sub


続きまして、例題3です。

例題3.月と日を入力させて、5月3日または5月5日だったら「祝日です」とメッセージを出します。

「なんだ、簡単じゃないか」と思った人は、間違いを起こす可能性が高い人です。 ご注意ください。
例題3.のソースのサンプルをお見せします。
  1. Sub Reidai3_1()
  2. Dim tuki As Integer
  3. Dim hi As Integer
  4. tuki = InputBox("月を入力してください")
  5. hi = InputBox("日を入力してください")
  6. If tuki = 5 And hi = 5 Or hi = 3 Then
  7. MsgBox "祝日です。"
  8. End If
  9. End Sub
問題の6行目は、
   If tuki = 5 And hi = 3 Or hi = 5 Then
となっていますね。

「月が5」というのが共通なので、tuki = 5 を繰り返さずに、1つにまとめているのですね。 なかなかよく考えています。
これは、「5月で、3日か5日だったら」の意味です。 人間なら、これで解るでしょう。 しかし、悲しいかなコンピューターはアホです。 もっと正確に指示しないと、エラーが発生してしまいます。

さて、どういうエラーでしょうか?

実行してみるのが一番よいのですが・・・。
Reidai3_1 を実行してみます。

  1. まず5月3日のテストです。
    月に 5 を入力して、OKボタンをクリックします。
    イメージ


  2. 日に 3 を入力して、OKボタンをクリックします。
    イメージ


  3. すると、「祝日です」のメッセージが表示されます。
    イメージ


  4. 次に5月5日のテストです。
    月に 5 を入力して、OKボタンをクリックします。
    イメージ


  5. 日に 5 を入力して、OKボタンをクリックします。
    イメージ


  6. 今度も、「祝日です」のメッセージが表示されます。
    ここまでは、問題ありませんね。
    イメージ


  7. では、今度は1月5日でテストしてみます。
    月に 1 を入力して、OKボタンをクリックします。
    イメージ


  8. 日に 5 を入力して、OKボタンをクリックします。
    イメージ


  9. そうすると・・・ありゃ! またもや「祝日です」のメッセージが表示されました!
    う〜〜ん、いよいよ問題登場。
    イメージ


じつは、1月5日以外でも、同じエラーが発生します。
2月5日でも、3月5日でも、「祝日です」のメッセージが表示されます。

なぜかと言うと、VB は6行目の、
   If tuki = 5 And hi = 3 Or hi = 5 Then
を、次のように解釈しているのです。

(a) 月が5で日が3(つまり5月3日)だったら、If tuki = 5 And hi = 3 Then
(b) あるいは、日が5(つまり何月でも5日)だったら、Or If hi = 5 Then
これでは目的が果たせないことを、理解いただけるでしょうか?

VB に解釈してほしいのは、こんな感じなのです。
   If tuki = 5 And hi = 3 Then
     Or
   If tuki = 5 And hi = 5 Then


無論、これは構文エラーなので、ちゃんと VB の文法にそって書き直すと、
   If tuki = 5 And (hi = 3 Or hi = 5) Then
となります。
あるいは、次のようにしても構いません。
   If (tuki = 5 And hi = 3) Or (tuki = 5 And hi = 5) Then

こんな風に、And と Or が混じるとややっこしいことになります。 その為、And と Or は、別の If 文にしたほうが、すっきりすることが多いのです。
別の If 文にして書き直すと、
   If tuki = 5 Then
     If hi = 3 Or hi = 5 Then
となります。

If 文のネスト(階層)が深くなるのが難点ですが、わかりやすくなると思いませんか?

では、練習問題を1つ出します。
練習問題.
  月と日を入力させて、5月3日または5月5日または11月3日または11月23日だったら「祝日です」とメッセージを出します。





戻る

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル