前回までのプログラムは,単純な作業を実行するだけのものでしたが,状況によって処理の仕方を変えることにより,複雑な作業をするプログラムを書くことができます.このように状況に応じて処理を変化させることを「プログラムの制御」と言います.
一般に,プログラム言語に用意されている処理の仕方は大きく分けて3通りあります.
以上の構造を組み合わせることによって様々なプログラムを記述することができます.
分岐処理では,複数の処理から一つを選択するための「条件」を設定する必要があり,反復処理においては,繰り返しを続けるか終了するかを判定する「条件」を設定する必要があります.
最初に,この条件設定の記述の仕方を見ておきましょう.
一般的にプログラムにおける「条件」は,後述する「条件式」という何らかの関係が成立するかしないかを判定する仕方で扱います.この条件式のような「真」,「偽」のどちらかの値だけを取る型を「boolean型」(論理値型)と言います.
表記 | 意味 |
---|---|
true | 真 |
false | 偽 |
「条件式」は,プログラム上で同じ型の変数2つの間の関係を記述する数式の形で表されます.このために様々な条件に対応した関係を表す「関係演算子」が用意されています.
具体的には,二つの変数をそれぞれ X,Y とした場合以下のように記述します.そして,プログラム中で条件式が呼び出されると,その時に変数に代入されている「値」に対して関係式が評価され,条件が成立する場合:「真」が,成立しない場合:「偽」が結果として得られます.
条件式 | 関係演算子 | 意味 | 結果(boolean型) | |
---|---|---|---|---|
true(真) | false(偽) | |||
X < Y | < | 小さい | X < Y | X ≥ Y |
X > Y | > | 大きい | X > Y | X ≤ Y |
X <= Y | <= | 以下 | X ≤ Y | X > Y |
X >= Y | >= | 以上 | X ≥ Y | X < Y |
X = Y | = | 等しい | X = Y | X ≠ Y |
X <> Y | <> | 等しくない | X ≠ Y | X = Y |
これらの関係演算子を使用して,プログラム内の変数に対する「条件式」を記述してみます.
整数の変数 x の内容が5以上かどうか(5以上のとき真):x >= 5
整数の変数 x の内容が5かどうか(5のとき真):x = 5
doubleの変数 x の内容が3.5より小さいかどうか(3.5未満のとき真):x < 3.5
プログラムによっては,より複雑な条件を考える必要も生じます.しかし,関係演算子だけでは単純な条件式しか記述できません.従って,複雑な条件を記述しなければならない場合には,単純な条件式を組合せて複雑な条件式を記述することが出来るようになっています.
複数の条件式を組み合わせて一つの条件式を記述するために「論理演算子」と言う演算子が用意されています.
二つの条件式をそれぞれ A,B とすると.次のような論理演算子と組み合わせることで2つの条件式を組合せた条件式を記述できます.また,これらの論理演算子を複数使用し,2つ以上の条件式を多様に組み合わせることで,様々に組み合わされた複雑な条件式を記述することが可能です.
論理演算子 | 種類 | 意味 | 記述法 |
---|---|---|---|
And | 論理的AND | かつ | A And B |
Or | 論理的OR | または | A Or B |
Not | 論理否定 | でない | Not A |
論理演算の結果を表したものを「真理値表」と言い,それぞれの論理演算子によって,組み合わされる条件式の個々の真偽がどのように組み合わされるかを示しています.
A | B | A And B | A Or B | Not A |
---|---|---|---|---|
偽 | 偽 | 偽 | 偽 | 真 |
偽 | 真 | 偽 | 真 | 真 |
真 | 偽 | 偽 | 真 | 偽 |
真 | 真 | 真 | 真 | 偽 |
これらの論理演算子を使用して,複雑な条件式を記述できます.
整数の変数 x の内容が5以上かつ10未満かどうか(5以上かつ10未満のとき真):x >= 5 And x < 10
整数の変数 x の内容が5ではなく,整数の変数 y の内容が3かどうか(xが5でなくyが3のとき真):Not x = 5 And y = 3
doubleの変数 x の内容が 3.5 より小さいまたは,doubleの変数 y の内容が 7.5 より大きいかどうか:x < 3.5 Or y > 7.5
各自,様々な条件をどのように記述すれば良いかを考えてみましょう.論理演算子で結合した条件式は,基本的に左辺から順に評価されますが,括弧()で囲えば,その部分が先に評価されます.
条件によって処理の仕方を変更したい場合のプログラムの書き方を学習します.
最初の書き方は「If文」と呼ばれ,「If]で初めて「End If」までの間に記述します.
条件が成立する場合にだけ処理が実行されるIf文の書き方です.
条件が成立するときだけ処理を実行するには,次のような「If ~ Then」と言う構造を使用します.
If 条件式 Then 処理 End If
このように書くと,「条件式」が「真」のときだけ「処理」が実行されます.
得点がセルA2に入力されていて,得点が60点以上の時,セルB2に「合格」の判定を表示するプログラム
Sub gokaku()
Dim tokuten As Integer '変数tokutenを整数として宣言
tokuten = Range("A2").Value '得点を変数に代入
'分岐処理
If tokuten >= 60 Then
Range("B2").Value = "合格"
End If
End Sub
条件が成立する場合と成立しない場合とで実行される処理を分けるIf文の書き方です.
条件によって処理を分けるプログラムの構造.
If 条件式 Then 処理1 Else 処理2 End If
このように書くと,「条件式」が「真」のときは「処理1」が,「偽」のときは「処理2」が実行されます.
数値がセルA2に入力されていて,数値が偶数か奇数かを判定し,結果をB2に表示するプログラム
Sub even_odd()
Dim n As Integer '変数nを整数として宣言
n = Range("A2").Value '数値を変数に代入
'分岐処理
If n Mod 2 = 0 Then
Range("B2").Value = "偶数"
Else
Range("B2").Value = "奇数"
End If
End Sub
Excelのブックに新しいシートを追加し,VBEで新しい標準モジュールを挿入します.プロジェクトエクスプローラーに Sheet2 と Module2 が表示されるはずです.
Module2 のコードウィンドウに新しい Sub プロシージャを作成します.
次のどれかのプログラムを作成してください.
使用するセルはこのプログラムを登録するボタンの下に来る位置のセルにしてください.Sheet2にフォームコントロールのボタンを挿入し,プログラムを登録して名前を「ex_031a」または「ex_031b」または「ex_031c」に変えて下さい,ボタンはシートの左上あたりに配置してください.
複数の条件を設定し,条件ごとに処理を分けるIf文の書き方.
複数の条件を順番に適用し,成立する条件ごとに異なる処理を実行するプログラムの構造.
If 条件式1 Then 処理1 ElseIf 条件式2 Then 処理2 Else 処理3 End If
このように書くと,「条件式1」が「真」のときは「処理1」が,「条件式1」が「偽」で「条件式2」が「真」のときは「処理2」を,「条件式2」も「偽」であれば「処理3」が実行されます.さらに条件と処理がある場合は「ElseIf 条件式 Then 処理」の部分を繰り返します.
セルA2に入力した数値が,まず3の倍数かどうか判定し,3の倍数でない場合は5の倍数かどうかを判定して,結果を入力した数値の右に表示するプログラム
Sub hantei()
Dim n As Integer '変数nを整数として宣言
n = Range("A2").Value '数値を変数に代入
'分岐処理
If n Mod 3 = 0 Then
Range("B2").Value = "3の倍数です"
ElseIf n Mod 5 = 0 Then
Range("B2").Value = "3の倍数ではない5の倍数です"
Else
Range("B2").Value = "3の倍数でも5の倍数でもありません"
End If
End Sub
次のa,b,cのどれかを作ってみましょう.
コードウィンドウでプログラム ex_031x の下に新しい Sub プロシージャ「ex_032a」を作成します.
セルに入力した数値が,13で割り切れるかどうかを判定し,さらに割り切れる場合はそれが3の倍数かどうかを判定するプログラムを作ってみましょう.結果は数値を入力したセルの右のセルに表示しましょう.分かりやすくするために,使用するセルはこのプログラムを登録するボタンの下に来る位置のセルにしてください.プログラムはボタンに登録し,ボタンは
ex_031x の横に適当な間隔を開けて配置してください.
コードウィンドウでプログラム ex_031x の下に新しい Sub プロシージャ「ex_032b」を作成します.
セルに入力した数値が,3で割って余りが1かどうかを判定し,さらに1余る場合はそれが5の倍数かどうか,余りが1でない場合はそれが7の倍数かどうかを判定するプログラムを作ってみましょう.結果は数値を入力したセルの右のセルに表示しましょう.分かりやすくするために,使用するセルはこのプログラムを登録するボタンの下に来る位置のセルにしてください.プログラムはボタンに登録し,ボタンは
ex_031x の横に適当な間隔を開けて配置してください.
次のような図を「流れ図(フローチャート)」といい,プログラムの流れや構造を考えるときには非常に役に立つ.
考え方1(If文は入れ子に出来る:If文の処理の中さらにIf文を書く)
考え方2(論理演算子を使用して条件式をまとめて記述する)
コードウィンドウでプログラム ex_031xの下に新しい Sub プロシージャ「ex_032c」を作成します.
セルに図形の種類「球,円柱,円錐」と底面の半径と高さ(球の場合は半径だけ)を入力し,図形の種類に応じてその表面積と体積を計算させて入力したセルの下のセルに表示するプログラムを作ってみましょう.分かりやすくするために,使用するセルはこのプログラムを登録するボタンの下に来る位置のセルにしてください.プログラムはボタンに登録し,ボタンは
ex_031x の横に適当な間隔を開けて配置してください.
図形 | (ここに図形を入力) |
---|---|
半径 | (ここに半径を入力) |
高さ | (ここに高さを入力) |
表面積 | |
体積 |
2つめの書き方は「Select文」と言い,多数の条件を設定して,条件ごとに異なる処理をさせたいときに便利な書き方です.「Select」で始めて「End Select」までの間に記述します.
多数の条件を判定して,成立する条件ごとに異なる処理をするプログラムの構造.
Select Case 変数 Case 条件1 処理1 Case 条件2 処理2 Case 条件3 処理3 Case Else 処理4 End Select
このように書くと,「変数」に対して上から順に「条件N」を判定し,成立した条件の「処理N」を実行します.どの条件にも当てはまらない場合は最後の「Case Else」の処理が実行されます.
変数の値に対して,様々な場合に対応する条件は次のように記述します.
場合 | 条件 |
---|---|
変数の値が5の場合 | 5 |
値が20以上の場合 | Is >= 20 |
値が8未満の場合 | Is < 8 |
値が10以上15以下の場合 | 10 To 15 |
A2セルに数値を入力するとB2セルに上記の条件に対応した表示が出力されるプログラムを書いてみます.
Sub hantei2()
Dim kazu As Integer '変数 kazu を宣言
kazu = Range("A2").Value '数値を変数に代入
'分岐処理
Select Case kazu
Case 5
Range("B2").Value = "入力は5です"
Case Is >= 20
Range("B2").Value = "入力は20以上です"
Case Is < 8
Range("B2").Value = "入力は8未満です"
Case 10 To 15
Range("B2").Value = "入力は10以上15以下です"
Case Else
Range("B2").Value = "入力は条件外です"
End Select
End Sub
コードウィンドウでプログラム ex_032x の下に新しい Sub プロシージャ「ex_033」を作成します.
セルに得点を入力すると隣のセルに成績が出力されるプログラムを作成してください.成績は次の表に従って付けます.Case の条件の設定の記述は,Case条件が上から順に判定されることに注意して考えましょう.
得点 | 成績 |
---|---|
90以上 | 秀 |
80以上90未満 | 優 |
70以上80未満 | 良 |
60以上70未満 | 可 |
60未満 | 不可 |
0 | 不可(再試不可) |
入出力に使用するセルはこのプログラムを登録するボタンの下に来る位置のセルにしてください.プログラムはボタンに登録し,ボタンは ex_032x の横に適当な間隔を開けて配置してください.