もし○○なら ~if文:条件分岐~
随分間隔があいてしまいました。
違うんです、仕事の自動化とかPythonかじり始めるとかやってたら(ry
そんなわけで、今回はif文を用いた条件分岐について書きます。
【説明:if文による条件分岐】
さて、皆様は「if」という英語の意味をご存知ですか?
・・・まあ、なめんなよって言わないでください。聞いてみただけです。
そうです、この記事のタイトルのとおり、「もし○○なら」という意味ですね。
マクロVBAにおいても実は同じような意味を持ちます。
この文を使うと、
★一定の条件のときだけ特定の操作を行う
といった形で、操作に条件をつけることができます。
これを条件分岐、といったりします。
この条件分岐の概念は、業務を自動化する際には必須といってもいいでしょう。
自動化とは言いつつ、おそらくどんな業務にも「この時はこうする」「あの時はあーする」といったパターンがあるはずで、その時々の条件で行う操作は変わりますよね。
たとえば、学生や社員の成績判定とかです。
100点満点中90点以上なら「A」、70点以上なら「B」・・・・
といった具合に、数値の大きさで判定をする場合はまさに、
★もし○○なら××
ですよね。これをVBAで設定するために、if文は必要なのです。
【説明:if文の構文】
VBA上でifを書く際の構文は、以下のとおりです。
if ○○(条件式)then
○○の時の処理
else
○○でない時の処理
end if
さっきの成績判定を例にとって見ると、
if score >= 90 then
Range("A1") = "A"
else
Range("A1") = "B"
end if
って感じですね。
※scoreはあらかじめ変数宣言、得点が代入された変数、A1セルが判定結果を表示するセルという想定です。
○○でない時に何も処理をしない場合は、elseと処理を省略してもいいです。が、何もしない場合でもelseを入れることをお勧めします。理由は後述 。
【説明:if文の入れ子】
先ほどの例だと、条件が1つしか分岐していません。成績判定の例で言えば、90以上か未満かしか判定できていませんね。
一般的に成績の判定なんてのはA~CだったりA~Eだったり、少なくとも2~4つくらいの基準で分類される物でしょう。
そんなときは、if文を複数指定することで条件を実装することができます。
成績の例に則して書いてみます。
if score >= 90 then
Range("A1") = "A"
else
if score >=70 then
Range("A1") = "B"
else
Range("A1") = "C"
end if
end if
上記の例だと、scoreが90以上なら”A”、90未満70以上なら”B”、70未満なら”C”と判定されます。
こんな風に、if文の中にさらにif文を入れ込むことを「入れ子にする」とか言います。
気をつけたいのは、入れ子にする位置で論理構造が結構変わるということです。例えば、
if score >= 90 then
if score = 100 then
Range("A1") = "S"
else
Range("A1") = "A"
end if
else
Range("A1") = "B"
end if
この場合だと、scoreが90点以上のとき、100点なら”S”、それ以外は”A”、そもそも90未満なら”B”という判定になります。
if文を記述するときには、ロジックに注意して記述するようにしましょう。
【実践 : 成績判定】
何度も成績判定を例示したので、実践もこれでいきましょう。
以下の様な設定を考えます。
・とある講義で、受講生には「課題」と「テスト」が課せられます。
・課題を提出しなければ、その時点で講義は未修となります。
・テストは100点満点で80点と50点をスコア(A〜C)の分かれ目にします。
例えば、課題を提出してテストで75点を取ったら、スコアBで修了、という具合です。
A1セルに課題の提出有無、A2セルにテスト点数を入力、マクロを実行すると判定結果がA3セルに出力される、という様なマクロを描いてみましょう。
sub 成績判定()
Dim task, score
task = cells(1, 1) ‘提出なら1、未提出は0として入力する。
score = cells(2,1)
if task = 1 then
if score >= 80 then
cells(3, 1) = “A”
else
if score >= 50 then
cells(3,1) = "B"
else
cells(3,1) = "C"
end if
end if
else
cells(3,1) = "未修"
end if
end sub
一応書いたマクロの””内の成績判定が上位から順になるようなif文にしてみました。
特に、設定した条件とelse以下の記述との関係はかなり重要です。
たとえば、「f score >= 50 then」以下の記述の位置がその直前のelseより前に来てしまうと、
・scoreが90以上のとき”A”を入力する。
・scoreが50以上のとき”B”を入力し、未満のときは”C”を入力する。
・scoreが90未満のときは何もしない。
という順番で実行され、scoreが90以上であったとしても後から”B”が上書きされます。
設定する条件の論理関係はきちんと把握した上で記述しましょう。
そういった意味でも、if文を練習するときは処理を何もしないときでもelseを記述することをお勧めします。「○○のときは(if ○○ then)処理A、そうじゃないとき(else)は何もしないで終わり(end if)」といった感じです。
この条件判定と次回書く予定の繰り返し処理を組み合わせると、業務自動化の世界がかなり広がります。正確に言えば、その世界を広げるための基礎になる、といったところでしょうか。
そんなわけで、今回はここまで。