
StockSnap / Pixabay
皆さまこんにちは!
このサイトの管理者のHide(ヒデ)と申します。
今回は、プログラミングの文法の1つであるIF文についてお伝えしていきたいと思います。
そういえば、Excelの関数にもIFという関数がありますね。「ExcelのIF関数はある条件に一致するかしないかでどちらの値を採用するか」という機能を持っています。プログラミングでのIFはIF文と呼ばれていて、「ある条件に一致した場合に処理を行うか、行わないか」というような考え方になります。
では、IF文とは何かについて詳しくみていきましょう。
1. IF文とは
まず、下記のTestという名前のプログラムをご覧ください。
Sub Test()
プログラムの命令その1
プログラムの命令その2
プログラムの命令その3
End Sub
これまで、プログラムは上から下に順番に実行されるということをお伝えしてきました。上記のプログラムも同じで「プログラムの命令その1」→「プログラムの命令その2」→「プログラムの命令その3」の順番で命令が実行されていきます。
では、ある条件のときだけ、「プログラムの命令その2」を実行したいとき、どうしたらよいでしょうか。このような時に利用するのが、今回お伝えするIF文になります。
IF文にはいくつかバリエーションがありますので、代表的なものを見ていきましょう。
2. IF文の動きとバリエーション
2-1-1. IF文の文法
まず、最もシンプルなIF文はどのように記述するかについてお伝えしますね。一番簡単で、基本的な形は下記のようになります。
If 条件式 Then
プログラムの命令その1
End If
<解説>
単純なIF文は上記のように書きます。IfやThenなどの文字は小文字で入力してもかまいません。Excelが自動的に先頭の文字を大文字に変換してくれます。この動きは、他のIF文でも同様となります。また、Ifと条件式、条件式とThenの間は半角のスペースを1つ開けて書いてください。
「条件式」という部分がありますが、ここには例えば「数値を格納している変数の内容とある数が一致したら」のような条件を書きます。上記の場合であれば、この条件に一致した場合に「プログラムの命令その1」の部分が実行され、一致しない場合は何もしないという動きになります。
そして「If 条件式 Then」と「End If」の間に実行させたいプログラムの命令を書いて行きます。このプログラムの命令は1つだけではなく複数書くことが可能です。
2-1-2. IF文のフローチャート
みなさんは、流れずとかフローチャートという言葉を聞いたことはありますか? 今回お伝えしているIF文はこのフローチャートを使うとプログラムの流れがつかみやすいので、ここでIF文のフローチャートを下図に掲載しましたのでご覧ください。
このような図のことをフローチャートと呼びます。ひし形の部分は条件式を表していて、長方形の部分は処理(プログラムの命令)を表しています。
この図の中の赤い文字の部分をご覧ください。少し見慣れない「True(真)」と「False(偽)」という文字が出てきました。まずこの用語についてご説明します。
プログラミングではIF文の条件が一致した時、条件は「True(真)」であるといい、条件に一致しない場合、条件は「False(偽)」であると言います。
この点については、実際のプログラムで改めて見ていきます。
先ほども少しお伝えしましたが、最もシンプルなIF文では、上図のフローチャートのような動きになります。つまり、条件式が「True(真)」の場合のみ、「命令その1」が実行され、条件式が「False(偽)」の場合は(「命令その1」をスキップして)何もしないという動きになることをおさえて頂ければと思います。
2-1-3. IF文のプログラム例
では、実際のプログラムの例を見てみましょう。まずは下記をご覧ください。
Sub Test1()
Dim x As Long
x = 5
If x = 5 Then
Debug.Print "xの内容は5です。"
End If
End Sub
上記のプログラムについて説明のために下記に各行の先頭に行番号を付けてみました。(実際のプログラムでは行番号は記述しませんのでご注意ください。)
01. Sub Test1()
02.
03. Dim x As Long
04. x = 5
05.
06. If x = 5 Then
07.
08. Debug.Print "xの内容は5です。"
09.
10. End If
11.
12. End Sub
では上記のプログラムについて解説します。
<解説>
01,12行目について:
まず、01行目にSub Test1() という記述がありますが、Test1という部分がプログラムの名前でプログラムの先頭を表します。01行目のように入力してEnterキーを押すと、自動的に12行目にあるEnd Subが入力されます。これはプログラムを最後を表すものです。プログラムは先頭から最後に向かって命令が実行されていきます。
02,05,07,09,11行目について:
この部分は空白行になっていますが、プログラミングではこのように自由に空白行を入れることが可能です。何も実行されませんが、プログラムを見やすくするための行とお考えください。
03行目について:
Dim x As Long と書くことで「整数を扱うxという変数を使います」と宣言している箇所になります。Longという部分(型)は整数を扱うという意味になります。
この03行目の記述によって変数xに整数を格納できるようになります。
04行目について:
「x=5」と書かれています。変数のブログでお伝えしましたが、この場合、右辺の「5」という内容が左辺の変数xに代入されるのでしたね。この行が実行されると、結果としてxの内容は「5」になります。(詳しく言うとxの内容が「0」から「5」に変わります。)
06~10行目について:
この部分がIF文の骨格となる部分になります。
06行目はIF文の開始部分になります。06行目に「x=5」とありますが、これがIF文の条件式になります。変数のブログのところで「=」の記号は右辺の内容を左辺の変数に代入する意味があるとお伝えしました。ただ、If文の条件式の場合は例外で、条件式にこのような記述がされた場合、「xと5が等しかったら」という意味になります。この点にご注意ください。(※1)
04行目で変数xの内容は「5」になっているとお伝えしました。では、06行目の条件式はどのように判断されると思いますか?そうですね、変数xと「5」は等しいわけですから、条件は「True(真)」となり、08行目の「Debug.Print "xの内容は5です。"」という命令が実行されます。逆にもし変数xの内容が「5」でなければ、条件は「False(偽)」となり08行目は実行されない動きとなります。
08行目はVBEの画面のイミディエイトウィンドウに「xの内容は5です。」と表示する命令になります。ここで、「Debug.Print」という命令の先頭に少しスペースがあることに気づかれましたでしょうか?これはプログラミングでよく行われる字下げというもので、プログラムを見やすくするためのものになります。Tabキーを1回押してスペースを空けることが多いですが、IF文の骨格がわかりやすいように「If 条件式 Then」と「End If」の間にある命令は字下げして見やすくするという工夫になります。
10行目の「End If」はIf文の最後を表すものとなります。
今回のプログラムを実行するとIF文の条件は真のため、下図のようにイミディエイトウィンドウに「xの内容は5です。」と表示されます。
補足:
※1について:条件式で「xと5が等しかったら」と書く場合、他のプログラミング言語では変数へ値を代入する時と区別するために「x==5」のように「=」を2つ書く言語も多いですが、Excel-VBAの場合は「=」1つで表すことにご注意ください。
また、「xと5が等しかったら」ではなく、「xと5が異なっていたら」と書く場合は条件式に「x<>5」と記述します。「<>」と書くことで左辺と右辺が等しくないという意味になりますので合わせて覚えておいてください。(※「<>」の部分は半角となります。)
ここまででお伝えした条件式での「=」や「<>」の使い方は数値の変数だけでなく、文字の変数でも同じになります。例えばResultという変数が文字を扱う変数であれば、Result="Test"やResult<>"Test"と書くことで変数の内容と文字を比較することが可能です。
それでは他のIF文のバリエーションについても見ていきましょう。
2-2-1. IF~Elseの文法
IF文のバリエーションの1つとしてIF~Elseという形があります。このIF文の書き方についてご覧ください。
If 条件式 Then
プログラムの命令その1
Else
プログラムの命令その2
End If
<解説>
先ほどの最もシンプルなIF文では、条件式が「True(真)」でない場合には、何もしない動きでしたが、このIF文は条件式が「False(偽)」の場合に上記の「プログラムの命令その2」の部分が実行されるという点が異なります。条件式が「False(偽)」の場合に実行したい命令をElseとEnd Ifの間に記述するという点をおさえてください。上記では説明を簡単にするため、IfとElseの間、ElseとEnd Ifの間のプログラムの命令はそれぞれ1つしか書いていませんが、実際には複数書くことも可能です。この動きについてフローチャートで詳しく見ていきましょう。
2-2-2. IF~Elseのフローチャート
下図がIF~Elseのフローチャートになりますのでご覧ください。
このフローチャートは、もし条件式が「True(真)」だった場合は、「命令その1」が実行され、条件式が「False(偽)」だった場合は、「命令その2」が実行されるという意味を表しています。
2-2-3. IF~Elseのプログラム例
では、実際のプログラムの例を見てみましょう。
Sub Test2()
Dim x As Long
x = 5
If x = 7 Then
Debug.Print "xの内容は7です。"
Else
Debug.Print "xの内容は不明です。"
End If
End Sub
上記のプログラムについて説明のために下記に各行の先頭に行番号を付けてみました。(実際のプログラムでは行番号は記述しませんのでご注意ください。)
01. Sub Test2()
02.
03. Dim x As Long
04. x = 5
05.
06. If x = 7 Then
07.
08. Debug.Print "xの内容は7です。"
09.
10. Else
11.
12. Debug.Print "xの内容は不明です。"
13.
14. End If
15.
16. End Sub
<解説>
今回のTest2というプログラムはTest1のプログラムを少し変えただけですのでポイントとなる部分を解説してきます。
06~14行目について:
この部分がIf~Elseの骨格となる部分になります。
06行目は「変数xと7が等しかったら」という意味になります。この変数xは04行目で「5」になっていますから、変数xと7は等しくありませんね。ということでこの条件は「False(偽)」となります。
先ほど、条件が「False(偽)」の場合、ElseとEnd Ifの間の命令が実行されるとお伝えしました。そのため、このプログラムでは12行目の「Debug.Print "xの内容は不明です。"」という命令が実行され、イミディエイトウィンドウに下図のように「xの内容は不明です。」と表示されます。
もう1つIF文のバリエーションについても見ていきましょう。
2-3-1. IF~ElseIfの文法
IF文のもう1つのバリエーションとしてIF~ElseIfという形があります。このIF文の書き方についてご覧ください。
If 条件式1 Then
プログラムの命令その1
ElseIf 条件式2 Then
プログラムの命令その2
ElseIf 条件式3 Then
プログラムの命令その3
Else
プログラムの命令その4
End If
<解説>
このIF~ElseIf...という文は、これまでのIF文のように条件が1つではなく、複数ある場合に利用します。書き方の注意点ですが、最初の条件式の先頭はIfから始まりますが、2つ目以降の条件式の先頭はElseIfと書く点です。
この形のIF文は、まず「条件式1」が判定され、結果が「True(真)」であれば、「プログラムの命令その1」が実行されます。ポイントは、この「プログラムの命令その1」が実行されたら、残りの「条件2」や「条件3」などの判定は行われず、全てスキップされるという点です。
もし「条件式1」が「False(偽)」であれば、「条件式2」の判断に移ります。「条件式2」が判定され、結果が「True(真)」であれば、「プログラムの命令その2」が実行されます。先ほどと同様に、この「プログラムの命令その2」が実行された後は、残りの「条件3」などの判定は行われずにスキップされます。
もし、「条件式2」が「False(偽)」であれば、「条件式3」の判断に移ります。...
このように条件式が「True(真)」であれば、その条件式の下にあるプログラムが実行されてIF文の処理は終了となり、もし条件式が「False(偽)」であれば、次の条件式に移って判定を行うというように条件式が「False(偽)」の場合は次の(さらに下にある条件式の)判定へと移っていきます。
最終的にどの条件式も「False(偽)」だった場合、最後のElseの下のプログラムの命令が実行されます。
上記では説明を簡単にするため、IfとElseIfの間、ElseIfとElseIfの間、ElseとEnd Ifの間のプログラムの命令はそれぞれ1つしか書いていませんが、実際には複数書くことも可能です。
文章だけの説明だけだと難しいかもしれませんので、If~ElseIfのフローチャートを見てみましょう。
2-3-2. IF~ElseIfのフローチャート
下図がIF~ElseIfのフローチャートになりますのでご覧ください。
このフローチャートを見て複数ある条件のどれかが「True(真)」になったら、それに対応する命令が実行された後は、残りの条件式の判定は行われないというイメージがご理解頂けましたでしょうか。
補足になりますが、今回は条件式が3つある場合のケースでご紹介していますが、さらに4つ、5つと条件式が増える場合はElseIfの部分を増やすことで対応可能です。また、全ての条件式が「False(偽)」の場合に何も処理を行わない場合はElseの部分を省略することも可能です。例えば下記のような形ですね。
If 条件式1 Then
プログラムの命令その1
ElseIf 条件式2 Then
プログラムの命令その2
End If
2-3-3. IF~ElseIfのプログラム例
では、実際のプログラムの例を見てみましょう。
Sub Test3()
Dim x As Long
x = 5
If x = 7 Then
Debug.Print "xの内容は7です。"
ElseIf x=9 Then
Debug.Print "xの内容は9です。"
ElseIf x=11 Then
Debug.Print "xの内容は11です。"
Else
Debug.Print "xの内容は不明です。"
End If
End Sub
上記のプログラムについて説明のために下記に各行の先頭に行番号を付けてみました。(実際のプログラムでは行番号は記述しませんのでご注意ください。)
01. Sub Test3()
02.
03. Dim x As Long
04. x = 5
05.
06. If x = 7 Then
07.
08. Debug.Print "xの内容は7です。"
09.
10. ElseIf x=9 Then
11.
12. Debug.Print "xの内容は9です。"
13.
14. ElseIf x=11 Then
15.
16. Debug.Print "xの内容は11です。"
17.
18. Else
19.
20. Debug.Print "xの内容は不明です。"
21.
22. End If
23.
24. End Sub
<解説>
今回のTest3というプログラムはTest2のプログラムを少し変えただけですのでポイントとなる部分を解説していきます。
06~22行目について:
この部分がIf~ElseIfの骨格となる部分になります。このIf文の条件式は06,10,14行目にあり、06行目の条件式から順に判定されていきます。
今回のプログラムの場合、04行目でxの内容が「5」になっていますね。
06行目の条件式は「xと7が等しかったら」ですので、この条件は「False(偽)」となり、次の条件式である11行目の条件式の判定の行にプログラムが進みます。
10行目の条件式は「xと9が等しかったら」ですので、この条件も同じく「False(偽)」となり、次の条件式である14行目の条件式の判定の行にプログラムが進みます。
14行目の条件式は「xと11が等しかったら」ですので、この条件も同じく「False(偽)」となります。次の条件式はもうありませんので、06,11,14行目のどの条件にも該当しなかったことになります。この場合、18行目のElseの下にあるプログラム、つまり、20行目の「Debug.Print “xの内容は不明です。”」という命令が実行され、イミディエイトウィンドウに下図のように「xの内容は不明です。」と表示されます。
ここまでで、IF文とは何か、またIF文のいくつかのバリエーションについて見てきました。
では実際にプログラムを動かしてみましょう。
3. 実際にプログラムを動かしてみましょう
では先ほどご説明したプログラムをVBEのコード画面に入力して動かしてみましょう。
3-1. モジュールを追加する
今回、VBEの画面で下図のように新しいモジュールを追加して、赤枠部(1番)のように名前を「Mo03_If」としました。また、モジュールを追加した際に赤枠部(2番)のようにコード画面の先頭に「Option Explicit」という文字が挿入されていることを確認してください。
モジュールの作成方法や名前の変更方法については、下記のブログをご覧ください。
モジュールの作成方法について解説したブログはこちら
モジュール名の変更方法について解説したブログはこちら
3-2. プログラムを入力する
モジュールが追加できたら、下図のようにプログラムを入力してみましょう。今回はいくつかあるIf文の中で3つ目にご紹介したTest3のプログラムを入力してみましょう。
3-3. 1行ずつプログラムを動かしてみる
プログラムは入力できましたでしょうか。それではプログラムを動かしてみましょう。通常、プログラムの動かす場合、動かしたいプログラムの中(このプログラムであれば、Sub Test3() と End Sub の間)にカーソルを置いてF5キーを押します。
この方法でもよいのですが、今回はステップ実行というプログラムを1行ずつ動かせる便利な機能を使って動かしてみたいと思います。カーソルを上記のようにプログラムの中に置いた状態でキーボードのF8キーを1回押してみてください。すると下図のように、プログラムの先頭が黄色でハイライトされました。
続いて、F8キーを2回押してみましょう。すると(Dimから始まる変数の宣言の部分はプログラムの命令ではないので通過して)「x=5」という変数xへの代入式が実行された後、下図のように最初のIF文の条件式の行がハイライトされました。ハイライトされた部分はこれから実行される命令を表していてまだ実行されていません。先ほどお伝えしたように、上図の最初の条件式「x=7」は「False(偽)」でしたね。ではもう1回、F8キーを押したらどうなるか確認してみましょう。
すると下図のように2番目の条件式である「x=9」の行がハイライトされました。条件式「x=9」も「False(偽)」でしたね。ではもう1回、F8キーを押したらどうなるか確認してみましょう。
すると下図のように3番目の条件式である「x=11」の行がハイライトされました。条件式「x=11」も「False(偽)」でしたね。ではもう1回、F8キーを押したらどうなるか確認してみましょう。
すると下図のようにElseの行がハイライトされました。今までの3つの条件が全て「False(偽)」であったため、全ての条件に一致しなかった場合のElseの行に処理が移ってきたという動きになります。ではもう1回、F8キーを押してみましょう。
すると下図のようにElseの下にある「Debug.Print "xの内容は不明です。"」の行がハイライトされました。この黄色でハイライトされた行は命令が実行される直前という意味になります。つまり、これからこのハイライトされた行が実行されるということですね。それではもう1回、F8キーを押してみましょう。
すると下図のようにイミディエイトウィンドウに「xの内容は不明です。」と表示されました。
これ以降の動きはありませんが、あと3回、F8キーを押してみましょう。これで黄色のハイライトが消え、プログラムが完全に終了します。ちなみに、途中でプログラムを終了したい場合はVBEのメニューにあるリセットボタンを押してください。(下図赤枠部のボタンになります)
ここまでで、実際にIF文を使ったプログラムの動きを見てきました。条件式が複数ある場合は、ElseIfで条件式を追加することができるという点、また、条件式の結果が「False(偽)」の場合は次の条件式の判定に移るという動きが少しずつ見えてきたのではないでしょうか。
4. IF文 番外編
4-1. IF文の色々な書き方
ここでは、IF文を使ってプログラミングするときに、「あれ?この場合はどうなの?」という点についてお伝えしたいと思います。
下記の2つのパターンをご覧ください。
<パターン1>
Sub Pattern1()
Dim Result As String
Result="Win"
IF Result="Win" Then
Debug.Print "試合に勝ちました。"
End IF
IF Result="Lose" Then
Debug.Print "試合に負けました。"
End IF
End Sub
<パターン2>
Sub Pattern2()
Dim Result As String
Result="Win"
IF Result="Win" Then
Debug.Print "試合に勝ちました。"
ElseIf Result="Lose" Then
Debug.Print "試合に負けました。"
End IF
End Sub
上記の2つのプログラムを見てどう思われましたか?パターン1はシンプルなIF文が2つ別々に書かれていて、パターン2は、IF~Elseの形でまとまった形です。2つのパターンの違いはわかりますか?
この2つのパターンのIF文ですが、どちらを実行してもイミディエイトウィンドウに「試合に勝ちました。」と表示されます。ですのでどちらも正しいといえば正しいです。しかし動きに違いがあります。
パターン1では、IF文が別々に書かれているため、どちらのIF文も実行されますが(それぞれの条件式である「Result="Win"」と「Result="Lose"」のどちらも判定されますが)、パターン2の場合、最初のIFの条件式である「Result="Win"」が「True(真)」になり、「Debug.Print "試合に勝ちました。"」の命令が実行された後、ElseIfの条件式である「Result="Lose"」は行われずにスキップします。
今回のプログラムではパターン1、パターン2ともにどちらも同じ結果になりましたが、条件式をどちらも判定させる必要がある場合は、パターン1で書く必要があります。
また、今回の例ように「Win」と「Lose」のように二者択一や、三者択一のように「あるものの中から1つだけ選ぶ」ような場合、パターン1だと最初のIF文で「Result="Win"」が「True(真)」とわかってしまうため、2つ目のIF文の「Result="Lose"」の判定は無駄な判定をしていることになります。(IF文の書く順番を逆にした場合は無駄になりませんので、ケースによります)そのため、今回のケースのように二者択一のような場合はパターン2の方が良い書き方と言えます。また択一の選択肢が多いほど、パターン2の記述の方が無駄な判定をする確率が少なくなります。IF~ElseIfの形式は二者択一や、三者択一の場合に適しているという点をおさえてください。
パターン2のIF~ElseIfを使う方法についてもう1点補足があります。それは、最後に記述する条件式について必ず結果が「True(真)」になると分かり切っている場合は、ElseIfを使って判定せずにElseとしてもよいということです。上記のパターン2の場合を例にとると、変数Resultの取りうる値が"Win"と"Lose"の他にもあるなら別ですが、"Win"と"Lose"の2つだけであれば、「ElseIf Result="Lose" Then」の部分は「Else」にしてもよいです。
この書き方の問題については、プログラミングする方の好みやケースにもよりますので状況に応じて選択して頂ければと思います。
私もプログラムを書いていると、この場合どちらになるかな?と多少迷うことがありますが、今回のケースを参考にどちらのIF文のパターンで書けば良いか判断するとよいでしょう。
4-2. 複数の条件を同時に判定するIf文の書き方
これまで、If文には1つの条件式のみ記述していました。例えば下記のような形ですね。
If x=1 Then
Debug.Print "xの内容は1です。”
End If
では、例えばxが「1」と一致し、yが「5」と一致したらIf文に書かれた命令を実行したい場合、どのように書けばよいでしょうか。この場合、下記のように記述します。
If x=1 And y=5 Then
Debug.Print "条件に一致しました。"
End If
このように「条件A」と「条件B」の2つの条件が共に成立する(どちらの条件も「True(真)」である)場合にIF文に書かれた命令を実行したい場合は、2つの条件式を「And」でつなぎます。
では、例えばxが「1」と一致するか、yが「5」と一致したらIf文に書かれた命令を実行したい場合、どのように書けばよいでしょうか。この場合、下記のように記述します。
If x=1 Or y=5 Then
Debug.Print "条件に一致しました。"
End If
このように「条件A」と「条件B」の2つの条件の内、どちらか1つでも成立したら(どちらか1つでも条件が「True(真)」である)場合にIF文に書かれた命令を実行したい場合は、2つの条件式を「Or」でつなぎます。
このように複数の条件を同時に判定したい場合は「And」や「Or」を利用すると覚えましょう。また条件式はさらに3つ4つとつなげていくことも可能です。
今回、「And」と「Or」を使ったIf文の書き方をお伝えしましたが、私の場合、「And」や「Or」とその両隣りに記述する条件式との区切りが分かりやすいように「()」を使って下記のように記述することが多いです。
If (x=1) And (y=5) Then
Debug.Print "条件は一致しました。"
End If
上記のように書くこともできます。
もう1点補足になりますが、「And」を使った2つの条件を満たすIf文は下記のように書いても同じです。
If x=1 Then
If y=5 Then
Debug.Print "条件は一致しました。"
End If
End If
このようにIf文の中にさらにIf文がある書き方をIf文の入れ子といいます。入れ子にする場合、内側のIf文について外側のIf文より一段奥に書いて(字下げして)、内側と外側のIf文の組み合わせを分かりやすくします。
Andで判定しなければならない条件が多かったり、プログラム的にAndよりもIf文の入れ子にした方が見やすい場合にこのように書くこともあります。
If文には色々な書き方があるということですね。
4-3. 大小関係を判定するIf文の書き方
If文では、単に「変数」と「ある数」が一致しているかという条件式だけでなく、「変数」と「ある数」の大小関係を判定する条件式を書くことも可能です。数学では「≧」,「>」,「≦」,「<」のような不等号や等号付き不等号を使って数の大小関係を表しますが、プログラミングでは不等号や等号付き不等号をそれぞれ「>=」,「>」,「<=」,「<」のように半角で記述し、等号付き不等号については2文字に分割して記述します。
例えば、下記のIf文は「変数xの中身が5以上だったら」という条件を表す式になります。
If x>=5 Then
Debug.Print "xは5以上です。"
End If
5. まとめ
長くなりましたが、今回はIF文とは何かということで、文法と実際のプログラムの例について見てきました。
最後までお読み頂きありがとうございます。
お疲れさまでした!
【電子書籍出版のご案内】
本ブログで扱っている「Excel VBA 入門」の内容が、内容を大幅に増やした形で電子書籍(Kindle)になりました。ご興味のある方は、ぜひご覧頂ければ幸いに存じます。
Excel VBA に挫折しないためのプログラミング超入門 (基礎から応用まで)