管理栄養士のためのVBA入門!第5回:条件分岐を理解しよう

Excel

みなさん、こんにちは。

シンノユウキです。

今回は「管理栄養士のためのVBA入門」の第5回、以下の記事の続きです。

管理栄養士のためのVBA入門!第4回:変数と定数について理解しよう
みなさん、こんにちは。 シンノユウキです。 今回は「管理栄養士のためのVBA入門」の第4回、以下の記事の続きです。 前回はセルに値を入力したり、値を利用して計算してみたりしました。今回は、複雑なプログラムを組む際に必要...

前回は、変数と定数についての基本的な知識について解説しました。今回は条件分岐と呼ばれる、与えられた条件に応じて処理を変更する仕組みについて解説していきます。

では、行きましょう。

 

前回の演習問題の答え合わせ

まずは前回の演習問題の答え合わせからやっていきましょう。実際の問題は以下の通りです。

以下の表をA1セルにコピーし、それぞれの栄養素におけるエネルギーを求めてください。その際には、アトウォーター係数を定数として用いてください。念のために説明しておくと、炭水化物、脂質、炭水化物のアトウォーター係数は、それぞれ4・9・4です。

摂取量
(g)
エネルギー
(kcal)
たんぱく質 40
脂質 50
炭水化物 150

 

 

答えは以下の通りです。

 

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 &amp;gt;= 60 Then
        MsgBox "合格"
    End If
End Sub

 

実行してみて、合格とメッセージができましたか?でていれば正解です。

 

複雑な処理に挑戦してみよう

先ほど書いたIf文は、条件を満たす場合のみ処理を実行するというものでした。しかし、実際に使用する場合では、条件を満たす場合と、満たさない場合とで処理を変えたいという事があるかと思います。そういった場合には、Else というキーワードを使う必要があります。以下のような書式で書くことで目的を達成できます。

 

If 条件式 then
    条件を満たす場合の処理
Else
    条件を満たさない場合の処理
End If

 

では、先ほど書いたコードで、60点以上の場合は合格、それ未満だと不合格と表示させるプログラムを書いてみましょう。以下のようになれば正解です。

 

Sub lesson()
    If Range("A1").Value &amp;gt;= 60 Then
        MsgBox "合格"
    Else
        MsgBox "不合格"
    End If
End Sub

 

コードが書けたら実行してみて、セルA1の値をいろいろ変えて試してみましょう。

 

また、If文で条件を満たさない場合、さらに条件を分岐させたいという場合もありますよね。そういった場合はElse If を使用します。Ifステートメントを重ねて記述するというイメージですね。基本的な書き方は以下のようになります。

 

f 条件式1 Then
    処理1
ElseIf 条件式2 Then
    処理2
Else
    処理3
End If

 

Else Ifを使用することで、条件をいくつも指定できます。

Ifステートメントを一つだけしか使わない場合は、条件を満たす場合と満たさない場合との二通りしか処理を分岐できませんでしたが、Else Ifを使用することで、いくつもの条件に応じて処理を分岐させることができます。

たとえば、テストの点数に応じて、評価を以下のように分けたいという場合、

  • 60点未満:不可
  • 60点以上:可
  • 70点以上:良
  • 80点以上:優
  • 90点以上:秀

If Elseを用いることでこんな処理も可能になります。

セルA1にテストの点数を入力して、その評価をB1に出力するという処理を、If Elseを用いて書いてみましょう。コードは以下のようになります。

 

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ステートメントを使ってみよう

では、実際に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ステートメントは、その使用するシチュエーションによって適宜使い分けていきましょう。

 

連載目次

[[vba-intro-index]]