エクセルマクロ備忘録

マクロ学習備忘録

もし○○なら ~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)」といった感じです。

 

この条件判定と次回書く予定の繰り返し処理を組み合わせると、業務自動化の世界がかなり広がります。正確に言えば、その世界を広げるための基礎になる、といったところでしょうか。

 

そんなわけで、今回はここまで。