みなさん,こんにちは。
シンノユウキ(shinno1993)です。
今回は「管理栄養士のためのVBA入門」の第5回,以下の記事の続きです。
前回は,変数と定数についての基本的な知識について解説しました。
今回は条件分岐と呼ばれる,与えられた条件に応じて処理を変更する仕組みについて解説していきます。
では,行きましょう。
前回の演習問題の答え合わせ
まずは前回の演習問題の答え合わせからやっていきましょう。実際の問題は以下の通りです。
答えは以下の通りです。
Sub lesson()
Const FACTER_PROTEIN As Long = 4
Const FACTER_FAT As Long = 9
Const FACTER_CARBON As Long = 4
Cells(2, 3).Value = Cells(2, 2).Value * FACTER_PROTEIN
Cells(3, 3).Value = Cells(3, 2).Value * FACTER_FAT
Cells(4, 3).Value = Cells(4, 2).Value * FACTER_CARBON
End Sub
アトウォーター係数を,FACERT_栄養素名
という形で定数にしました。
この程度であれば定数にする必要性も少ないかもしれませんが,何度も栄養計算をするという場合だと,定数化しておいたほうが見やすくなります。
また,アトウォーター係数をそのまま「4」とコードの中に記入した場合,それが何を意味するのか栄養の知識のない方には理解できません。しかし,それを定数化し,名前をつけることで,「4」はFACETRである,ということが誰でも理解できるようになります。
条件分岐の基本概念
初めに条件分岐の基本概念について紹介します。条件分岐では,ある条件が満たされる場合はそれに応じた処理が行われ,そうでない場合はそれに応じた処理が行われます。図にしてみると以下のようになります。
条件分岐があるのは,なにもVBAに限った話ではありません。他のプログラミング言語全般でも利用されている,とても大切な機能です。これを利用することで,条件に応じた複雑な処理が可能になるのです。
Ifステートメントについて理解しよう
基本的な書き方
分岐処理の基本は,If ~ then ステートメントです。もし~ならば,という感じで,以下のような書式で記入していきます:
If 条件式 then
条件を満たす場合のステートメント
End IF
条件式の書き方
条件式は,ExcelのIf関数における書き方とほぼ同じです。以下に一覧を表示します:
記号 | 意味 | 例 |
---|---|---|
= | 等しい | A=B |
> | より大きい | A>B |
>= | 以上 | A>=B |
<= | 以下 | A<=B |
< | より小さい | A<B |
<> | 等しくない | A<>B |
使ってみよう
では,実際に使用してみましょう。セルのA1に50を入力してください。そして,その値が60以上の場合に"合格"とメッセージを出すプログラムを作ってみましょう。以下がそのプログラムの例です。
Sub lesson()
If Range("A1").Value >= 60 Then
MsgBox "合格"
End If
End Sub
実行してみて,合格とメッセージができましたか?でていれば正解です。
複雑な処理に挑戦してみよう
先ほど書いたIf文は,条件を満たす場合のみ処理を実行するというものでした。しかし実際に使用する場合では,条件を満たす場合と,満たさない場合とで処理を変えたいという事があるかと思います。そういった場合にはElse というキーワードを使う必要があります。以下のような書式で書くことで目的を達成できます。
If 条件式 then
条件を満たす場合の処理
Else
条件を満たさない場合の処理
End If
では,先ほど書いたコードで,60点以上の場合は合格,それ未満だと不合格と表示させるプログラムを書いてみましょう。以下のようになれば正解です。
Sub lesson()
If Range("A1").Value >= 60 Then
MsgBox "合格"
Else
MsgBox "不合格"
End If
End Sub
コードが書けたら実行してみて,セルA1の値をいろいろ変えて試してみましょう。
また,If文で条件を満たさない場合,さらに条件を分岐させたいという場合もありますよね。そういった場合はElse If を使用します。Ifステートメントを重ねて記述するというイメージですね。基本的な書き方は以下のようになります。
If 条件式1 Then
処理1
ElseIf 条件式2 Then
処理2
Else
処理3
End If
Else Ifを使用することで,条件をいくつも指定できます。
Ifステートメントを一つだけしか使わない場合は,条件を満たす場合と満たさない場合との二通りしか処理を分岐できませんでしたが,Else Ifを使用することで,いくつもの条件に応じて処理を分岐させることができます。
たとえば,テストの点数に応じて,評価を以下のように分けたいという場合,
- 60点未満:不可
- 60点以上:可
- 70点以上:良
- 80点以上:優
- 90点以上:秀
Else ifを用いることで以下のような処理も可能になります。セルA1にテストの点数を入力して,その評価をB1に出力するという処理を,Else Ifを用いて書いてみましょう。コードは以下のようになります。
Sub lesson()
Dim score As Long
score = Range("A1").Value
If score >= 90 Then
Range("B1").Value = "秀"
ElseIf score >= 80 Then
Range("B1").Value = "優"
ElseIf score >= 70 Then
Range("B1").Value = "良"
ElseIf score >= 60 Then
Range("B1").Value = "可"
Else
Range("B1").Value = "不可"
End If
End Sub
少しコードが長くなっていますが,やっていることは単純で,ただ繰り返しているだけです。少しずつ順を追って理解してみましょう。
Select Caseステートメントについて
選択肢が多い場合に使用する
先ほどはIfステートメントについて紹介しました。複数の条件式に応じて処理を分岐できる便利なステートメントです。
しかし,分岐する条件が多くなる場合,コードの階層が深くなってしまうため,読みにくくなってしまいます。確かに,先ほどのテストの点数に応じて処理を変更させるというところでも,コードが長くなってしまい,少し読みにくくなってしまってましたね。
これを読みやすく書けるのがSelect Caseステートメントです。
基本的な書き方
Select Caseステートメントの基本的な書き方は以下の通りです。
Select Case 判断するケース
case is 条件1
処理1
case is 条件2
処理2
case is 条件3
処理3
Case Else
処理4
End Select
ここでは条件を3つまでしか書いていませんが,実際にはいくつでも書くことができます。
使ってみよう
では,実際にSelect Caseステートメントを使用してみましょう。
先ほどIfステートメントで記述したコードをSelect Caseステートメントで書き直してみましょう。以下のようになれば正解です:
Sub lesson()
Dim score As Long
score = Range("A1").Value
Select Case score
Case Is >= 90
Range("B1").Value = "秀"
Case Is >= 80
Range("B1").Value = "優"
Case Is >= 70
Range("B1").Value = "良"
Case Is >= 60
Range("B1").Value = "可"
Case Else
Range("B1").Value = "不可"
End Select
End Sub
まとめ
今回は複雑なプログラムを作成する際に必要となる,条件分岐について説明しました。IfステートメントやSelect Caseステートメントは,その使用するシチュエーションによって適宜使い分けていきましょう。