本講の目的
  • フローチャートを用いて、アルゴリズムについて考える
  • 条件文の基本について知る

アルゴリズムとフローチャート

アルゴリズム

プログラムとは、コンピュータがある目的を達成するために処理を行う順序を記述したものです。プログラマーは、プログラムを作る際に、コンピュータの処理をどのような順番に並べればその目的が達成できるかを考えて、プログラミングを行っていくことになります。このコンピュータが目的を達成するためのやり方のことをアルゴリズムと呼びます。つまり言い換えると、プログラマーは、プログラムを作る際に、アルゴリズムを考えて、それに基づいてプログラミングを行っていくことになるわけです。

コンピュータがある目的を達成するやり方は一つであるとは限りません。効率的なやり方、非効率なやり方、コンピュータの性能に沿ったやり方などいくつものアルゴリズムが考えられることがあります。プログラマーは、それらのアルゴリズムから一つを選んで、プログラミングを行って、プログラムを作成します。

フローチャート

アルゴリズムを考えることは難しいです。単純なアルゴリズムであれば、脳内で考えることも可能でしょう。あるいは、熟練のプログラマーであれば、経験的にアルゴリズムを構築することもできます。しかし、しっかりとした目的を達成できるような複雑なアルゴリズムは、脳内のみで考えることは難しいことが多いでしょう。アルゴリズムを考えることは、プログラムを設計していることと同じであるからです。脳内だけで考えるよりも、紙などに書いた方が考え方も整理できるため、隙のないアルゴリズムを考える方法としては良いでしょう。

アルゴリズムを紙などに書いて、考えていく方法として、フローチャートがあります。

ソースコードからフローチャートの模式図

フローチャートは、各処理やデータなどを図形で表し、その順序を矢印でつなぐことによって、処理の順番を示した図です。図形の形状には、それぞれ意味があり、処理を整理していくことができます。いわば、フローチャートはプログラムの設計図に当たるものと言えます。フローチャートをしっかりと書くことは、アルゴリズムを整理しながら考えていくことに使えるだけではなく、他人と共有する際にも有効です。アルゴリズムについて議論する際や、チームでプログラムを構築する際には、フローチャートは特に重要となります。

フローチャートは、Word・Excel・PowerPointの図形機能のフローチャートを用いて作成することができます。紙に書いてフローチャートを書くのも良いですが、アプリケーションを利用して作成すると見やすくわかりやすいフローチャートを作ることができるので良いでしょう。

Microsoft Officeの図形機能にあるフローチャート

また、フローチャートはプログラミングのアルゴリズムだけではなく、日々の作業や提出手順を示す際に用いられることもあります。一度、使い方を知っておくと、日常の様々なシーンで役立てることができるでしょう。

条件分岐

条件分岐

VBAのプログラムは、基本的に上から順番に行を飛ばすことなく、命令文が実行されていくことになります。しかし、時にはとある処理について実行したい場合と実行したくない場合が出てきます。そのような際に用いられるのが条件分岐です。

条件分岐では、指定した条件が正しい場合(真もしくはTrueの場合と呼びます)と正しくない場合(偽もしくはFalseの場合と呼びます)で処理内容を変える方法です。フローチャートで表すと以下のようになります。

条件分岐のフローチャートの例

この例ではセル「A1」の値によって条件分岐しています。すなわち、セル「A1」の値が”1”の場合は、「セルA1の値は1ですね。」とメッセージ表示し、セル「A1」の値が”1”以外の場合は何も表示しません。このように、条件を設定し、その条件が正しいか正しくないかによって、処理する内容を変えることができます。

If文

条件分岐を行う方法としてIf文が挙げられます。

If文では、条件分岐を行うための条件を作り、その条件が正しい場合に該当する処理を行います。

If文は以下のように用います。

If文の使い方

If 条件式 Then
処理内容
End If

If」と記述した後に、条件式を指定し、その後に「Then」を記述してその行を終えます。次の行から条件式が正しかった場合の処理内容を記述します。処理内容を全て書き終えた次の行に「End If」と記述して、If文を終了します。

条件式には、処理内容を行いたい場合の条件を入れます。条件式という言葉の通り、基本的には条件となる式が入り、左辺と右辺を比較演算子で比較した結果が正しいか正しくないかを判断することとなります。判断に用いる比較演算子は以下の表の通りとなります。

比較演算子

以下のフローチャートのアルゴリズムを例としてプログラムを作成すると、IfTestのソースコードの通りとなります。

If文のフローチャートの例

IfTestのソースコード

Sub IfTest()
    If Range("A1") = 1 Then
        MsgBox ("セルA1の値は1ですね。")
    End If
End Sub
IfTestの実行結果

条件式では、セルの値だけではなく、変数を用いることや条件式内で数式を組み立てることもできます。また、等しい(=)・等しくない(<>)では、数値だけではなく文字列と比較することもできます。文字列を扱う場合は、他の部分で扱う場合と同じく「”」(半角ダブルクォーテーション)で囲む必要があります。

試しに、条件式を変更して、どのように条件が分岐するか試してみましょう。

If 〜 Else文

2.2.If文では、条件式が正しい場合のみに処理を行っていましたが、正しくない場合にも処理を行いたい場合があります。そのようなときに使うのがIf ~ Else文です。

以下のような形で用いて、条件式が正しい場合と正しくない場合の処理内容を変更します。

If ~ Else文の使い方

If 条件式 Then
条件式が正しい場合の処理内容
Else
条件式が正しくない場合の処理内容
End If

If文と同じく「If 条件式 Then」の後に条件式が正しい場合の処理内容を記述します。If文の場合は、「End If」で条件分岐を終了しますが、If ~ Else文の場合は、「Else」を記述し、その後に条件式が正しくない場合の処理内容を記述します。最後に「End If」を記述して条件分岐を終了します。

以下のフローチャートのアルゴリズムをIf ~ Else文を用いたプログラムとして作成すると、IfElseTestのソースコードの通りとなります。

If ~ Else文のフローチャートの例

IfElseTestのソースコード

Sub IfElseTest()
    If Range("A1") = 1 Then
        MsgBox ("セルA1の値は1ですね。")
    Else
        MsgBox ("セルA1の値は1ではないですね。")
    End If
End Sub

セルA1の値を”1”にして、IfElseTestを実行してみましょう。

IfElseTestの実行結果(セルA1が”1”の場合)

セルA1が”1”の場合は、「セルA1の値は1ですね。」とメッセージ表示されます。

続いて、セルA1の値を”1”以外にして、IfElseTestを実行してみましょう。

IfElseTestの実行結果(セルA1が”1”以外の場合)

セルA1が”1”以外の場合は、「セルA1の値は1ではないですね。」とメッセージ表示されます。

このように、If ~ Else文では、If文の条件式が正しい場合と正しくない場合の両方について、処理内容を指定することができます。

If 〜 ElseIf 〜 Else文

2.2.If文や2.3.If ~ Else文では、1つの条件式が正しい場合と正しくない場合で、処理内容を変えることができました。しかし、場合によっては、複数の条件式で条件分岐をしたい場合もあります。その際に用いるのが、If ~ ElseIf ~ Else文です。

If ~ ElseIf ~ Else文は以下のに用います。

If ~ ElseIf ~ Else文の使い方

If 条件式1 Then
条件式1が正しい場合の処理内容
ElseIf 条件式2 Then
条件式2が正しい場合の処理内容
Else
条件式1も条件式2も正しくない場合の処理内容
End If

条件と処理内容は2つでも、3つでも「ElseIf 条件式 Then」を入れた数だけ指定することができます。条件式が正しくなると、そこで指定された処理内容を行い、それ以下「End If」までに記述された処理は全て無視されます。よって、上に書かれている条件式ほど優先的に扱われることになります。最終的に、全ての条件式が正しくなかった場合は、「Else」で指定した処理内容を行わせることができますが、全ての条件式が正しくなかった場合に行う処理がなければ、「Else」は省略することができます。

以下のフローチャートのアルゴリズムをIf ~ ElseIf ~ Else文を用いたプログラムとして作成すると、IfElseIfElseTestのソースコードの通りとなります。

If ~ ElseIf ~ Else文のフローチャートの例

IfElseIfElseTestのソースコード

Sub IfElseIfElseTest()
    If Range("A1") = 1 Then
        MsgBox ("セルA1の値は1ですね。")
    ElseIf Range("A1") = 2 Then
        MsgBox ("セルA1の値は2ですね。")
    Else
        MsgBox ("セルA1の値は1でも2でもないですね。")
    End If
End Sub

セルA1の値を”1”にして、IfElseIfElseTestを実行してみましょう。

IfElseIfElseTestの実行結果(セルA1が”1”の場合)

セルA1が”1”の場合は、「セルA1の値は1ですね。」とメッセージ表示されます。

続いて、セルA1の値を”2”にして、IfElseIfElseTestを実行してみましょう。

IfElseIfElseTestの実行結果(セルA1が”2”の場合)

セルA1が”2”の場合は、「セルA1の値は2ですね。」とメッセージ表示されます。

続いて、セルA1の値を”1”と”2”以外にして、Sub IfElseIfElseTestを実行してみましょう。

IfElseIfElseTestの実行結果(セルA1が”1”および”2”以外の場合)

セルA1が”1”と”2”以外の場合は、「セルA1の値は1でも2でもないですね。」とメッセージ表示されます。

このように、複数の条件式を順番に確認していき、正しい条件式が出てきた場合に指定された処理内容を行うという条件分岐も可能です。「ElseIf」は複数増やすことができますので、条件分岐を駆使することによって、より目的に合った、より複雑なアルゴリズムもプログラムにすることができるようになります。

練習問題

以下の成績表を入力し、Aさんの国語の成績を条件分岐で判定してみましょう。

Aさんの成績表

成績判定の基準は、以下の表の通りになりますので、どのように条件分岐すれば、表の通りに成績判定できるかよく考えてみましょう。

成績判定の基準

表の基準で、国語の成績判定を行う条件分岐を行うためのアルゴリズムを組み込んだプログラムは、PerformanceTable5のソースコードになります。

PerformanceTable5のソースコード

Sub PerformanceTable5()

    '成績判定(条件分岐・Aさんの国語)
    If Range("B3") >= 90 Then
        Range("G3") = 5
    ElseIf Range("B3") >= 80 Then
        Range("G3") = 4
    ElseIf Range("B3") >= 70 Then
        Range("G3") = 3
    ElseIf Range("B3") >= 60 Then
        Range("G3") = 2
    Else
        Range("G3") = 1
    End If
End Sub

PerformanceTable5を実行すると、以下のようになります。

PerformanceTable5の実行結果

1人の1科目の成績判定であれば、目視で行うこともできますが、複数の人の成績判定や複数の科目の成績判定を行う場合は、全てを目視で判定していくと多量の時間がかかってしまい、ケアレスミスも増えます。PerformanceTable5のような条件分岐を使ったプログラムを作成することによって、より効率的で正確に目的を達成することができるようになります。

課題

課題1

PerformanceTable5のソースコードに付け加えて、国語評価と同じように英語と数学の評価も条件分岐で行うマクロを作成してみましょう。その際に以下のようにしてみましょう。なお、成績の基準は国語と同じとします。

課題2

以下の手順と条件を満たすマクロを作成してみましょう。

※絶対値については、関数等を用いて算出できますが、この問題に関しては条件分岐で作成してください。

課題3

以下の手順と条件を満たすマクロを作成してみましょう。

課題4

以下の手順と条件を満たすマクロを作成してみましょう。

※なお、{セルA1}と{セルA2}は、それぞれのセルに入力してある値に置き換える。

上に戻る