【Excel】【VBA】If文を簡単解説

IT

ExcelでのVBAマクロを使えるようになると、人の手要らずでの計算やファイル作成が可能になります。

この記事では、If文の処理についてを紹介します。

If文の処理とは

ある条件時には処理をして、そのほかの条件時には違う処理をするといったことができるのがIf文です。

構文は下記のようになっています。

If 条件1 Then
    処理1
ElseIf 条件2 Then
    処理2
ElseIf 条件3 Then
    処理3
Else
    処理4
End If
ワンポイント

最後のElseは書かなくても大丈夫です。ただ、一般的にはElseの場合の処理も入れておいた方が良いです。何か想定していた条件をすり抜けたものをキャッチアップできるようにしましょう。

例として、以下のようなプログラムを実行してみましょう。

Dim i As Integer
For i = 1 To 4
    If i = 1 Then
        Cells(i, 1) = "1です"
    ElseIf i = 2 Then
        Cells(i, 1) = "2です"
    ElseIf i = 3 Then
        Cells(i, 1) = "3です"
    Else
        Cells(i, 1) = "4です"
    End If
 Next i

以下のような結果になりました。

A1からA4までのセルに、上記のような文字列が入力されています。

※処理の流れを記載していきます。

変数iの初期値は1。If文の最初の条件文(i=1)に該当するので、内部の処理が行われる。セルA1に「1です」と入力される。

変数iの次の値は2。If文の最初の条件文(i=1)には該当しない。次の条件文(i=2)に該当するので、内部の処理が行われる。セルA2に「2です」と入力される。

変数iの次の値は3。If文の最初の条件文(i=1)に該当しない。次の条件文(i=2)にも該当しない。次の条件文(i=3)に該当するので、内部の処理が行われる。セルA3に「3です」と入力される。

変数iの終了値は4。If文の最初の条件文(i=1)に該当しない。次の条件文(i=2)にも該当しない。次の条件文(i=3)にも該当しない。次の条件文(それ以外)に該当するので、内部の処理が行われる。内部の処理が行われる。セルA4に「4です」と入力される。

条件が複数の場合

論理演算子や比較演算子を用いて、条件を複数に指定して処理を行うことができます。

例として、以下の売上マスタがあるとします。

そこで、各店舗で2000円以上売り上げた回数が何回あるのかを知りたいとします。

つまり、組むマクロとしては、「店舗名が一致している」かつ「売上額が2000円以上」の条件でカウンタ処理をしてあげれば良いということになります。

例として、以下のようなプログラムを実行してみましょう。

Dim i As Integer
Dim c1, c2, c3, c4 As Integer
c1 = 0
c2 = 0
c3 = 0
c4 = 0
For i = 2 To 11
    If Cells(i, 2) = "△△支店" And Cells(i, 4) >= 2000 Then
        c1 = c1 + 1
    ElseIf Cells(i, 2) = "〇〇駅前店" And Cells(i, 4) >= 2000 Then
        c2 = c2 + 1
    ElseIf Cells(i, 2) = "××商店" And Cells(i, 4) >= 2000 Then
        c3 = c3 + 1
    Else
        c4 = c4 + 1
    End If
Next i
MsgBox ("△△支店で2000円以上売り上げた回数は" & c1 & "回です" & vbCrLf & _
        "〇〇駅前店で2000円以上売り上げた回数は" & c2 & "回です" & vbCrLf & _
        "××商店で2000円以上売り上げた回数は" & c3 & "回です" & vbCrLf & _
        "全ての店について2000円以上売り上げられなかった回数は" & c4 & "回です")

以下のような結果になりました。

※処理の流れを記載していきます。

変数c1,c2,c3,c4の初期値は0。

変数iの初期値は2。If文の最初の条件文(“B2=△△支店” かつ “D2>=2000”)に該当しない。次の条件文(“B2=〇〇駅前店” かつ “D2>=2000”)にも該当しない。次の条件文(“B2=××商店” かつ “D2>=2000”)にも該当しない。次の条件文(それ以外)に該当するので、内部の処理が行われ、c4の値が1つ増えて1になる。

変数iの次の値は3。If文の最初の条件文(“B3=△△支店” かつ “D3>=2000”)に該当しない。次の条件文(“B3=〇〇駅前店” かつ “D3>=2000”)にも該当するので、内部の処理が行われ、c2の値が1つ増えて1になる。

変数iの次の値は4。If文の最初の条件文(“B4=△△支店” かつ “D4>=2000”)に該当しない。次の条件文(“B4=〇〇駅前店” かつ “D4>=2000”)にも該当しない。次の条件文(“B4=××商店” かつ “D4>=2000”)にも該当するので、内部の処理が行われ、c3の値が1つ増えて1になる。

~~~~中略~~~~

変数iの次の値は10。If文の最初の条件文(“B10=△△支店” かつ “D10>=2000”)に該当しない。次の条件文(“B10=〇〇駅前店” かつ “D10>=2000”)にも該当しない。次の条件文(“B10=××商店” かつ “D10>=2000”)にも該当しない。次の条件文(それ以外)に該当するので、内部の処理が行われ、c4の値が1つ増えて3になる。

変数iの終了値は11。If文の最初の条件文(“B11=△△支店” かつ “D11>=2000”)に該当しない。次の条件文(“B11=〇〇駅前店” かつ “D11>=2000”)にも該当しない。次の条件文(“B11=××商店” かつ “D11>=2000”)にも該当するので、内部の処理が行われ、c3の値が1つ増えて3になる。

入れ子構造

If文の処理では、入れ子構造の処理も行うこともできます。

入れ子構造とは、If文の中にもうひとつ(かたまり)のIf文を書いていくというものです。

上述した論理演算子を用いた処理と比べて、処理の流れが分かりやすい特徴があります。

構文は下記のようになっています。

If 条件1 Then
    If 条件A Then
        処理A
    Else
        処理B
    End If
ElseIf 条件2 Then
    処理2
ElseIf 条件3 Then
    If 条件C Then
        処理C
    Else
        処理D
    End If
Else
    処理4
End If

論理演算子で示した例を入れ子構造で書き直してみたいと思います。

(再掲)

例として、以下の売上マスタがあるとします。

そこで、各店舗で2000円以上売り上げた回数が何回あるのかを知りたいとします。

入れ子構造で書いてみます。

Dim i As Integer
Dim c1, c2, c3, c4 As Integer
c1 = 0
c2 = 0
c3 = 0
c4 = 0
For i = 2 To 11
    If Cells(i, 2) = "△△支店" Then
        If Cells(i, 4) >= 2000 Then
            c1 = c1 + 1
        Else
            c4 = c4 + 1
        End If
    ElseIf Cells(i, 2) = "〇〇駅前店" Then
        If Cells(i, 4) >= 2000 Then
            c2 = c2 + 1
        Else
            c4 = c4 + 1
        End If
    ElseIf Cells(i, 2) = "××商店" Then
        If Cells(i, 4) >= 2000 Then
            c3 = c3 + 1
        Else
            c4 = c4 + 1
        End If
    Else
        c4 = c4 + 1
    End If
Next i
MsgBox ("△△支店で2000円以上売り上げた回数は" & c1 & "回です" & vbCrLf & _
        "〇〇駅前店で2000円以上売り上げた回数は" & c2 & "回です" & vbCrLf & _
        "××商店で2000円以上売り上げた回数は" & c3 & "回です" & vbCrLf & _
        "全ての店について2000円以上売り上げられなかった回数は" & c4 & "回です")

以下のような結果になりました。

※処理の流れを記載していきます。

変数c1,c2,c3,c4の初期値は0。

変数iの初期値は2。If文の最初の条件文(“B2=△△支店”)に該当しするので、内部のIf処理が行われる。内部If文の最初の条件文(“D2>=2000”)に該当しない。次の条件文(それ以外)に該当するので、内部処理が行われ、c4の値が1つ増えて1になる。

変数iの次の値は3。If文の最初の条件文(“B3=△△支店”)に該当しない。次の条件文(“B3=〇〇駅前店”)に該当するので、内部のIf処理が行われる。内部If文の最初の条件文(“D3>=2000”)に該当するので、内部処理が行われ、c2の値が1つ増えて1になる。

変数iの次の値は4。If文の最初の条件文(“B4=△△支店”)に該当しない。次の条件文(“B4=〇〇駅前店”)に該当しない。次の条件文(“B4=××商店”)に該当するので、内部のIf処理が行われる。内部If文の最初の条件文(“D4>=2000”)に該当するので、内部処理が行われ、c3の値が1つ増えて1になる。

~~~~中略~~~~

変数iの次の値は10。If文の最初の条件文(“B10=△△支店”)に該当しない。次の条件文(“B10=〇〇駅前店”)に該当するので、内部のIf処理が行われる。内部If文の最初の条件文(“D10>=2000”)に該当しない。次の条件文(それ以外)に該当するので、内部処理が行われ、c4の値が1つ増えて3になる。

変数iの終了値は11。If文の最初の条件文(“B11=△△支店”)に該当しない。次の条件文(“B11=〇〇駅前店”)に該当しない。次の条件文(“B11=××商店”)に該当するので、内部のIf処理が行われる。内部If文の最初の条件文(“D11>=2000”)に該当するので、内部処理が行われ、c3の値が1つ増えて3になる。

If処理の実用例

カウント処理はどのようなときに利用するかを紹介します。

ある企業の購入マスタから、各店の売上金額の平均を求めたい場合を考えてみます。

例として、下記のようなマスタがあったとします。

各店の売上金額の平均を求めるプログラミングは下記の通りです。

※あくまでも一例です。

Dim i As Integer
Dim store_name_1 As String
Dim store_name_2 As String
Dim store_name_3 As String
Dim sum_1 As Integer
Dim sum_2 As Integer
Dim sum_3 As Integer
Dim sum_4 As Integer
Dim c1 As Integer
Dim c2 As Integer
Dim c3 As Integer
Dim c4 As Integer
Dim ave_1 As Integer
Dim ave_2 As Integer
Dim ave_3 As Integer
Dim ave_4 As Integer
   
store_name_1 = "△△支店"
store_name_2 = "××商店"
store_name_3 = "〇〇駅前店"
sum_1 = 0
sum_2 = 0
sum_3 = 0
sum_4 = 0
   
For i = 2 To 16
    If Cells(i, 2) = store_name_1 Then
        sum_1 = sum_1 + Cells(i, 4)
        c1 = c1 + 1
    ElseIf Cells(i, 2) = store_name_2 Then
        sum_2 = sum_2 + Cells(i, 4)
        c2 = c2 + 1
    ElseIf Cells(i, 2) = store_name_3 Then
        sum_3 = sum_3 + Cells(i, 4)
        c3 = c3 + 1
    Else
        sum_4 = sum_4 + Cells(i, 4)
        c4 = c4 + 1
    End If
Next i

ave_1 = sum_1 / c1
ave_2 = sum_2 / c2
ave_3 = sum_3 / c3


If c4 = 0 Then
    MsgBox ("△△支店の売上金額の平均は" & ave_1 & "円です" & vbCrLf & _
        "××商店の売上金額の平均は" & ave_2 & "円です" & vbCrLf & _
        "〇〇駅前店の売上金額の平均は" & ave_3 & "円です" & vbCrLf & _
        "その他のお店の売上はありません")
Else
    ave_4 = sum_4 / c4
    MsgBox ("△△支店の売上金額の平均は" & ave_1 & "円です" & vbCrLf & _
        "××商店の売上金額の平均は" & ave_2 & "円です" & vbCrLf & _
        "〇〇駅前店の売上金額の平均は" & ave_3 & "円です" & vbCrLf & _
        "その他のお店の売上金額の平均は" & ave_4 & "円です")
End If

以下のような結果になりました。

※念のため、手計算しても同じ結果となりました。

※処理の流れを記載していきます。

変数store_name_1,store_name_2,store_name_3の値は「△△支店」,「××商店」,「〇〇駅前店」。

変数sum_1,sum_2,sum_3,sum_4の初期値は0。

変数c1,c2,c3,c4の初期値は0。

変数iの最初の値は2。If文の最初の条件文(“B2=△△支店”)に該当するので、内部処理が行われる。sum_1の値が180増えて180になる。c1の値が1増えて1になる。

変数iの最初の値は3。If文の最初の条件文(“B2=△△支店”)に該当しない。次の条件文(“B3=××商店”)に該当するので、内部処理が行われる。sum_2の値が3760増えて3760になる。c2の値が1増えて2になる。

変数iの最初の値は3。If文の最初の条件文(“B3=△△支店”)に該当するので、内部処理が行われる。sum_1の値が8890増えて1980になる。c1の値が1増えて2になる。

~~~~中略~~~~

変数iの最初の値は15。If文の最初の条件文(“B15=△△支店”)に該当しない。次の条件文(“B15=××商店”)に該当するので、内部処理が行われる。sum_2の値が180増えて25010になる。c2の値が1増えて5になる。

変数iの最初の値は16。If文の最初の条件文(“B16=△△支店”)に該当するので、内部処理が行われる。sum_1の値が180増えて11950になる。c1の値が1増えて5になる。

sum_1,sum_2,sum_3とc1,c2,c3の値を用いて、平均を計算する。

c4の値が0の場合は平均値計算できなので、最後のIf文でC4の値が0かどうかを判定し、0の場合はその他の店の売上金額の平均値は求めず、メッセージボックスに表示する。

0でない場合は、その他の店の売上金額の平均値を計算し、メッセージボックスに表示する。

でも、for文での終了値を100としているから、データが100個以上あったらどうするの?for文内で計算できないのでは?

ご指摘の通り。終了値を100としているので、それを超えるデータには対応できないコードとなっています。ただ、この問題を解消できる方法はもちろんあるので、別途紹介します。
とりあえず今回は、こんな処理が可能だということが伝わっていれば良いです。

まとめ

VBAマクロでのIf処理について、紹介しました。

If処理

ある条件時には処理をして、そのほかの条件時には違う処理をするといったことができるのがIf文です。

以下が基本構文です。

If 条件1 Then
    処理1
ElseIf 条件2 Then
    処理2
ElseIf 条件3 Then
    処理3
Else
    処理4
End If

入れ子構造

If文の中にもうひとつ(かたまり)のIf文を書いていくというものです。

以下が基本構文です。

If 条件1 Then
    If 条件A Then
        処理A
    Else
        処理B
    End If
ElseIf 条件2 Then
    処理2
ElseIf 条件3 Then
    If 条件C Then
        処理C
    Else
        処理D
    End If
Else
    処理4
End If

If文は様々なところで使えるので、しっかり理解しておきましょう。

条件文では、抜けもれなく処理を用意しておくことが重要になります。

一旦、紙に条件分岐を書いてみてから、コードを書いていくと良いと思います。

コメント

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