VBAでIfを使って分岐する

2018.09.18マクロ、VBA

ExcelにはIF関数で、条件によって求めるや計算方法を変更することができますが、VBAでも同じように条件によって処理の流れを変更することができます。
VBAには条件分岐の手法は複数ありますが、その中でも基本のIfについて解説します。
記事内のVBAで実際に動作する箇所は枠で囲んであります。
実際に動作させるには、次の手順で行います。
シート見出しを右クリックして、コードの表示をクリックします。

シート右クリック

 

VBAを操作するVBE(Visual Basic Editor)が立ち上がります。

ブックプロジェクトを右クリック

 

プロジェクトの画面で、Book1などの現在操作しているブック名を右クリックします。

ブックプロジェクトを右クリック

 

挿入の中の標準モジュールをクリックします。

標準モジュールの追加

 

VBAプロジェクトの中に、VBAを記載することができる、標準モジュールが挿入され、右のウィンドウに挿入した標準モジュールのModule1の編集画面が表示されます。

Module1の表示

 

この画面に記事内の文書を入力、またはコピーアンドペーストします。
記事内のVBAの左に記載されているのは行番号です。「:」まで含めてVBAには必要ありませんので、入力はしません。

VBAの入力

 

記入したVBAのどこかをクリックしてから、VBEの実行ボタンをクリックすると実行されます。

実行

Ifの書式のキホン

Ifの基本は次の書式です。
If 条件 Then
  条件に当てはまった場合の動作
End If

「If」に続き条件、そのあとに「Then」、条件に当てはまったときに動作する内容を記述し、最後に「EndIf」でワンセットです。
セルA1に「当たり」と入力されていた時に、セルB1に「当選しました」と表示し、フォントサイズを32ptにする「分岐1」という名前のVBAは次の通りです。

1:Sub 分岐の実験1()
2:If Range("A1").Value = "当たり" Then
3:    Range("B1").Value = "当選しました"
4:    Range("B1").Font.Size = 32
5:End If
6:End Sub

1行目は、「分岐1」というマクロ名ということを宣言しています。
2行目は、セル(Range)A1の値(Value)が「当たり」だったら、という意味です。
3行目は、セル(Range)B1の値(Value)を、「当選しました」にする、という意味です。
4行目は、セル(Range)B1のフォント(Font)のサイズ(Size)を、32にする、という意味です。
5行目は、ここまででIfが終わり、という意味です。
6行目は、ここまででマクロが終了という意味です。
Excelワークシート関数は、次のような書式です。
=IF(A1=”当たり”,”当選しました”)
のように1行の中に、条件と条件に合った時に求める値を表記します。
このIF関数はセルA1が「当たり」の時は「当選しました」と表示されますが、「当たり」以外のときは、条件に当てはまらなったので「FALSE」と表示してしまいます。
それを回避するためには次のように、条件が当てはまった場合として空白文字を指定します。
=IF(A1=”当たり”,”当選しました”,””)
VBAのIfでは、条件に当てはまらなければ何もしないので、指定する必要がなければ全く指定しなくてよいです。

Ifの書式・~ではなかったら

では、条件に当てはまらなかった時の動作はどのように記述すればよいでしょうか。
その場合は次の書式です。
If 条件 Then
  条件に当てはまった場合の動作
Else
  条件に当てはまらなかった場合の動作
End If

「If」に続き条件、そのあとに「Then」、条件に当てはまったときに動作する内容を記述し、「Else」、条件に当てはまらなかったときに動作する内容を記述し、最後に「EndIf」でワンセットです。
セルA1に「当たり」と入力されていた時に、セルB1に「当選しました」と表示しフォントサイズを32ptにする「分岐1」にする、そうではない場合は、セルB1に「残念でした」と表示しフォントサイズを16ptにする「分岐2」にする、という名前のVBAは次の通りです。

1:Sub 分岐の実験2()
2:If Range("A1").Value = "当たり" Then
3:    Range("B1").Value = "当選しました"
4:    Range("B1").Font.Size = 32
5:Else
6:    Range("B1").Value = "残念でした"
7:    Range("B1").Font.Size = 16
8:End If
9:End Sub

1行目から4行目までは、基本と同じです。
5行目は、そうではなかったら(Else)という意味です。
6行目は、セル(Range)B1の値(Value)を、「残念でした」にする、という意味です。
7行目は、セル(Range)B1のフォント(Font)のサイズ(Size)を、16にする、という意味です。
8行目は、ここまででIfが終わり、という意味です。
9行目は、ここまででマクロが終了という意味です。

Ifの書式・~ではなくてもし~だったら

条件が2種類よりも増えると条件に当てはまる、当てはまらないだけではなく、当てはまらない場合でもしも次の条件だったら、という要素も追加する必要があります。
その場合の書式は次の通りです。
If 条件1 Then
  条件1に当てはまった場合の動作
Else If 条件2 Then
  条件2に当てはまらなかった場合の動作
Else If 条件3 Then
  条件3に当てはまらなかった場合の動作



End If

「そうではなくてもし」は「Else If」ということになります。
「If」に続き1つ目の条件、そのあとに「Then」、1つめの条件に当てはまったときに動作する内容を記述し、「Else If」、2つ目の条件、そのあとに「Then」、と、どんどん条件とそれに対する動作を追加していき、最後に「EndIf」でワンセットです。
セルA1に「当たり」と入力されていた時に、セルB1に「当選しました」と表示しフォントサイズを32ptにする、そうではなくて「大当たり」の場合は、セルB1に「当選しました」と表示しフォントサイズを72ptにする、そうではなくて「はずれ」の場合は、「残念でした」と表示しフォントサイズを18ptにする「分岐3」という名前のVBAは次の通りです。

1:Sub 分岐の実験3()
2:If Range("A1").Value = "当たり" Then
3:    Range("B1").Value = "当選しました"
4:    Range("B1").Font.Size = 32
5:ElseIf Range("A1").Value = "大当たり" Then
6:    Range("B1").Value = "当選しました"
7:    Range("B1").Font.Size = 72
8:ElseIf Range("A1").Value = "はずれ" Then
9:    Range("B1").Value = "残念でした"
10:    Range("B1").Font.Size = 16
11:End Sub

1行目から4行目までは、基本と同じです。
5行目は、そうではなくてもし(Else If)大当たりだったらという意味です。
6行目は、セル(Range)B1の値(Value)を「残念でした」に、7行目は、セル(Range)B1のフォント(Font)のサイズ(Size)を72にする、という意味です。
8行目は、ここまででIfが終わり、という意味です。
9行目は、ここまででマクロが終了という意味です。

Ifの書式・~ではなくてもし~だったら、最終的に当てはまらなかったら

複数の条件を設定し、すべての条件にあてはまらなかった場合もあり得ます。
想定している通り以外の選択肢があるかもしれません。また、100ある選択肢の中で3ケースのみ指定した動作をさせて他の場合は一括で動作をしたい場合もあるでしょう。
そのようなときは、次の通りになります。
If 条件1 Then
  条件1に当てはまった場合の動作
Else If 条件2 Then
  条件2に当てはまらなかった場合の動作
Else If 条件3 Then
  条件3に当てはまらなかった場合の動作



Else
  すべての条件に当てはまらなかった場合の動作
End If

指定したいすべてのケースを「If」、「Else If」で記述し、最後にそれまでのケースにどれも当てはまらなかったら「Else」で記述した動作をします。
セルA1に「当たり」と入力されていた時に、セルB1に「当選しました」と表示しフォントサイズを32ptにする、そうではなくて「大当たり」の場合は、セルB1に「当選しました」と表示しフォントサイズを72ptにする、そうではなくて「はずれ」の場合は、「残念でした」と表示しフォントサイズを18ptにする、すべてのケースに当てはまらないときは、セルB1の値をクリアする「分岐4」という名前のVBAは次の通りです。

1:Sub 分岐の実験4()
2:If Range("A1").Value = "当たり" Then
3:    Range("B1").Value = "当選しました"
4:    Range("B1").Font.Size = 32
5:ElseIf Range("A1").Value = "大当たり" Then
6:    Range("B1").Value = "当選しました"
7:    Range("B1").Font.Size = 72
8:ElseIf Range("A1").Value = "はずれ" Then
9:    Range("B1").Value = "残念でした"
10:    Range("B1").Font.Size = 16
12:Else
13:   Range("B1").clear
14:End If
15:End Sub

1行目から10行目までは、基本と同じです。
12行目が、それ以外なら(Else)です。
13行目は、セル(Range)B1の書式と値をクリア(Clear)する、という意味です。
14行目は、ここまででIfが終わり、という意味です。
9行目は、ここまででマクロが終了という意味です。
ここまでが、Ifの文法で使う、If、Else If、Else、End Ifの解説です。

比較

上記の例ではすべてセルA1が「当たり」などの文字と一致しているか調べる「=」の条件を使いました。
このように比較するためのものを比較演算子と呼び、ExcelのIF関数で使うものと同じです。
比較するものが文字データの場合は” ”で囲む必要があります。
上記の例では「当たり」などの文字と比較しているので” ”で囲んでいます。
比較の時、比較演算子を挟んで左側が「左辺」、右側が「右辺」に分かれます。
あくまで比較は2つの値で行います。Range(A1).Value = Range(B1) .Value = Range(C1) .Valueのように3つ以上の値を比較することはできません。
比較演算子は次のようなものがあります。
例では、Ifの1行目のみを記載します。

=:一致

左辺と右辺が「一致していれば」という条件です。文字でも数値でも使えます。
例1)
セルA1の値がセルB1の値と一致しているかという意味です。
If Range(A1).Value = Range(B1) .Value Then
例2)
セルA1の値が「はい」という文字ならば、という意味です。
If Range(A1).Value = “はい” Then
例3)
セルA1の値が501の数値ならば、という意味です。
例4)
If Range(A1).Value = 501 Then
変数iの値が1の数値ならば、という意味です。
If i = 1 Then

<>:一致しない

左辺と右辺が「一致していなければ」という条件です。文字でも数値でも使えます。
例1)
セルA1の値がセルB1の値が同じでなければ、という意味です。
If Range(A1).Value <> Range(B1) .Value Then
例2)
セルA1の値が「税込」ではなければ、という意味です。
If Range(A1).Value <> “税込” Then
例3)
セルA1の値が0でなければ、という意味です。
If Range(A1).Value <> 0 Then
例4)
変数iの値が100でなければ、という意味です。
If i <> 1 Then

>:より大きい

左辺より右辺が「大きい」という条件です。右辺が100であれば100は一致しません。数値で使います。
例1)
セルA1の値がセルB1より大きければ、という意味です。
If Range(A1).Value > Range(B1) .Value Then
例2)
セルA1の値が100より大きければ、という意味です。
If Range(A1).Value > 100 Then

<:より小さい(未満)

左辺より右辺が「小さい」という条件です。右辺が100であれば100は一致しません。数値で使います。
例1)
セルA1の値がセルB1より小さければ、という意味です。
If Range(A1).Value < Range(B1) .Value Then
例2)
セルA1の値が0より小さければ、(マイナスの値であれば)という意味です。
If Range(A1).Value < 0 Then

>=:以上

左辺が右辺「以上」という条件です。右辺が100であれば100は一致します。数値で使います。
例1)
セルA1の値がセルB1以上であれば、という意味です。
If Range(A1).Value >= Range(B1) .Value Then
例2)
セルA1の値が20190501以上であれば、という意味です。
If Range(A1).Value >= 20190501 Then

<=:以下

左辺が右辺「以下」という条件です。右辺が100であれば100は一致します。数値で使います。
例1)
セルA1の値がセルB1以下であれば、という意味です。
If Range(A1).Value <= Range(B1) .Value Then
例2)
セルA1の値に10をかけた値が3000以下であれば、という意味です。
If Range(A1).Value * 10 <= 3000 Then

Ifのネスト

Ifは何重にも入れ子にすることができます。
この入れ子の構造のことをネストと呼びます。
例えば、もしもセルA1が100以上ならば、次の処理をします。もしもセルA1が200以下ならば次の処理をします、といった場合は次のようになります。
If Range(A1).Value >= 100 Then
  If Range(A1).Value <= 200 Then
    実際の処理
  End If
End If

まとめ

今回は、VBAでIfを使った分岐の方法について、紹介しました。
いろいろなキーワードを紹介しましたが、その日本語訳は次の通りです。
If:もしも
Then:ならば
Else:そうではなかったら
Else If:そうではなくてもし
End If:Ifの終わり
この日本語と「=」や「<>」の比較演算子を組み合わせていくことで、条件分岐を作成することができます。
また、Else Ifで条件をどんどん分岐することができますが、数が多い場合は、Ifと同じ条件分岐のSwitch Case文の方が簡単な場合もあります。
Ifは条件分岐の文で、For文などと同じようにループと同じ制御構造の一つで、処理の流れを変えるためのものです。
使っていないVBAと使っているVBAではやれることが何倍も違います。
ぜひマスターして活用しましょう。

Back to top