ド素人でも学べる ExcelVBA 006 If文

ブログ

前回の復習

 前回はFor文を解説した。For文は Next と対で使用し内部の処理を字下げすることでプログラムの流れを見やすくするのだった。
 また、コメントや、ブレークポイントについても説明したが、これでプログラムの開発が効率的に出来るようになる。
 
 ところで、なぜ字下げや、コメントを付けるのだろうか?
 他の人にもプログラムを見やすくするため。そう考えているなら半分正解といったところだ。
 
 実はプログラムを読み返すのは自分自身であることが多い。
 そして、自分で書き残したプログラムであるにもかかわらず、どういう意図でプログラムしたのかわからなくなる事が多々ある。
 そのためにも、字下げでプログラムを見やすくして、コメントやコメントアウトは、未来の自分にメッセージを残しておくつもりで書くようにしよう。

 今回は、条件分岐を解説する。より複雑になってくるので、字下げ部分も真似して書いて、例題は必ず実行して試すようにしよう。

条件分岐

 条件分岐はIf文に代表される処理で、ある値と同じか違うか、ある値より大きいか小さいか等でその後の処理を変える役割を担っている。
 ここではIf文で条件分岐する方法を解説することにする。
 
 条件分岐では、必ず条件式がある。この条件式は必ず真(True)偽(False) の値となる。
 真(True) の場合は、内部処理を行い。偽(False)の場合は内部処理を行わずに次の処理に進む。

 このように、ある条件で処理を行ったり、行わなかったりでプログラムを分岐させる事ができる。

プログラムで色々な事を自動化できるのは、前回やった繰り返し処理と条件分岐が使えるからだ、変数は値を運ぶコンテナと考える事ができる。

 読者の中には「マクロの記録」を使った人もいるだろう。マクロの記録はプログラムコードを書きだしてくれるが、繰り返し処理、条件分岐の表現ができない。(変数はかろうじてSelectで表現できる。)だから、マクロの記録はやったことを真似する事は出来ても仕組みを作る事は出来ないのだ。マクロの記録の限界はここにある。

If文

 条件分岐の代表格はIf文だ。条件分岐には色々な種類があるが、まずはIf文をキチンと使えるようになろう。

 If文は、以下のような書き方が基本となる。
 
 If 条件式 Then
  条件式Trueだった場合の処理
 End If

 
 If文は、End If と対で書く。また、条件式の後に Then を付ける必要がある。
 実際の使い方は以下の通りだ。

Sub testIf1()
    Dim i As Long
    For i = 1 To 5
        If i = 3 Then
            Debug.Print i 
        End If
    Next i
End Sub

 このプログラムでは、i1 ~ 5 と変化していき、i 3 になった時に、Debug.Print i が実行される。
 結果はイミディエイトウィンドウに 3 と表示されるはずだ。

 プログラムでは、字下げを二重に行っている。こうする事で、繰返し部分と条件分岐する部分の流れがはっきりする。
 For と Next 、If と End If の頭は揃えるように書く。Tabキーを使えば、簡単に行頭を揃えられるので活用しよう。

条件式

 If文の要となるのが条件式だ。
 条件式は、その式が真(True)となるか偽(False)となるかを判断し、真の場合にIf文内部の処理を実行する事になる。
 上の例では、「 i = 3 」の部分が条件式となる。
 
 代入の際も = (イコール)が出てきたが、If文の条件式として使う場合は、「等しい」という意味で使われる。
(ここは勘違いしないでほしい)
 上記の場合、i For文で繰り返され、3 となった時に「 i = 3 」が真(True)となるので、IF文内部が実行される事になる。
 
 このように、条件式には、比較演算子論理演算子が使われる。
比較演算子や論理演算子に付いては以下のページも参照してほしい。
演算子

比較演算子

 比較演算子とは、その名の通り A と B を比較するための演算子になる。

演算子機能使用例意味
=等しいa = baとbは等しい
<>等しくないa <> baとbは等しくない
<小なりa < baはbより小さい
>大なりa > baはbより大きい
<=以下a <= baはb以下
>=以上a >= baはb以上
Likeパターンマッチングa Like [A-Z]aはA~Zの文字か
Is同じオブジェクトかa Is Nothingaは中身がない

次のプログラムの比較演算子 <> を上記の比較演算子と入れ替えて動作を確認してみよう。
(Like と Is は特殊なのでうまくいかないから注意)

Sub testIf2()
    Dim i As Long
    For i = 1 To 5
        If i <> 3 Then       'ここの条件式を変更して試してみよう!
            Debug.Print i
        End If
    Next i
End Sub

論理演算子

 論理演算子とはAND や OR の事だ。数学の集合で習った覚えがあると思う。

演算子機能使用例意味
And論理積(かつ)a>0 And a<10aは0より大きく10より小さい
Or論理和(または)a=0 Or a=1aは0または1
Not否定Not (a = 3)aは3ではない

 論理演算子は、条件式を複数積み合わせたいような場合に使用する。
 以下に色々な使い方の例を示したので、VBEで実行して結果が自分で想像したものと同じになるか確認してみよう。

Sub testIf3()
    Dim i As Long
    For i = 1 To 5
        '3以外で、2より大きい
        If i <> 3 And i > 2 Then
            Debug.Print i  
        End If
    Next i
End Sub
Sub testIf4()
    Dim i As Long
    For i = 1 To 5
        '3と等しいか、5と等しい
        If i = 3 Or i = 5 Then
            Debug.Print i  
        End If
    Next i
End Sub
Sub testIf5()
    Dim i As Long
    For i = 1 To 5
        '3より大きくなく、1より大きい
        If Not i > 3 And i > 1 Then   
            Debug.Print i
        End If
    Next i
End Sub
Sub testIf6()
    Dim i As Long
    For i = 1 To 5
       '3以外で、2より大きくない
       If i <> 3 And Not i > 2 Then 
            Debug.Print i
        End If
    Next i
End Sub
Sub testIf7()
    Dim i As Long
    For i = 1 To 5
        '「3以外で2より大きくない」を否定 
        If Not (i <> 3 And Not i > 2) Then 
            Debug.Print i
        End If
    Next i
End Sub

 やってみるとわかってくることだが、条件式の書き方は同じ内容でも何通りかの書き方ができる。
 大事なのは、何がしたいのかを明示的に表現する事だ。

 論理演算子を多用するとわかりずらくなるので多様しない方が良いだろう。それと Not は使わずに条件式の方を書き換えた方が見やすいだろう。

ElseIf と Else

 If文は、ElseIf と Else を使う事で連続して条件式と照らし合わせて処理を分岐させる事ができる。
 2つ目以降の条件式には、ElseIf を使い、最後にそれ以外という意味の Else を使う。

 ElseIf は何度でも重ねる事ができ、Else は最後に1回だけ使用できる。もちろん ElseIf や Else は無くても構わない。
 最後は End If が必要で、無いとエラーとなる。
 
 If 条件式1 Then
  条件式1がTrueだった場合の処理
 ElseIf 条件式2 Then
  条件式2がTrueだった場合の処理
 ElseIf 条件式3 Then
  条件式3がTrueだった場合の処理
 Else
  条件式1~3のどれにも当てはまらない場合の処理
 End If

 If文は、上から順番に条件式と照合していく。
 上のプログラムで、条件式2 で真(True)となった場合、条件式1 は照合を終えていますが、 条件式3 は照合せずに If文を出る。

 以下のサンプルプログラムをVBEで実行してみよう。
 出来れば、For文の所にブレークポイントを設置してステップ実行(F8キー)で一行づつ実行すれば、動きを観察できる。

Sub testIfElseIf()
    Dim num As Long
    num = 10
    If num Mod 2 = 0 Then
        Debug.Print "2で割り切れます。"
    ElseIf num Mod 3 = 0 Then
        Debug.Print "3で割り切れます。"
    ElseIf num Mod 4 = 0 Then
        Debug.Print "4で割り切れます。"
    Else
        Debug.Print "割り切れませんでした"
    End If
End Sub

 Mod は 第4回の数値計算のところで出てきた。
 初心者には馴染みがないと思いうが、Mod は割り算の余りを計算してくれる演算子だ。
 テスト用のコードを書いてみよう。

Sub testMod()
    Debug.Print 10 Mod 3
End Sub

 結果はイミディエイトウィンドウに 1 と表示される。

 これは 10 を 3 で割ったとき、余りが 1 という事になる。
 割り切れる場合は、0 が返る事になる。
 
 これで例題のプログラムの意味がわかると思う。
 num = 10 のところを色々な数字に変えて動作を確かめてみよう。
 最初の If文にブレークポイントを設置してステップ実行すれば動きがわかりやすいだろう。
 
 
 ところで、上記のプログラムには不具合がある。どこが間違っているかわかるだろうか?
 num = 8 で実行し見てみほしい。
 結果は、「2で割り切れます。」となる、正しいのだが 「4で割り切れます。」 は出てくることはない。
 
 このように、 If文は上から順番に条件式と照合していくという事に注意してほしい。
 上記のプログラムは、以下のように変更するべきだろう。

Sub testIfElseIf2()
    Dim num As Long
    num = 8
    If num Mod 4 = 0 Then
        Debug.Print "4で割り切れます。"
    ElseIf num Mod 3 = 0 Then
        Debug.Print "3で割り切れます。"
    ElseIf num Mod 2 = 0 Then
        Debug.Print "2で割り切れます。"
    Else
        Debug.Print "割り切れませんでした"
    End If
End Sub

 上記のように変更すれば、4で割る条件式が最初に実行されるようになる。このようにIf文では、条件式の順番うぃ間違えると思った通りにならない場合があるので注意するようにしよう。

まとめ

 今回の条件分岐 If文は難しく感じただろうか?
 If文の条件式は慣れないと難しく感じるかもしれない。さらに論理式(And や Or)で組み合わせるとわけがわからなくなってくることがある。

 出来れば条件式は単純にした方が良いが、そうもいかないというケースでは、ブレークポイントを設置してステップ実行しながら確かめてみるのが一番だ。Debug.Print やブレークポイントなどは、日常的に使えるようにしておこう。
 
 さて、ここまで変数、繰返し処理、条件分岐と一通り解説を終えたので、一応プログラミングの基礎は紹介した事になる。
 「これだけ?」と思うかもしれないが、For文やIf文は、組み合わせる事で複雑な処理を実現する事ができる。

 次回はセルについて学んでいこうと思う。これまで「プログラミングのためのプログラム」という感が強くて面白くなかったと思ううが、セルを扱えるようになれば実践的なプログラムに近づいていくので頑張って行こう。
 
 セルの扱いは非常に重要で覚える事も覚える事も多いのだが、よく使う機能を丁寧に説明していこうと思う。

コメント

タイトルとURLをコピーしました