4回目:プログラムの制御-条件分岐

更新日:2023/9/7 [投稿日:2023/3/6]

全6回で勉強するプログラミング、4回目です。今回と5回目でプログラムの制御について勉強します。

プログラムの制御とは

プログラムの制御とは、一行一行書かれたプログラムをどのような順番で実行するかを調節する仕組みです。通常プログラムは上から順番に実行されます。これを連続構造などと呼んでます。そして、連続構造以外に「条件分岐構造」と「繰返し構造」というプログラムの制御があります。

条件分岐とは

当ページではまず「条件分岐構造」から学習します。条件分岐とは、ある条件に当てはまれば命令を実行する。というものです。この条件分岐の構造は少なくとも3つあります。

IF文:「はい・真・True」の時のみ実行する

”条件が「はい・真・True」の時のみ命令を実行する”というのは、例えばもし変数intAに入力されている値が100以上なら「100以上です」というメッセージを表示する場合。プログラムで書くと次のようになります。

If intA >= 100 Then  ‘もしintAが100以上なら
  MsgBox “100以上です。”
End If

1行目が条件文で、この条件に合えば2行目が実行されます。条件に合わなければ2行目は実行されません。

IF文

この条件の命令には”If”が使われるためIF文などと言われます。他のプログラム言語でもこのIF文が使われます。構文や条件の書き方はプログラム言語によって異なってきます。VBAの構文は次のようになります。

If 条件 Then
  ’実行
End If

条件には上記のような比較演算子や、その他に数式や関数などが使われます。実行される命令は1行だけでなく複数行でも可能で、”End If”まで命令が実行されます。

「はい」と「いいえ」それぞれ実行する

先ほどは、変数intAが100以上の時のみ”100以上です”とメッセージを表示させましたが、それ以外の時は”-”と表示させたいときです。プログラムで書くと次のようになります。

If intA >= 100 Then  ‘もしintAが100以上なら
  MsgBox “100以上です。”
Else  ‘それ以外
  MsgBox “-”
End If

Elseというキーワードが”その他”を意味します。

上記のプログラムで100以上以外の場合、”-”と表示させました。でも、”100未満”でいいと思った方もいるのでは?実はプログラムで書くと厳密にはそうならないことがあるのです。 例えばintAの値がNull(数値が設定されていない状態です)が設定される場合などです。難しくなるため、説明は割愛します。

条件が複数ある

変数intAの値が0未満(つまりマイナス)のときは”0以上の値を入力してください。”という条件を追加する場合はどうなるでしょうか?

If intA >= 100 Then  ‘もしintAが100以上なら
  MsgBox “100以上です。”
ElseIF intA < 0 Then
  MsgBox “0以上の値を入力してください。”
Else
  MsgBox “-”
End If

”ElseIf 条件 Then”という条件文が新たに加わりました。このような書き方も他の言語で使われることが多いです。

条件が複数ある:Select文

これまでの条件は全て変数intAの値で判断していました。このような場合はIf文ではなくSelect文で書くことができます。Select文は他の言語では、Switch文だったりします。いずれにせよ、命令を複数分岐させるときにはIf文の他にもSelect文があるのだと理解してくれれば十分です。参考までに上記のプログラムをSelect文に書き換えると次のようになります。

Select Case intA
Case Is >= 100   ‘もしintAが100以上なら  
       MsgBox “100以上です。”
Case Is < 0   ‘もし0未満なら  
     MsgBox “0以上の値を入力してください。”
Case Else  ‘それ以外
  MsgBox “-”
End Select

実用的なプログラム

IF分を使っってもう少し実用的なプログラムを作ってみたいと思います。前回の学習の最後の問題で、メタボを計算する関数を作りました。BMIという数値ですが、18.5未満が低体重、18.5から25が普通、25以上だと肥満だということです。BMI計算関数の戻り値をIF分を使って判断しメッセージで表示してみます。

プログラムの書き始め

まずは第3回目で作ったTest10プログラムとBMI関数をコピーしてから始めます。今回はTest11とします。プログラムの書き始めは、実行することを言葉でコメント行として書き出すとやりやすくなります。例えば次のように始めます。

Sub Test11()
Dim dbl体重 As Double
Dim dbl身長 As Double
Dim dblRet As Double

  dbl体重 = 57.5
  dbl身長 = 1.58
  dblRet = BMI(dbl体重, dbl身長)

  ‘dblRetが18.5未満のとき
  ‘低体重と表示する

  ‘dblRetが18.5から25未満のとき
  ‘普通体重と表示する

  ‘dblRetが25以上のとき
  ‘肥満体重と表示する

  MsgBox dblRet  ‘この行は削除する
End Sub

Function BMI計算(dbl体重 As Double, dbl身長 As Double) As Double
Dim dblRet As Double

  dblRet = dbl体重 / (dbl身長 * dbl身長)
  BMI= dblRet

End Function

あとはコメントに対応したプログラムを書くだけです。書いてみましょう。

回答例

BMI関数は変更がないので、Test11のみ下記に示します。

Sub Test11()
Dim dbl体重 As Double
Dim dbl身長 As Double
Dim dblRet As Double

  dbl体重 = 57.5
  dbl身長 = 1.58
  dblRet = BMI(dbl体重, dbl身長)

  ‘dblRetが18.5未満のとき
  If dblRet < 18.5 Then
    ‘低体重と表示する
    MsgBox “低体重”

  ‘dblRetが18.5以上25未満のとき
  ElseIf dblRet >= 18.5 And dblRet < 25 Then
    ‘普通体重と表示する
    MsgBox “普通体重”

  ‘dblRetが25以上のとき
  ElseIf dblRet >= 25 Then
    ‘肥満体重と表示する
    MsgBox “肥満体重”
  Else
    MsgBox “-”
  End If

End Sub

IF文の最後に、全ての条件に一致しないことがあるかもしれないので、Elseを追加しました。尚、IF文ではなく、Select文でも可能です。

4回目はこれで終了します。もし、余力があれば次の2つのプログラムにチャレンジしてください。このプログラムは最終回でつかいます。

その1:

Test11を次のように書き直してください。実は日本ではBMI値が25以上で肥満としてますが、世界標準値では25以上の数値がさらに4つに分割され評価されるそうです。

  • 25以上30未満・・・肥満1度
  • 30以上35未満・・・肥満2度
  • 35以上40未満・・・肥満3度
  • 40以上・・・・・・肥満4度

上記の条件を追加してプログラムを完成させてください。

その2:

BMI値を計算する関数のように、BMI値から状態を表す次のような関数を作ってください。

  • 関数名はBMI判断
  • 引数は一つ。double型。
  • 戻り値は文字列。(”低体重”,”普通体重”,”肥満体重”)
  • Test11中の、BMI値をIF分で判断して普通、肥満などのメッセージを表示している部分を切り取って新しい関数をつくります。先ほどの肥満1度~4度を加えてもいいです。