ExcelでのVBAマクロを使えるようになると、人の手要らずでの計算やファイル作成が可能になります。
この記事では、If文の処理についてを紹介します。
If文の処理とは
ある条件時には処理をして、そのほかの条件時には違う処理をするといったことができるのがIf文です。
構文は下記のようになっています。
If 条件1 Then
処理1
ElseIf 条件2 Then
処理2
ElseIf 条件3 Then
処理3
Else
処理4
End If
例として、以下のようなプログラムを実行してみましょう。
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文は様々なところで使えるので、しっかり理解しておきましょう。
条件文では、抜けもれなく処理を用意しておくことが重要になります。
一旦、紙に条件分岐を書いてみてから、コードを書いていくと良いと思います。
コメント