ExcelでのVBAマクロを使えるようになると、人の手要らずでの計算やファイル作成が可能になります。
この記事では、プログラミング初心者がつまづきやすいカウント処理を紹介します。
カウント処理とは
不特定回数分繰り返し処理をさせたとき、何回その処理したかを計算することができるのが、カウント処理です。
構文は下記のようになっています。
For 変数1 = 初期値 To 終了値
変数2 = 変数2 + 1
Next 変数1
例として、以下のようなプログラムを実行してみましょう。
Dim i As Integer
Dim count As Integer
count = 0
For i = 1 To 10
count = count + 1
Next i
MsgBox ("回数は" & count & "です")
以下のような結果になりました。
回数が10回という結果になりました。
※処理の流れを記載していきます。
変数countの初期値は0。
変数iの最初の値は1。(右辺)=0+1となり、(左辺)の変数countの値は1。
変数iの次の値は2。(右辺)=1+1となり、(左辺)の変数countの値は2。
変数iの次の値は3。(右辺)=2+1となり、(左辺)の変数countの値は3。
変数iの次の値は4。(右辺)=3+1となり、(左辺)の変数countの値は4。
変数iの次の値は5。(右辺)=4+1となり、(左辺)の変数countの値は5。
変数iの次の値は6。(右辺)=5+1となり、(左辺)の変数countの値は6。
変数iの次の値は7。(右辺)=6+1となり、(左辺)の変数countの値は7。
変数iの次の値は8。(右辺)=7+1となり、(左辺)の変数countの値は8。
変数iの次の値は9。(右辺)=8+1となり、(左辺)の変数countの値は9。
変数iの最後の値は10。(右辺)=9+1となり、(左辺)の変数countの値は10。
また、カウント処理で、数値の合計を算出できます。その方法を紹介します。
例として、以下のようなプログラムを実行してみましょう。変数iを足していくというものです。
つまり、1から10までの数字を全て足した結果を求めるものです。
Dim i As Integer
Dim sum As Integer
sum = 0
For i = 1 To 10
sum = sum + i
Next i
MsgBox ("合計は" & sum & "です")
以下のような結果になりました。
合計値が55という結果になりました。
※処理の流れを記載していきます。
変数sumの初期値は0。
変数iの最初の値は1。(右辺)=0+1となり、(左辺)の変数sumの値は1。
変数iの次の値は2。(右辺)=1+2となり、(左辺)の変数sumの値は3。
変数iの次の値は3。(右辺)=3+3となり、(左辺)の変数sumの値は6。
変数iの次の値は4。(右辺)=6+4となり、(左辺)の変数sumの値は10。
変数iの次の値は5。(右辺)=10+5となり、(左辺)の変数sumの値は15。
変数iの次の値は6。(右辺)=15+6となり、(左辺)の変数sumの値は21。
変数iの次の値は7。(右辺)=21+7となり、(左辺)の変数sumの値は28。
変数iの次の値は8。(右辺)=28+8となり、(左辺)の変数sumの値は36。
変数iの次の値は9。(右辺)=36+9となり、(左辺)の変数sumの値は45。
変数iの最後の値は10。(右辺)=9+10となり、(左辺)の変数sumの値は55。
条件付きでカウントする
次に、条件付きでカウントする方法を紹介します。
先ほどは、for文で繰り返す分だけカウントの処理がありましたが、ある条件時はカウントして、それ以外の時はカウントしないという処理をすることができます。
構文は下記のようになります。
For 変数1 = 初期値 To 終了値
If 条件文 Then
変数2 = 変数2 + 1
End If
Next 変数1
例として、以下のような購入マスタがあるとしましょう。
例えば6月2日の分だけの購入金額が知りたい場合を考えてみましょう。
以下のようなプログラムを実行してみましょう。
Dim i As Integer
Dim sum_money As Integer
Dim d As Date
sum_money = 0
d = "6/2/2021"
For i = 2 To 7
If Cells(i, 1) = d Then
sum_money = sum_money + Cells(i, 4)
End If
Next i
MsgBox ("6月2日の購入合計金額は" & sum_money & "円です")
以下のような結果になりました。
6/2の購入金額の合計は13850円だと求まりました。
念のため手計算してみても、13850円でした。
※処理の流れを記載していきます。
変数sum_moneyの初期値は0。
変数iの最初の値は2。If文の判定でA2セルは6月2日ではないため、カウント処理は行われない。変数sum_moneyの値は0。
変数iの次の値は3。If文の判定でA3セルは6月2日であるため、カウント処理が行われる。(右辺)=0+3760となり、(左辺)の変数sum_moneyの値は3760。
変数iの次の値は4。If文の判定でA4セルは6月2日であるため、カウント処理が行われる。(右辺)=3760+1200となり、(左辺)の変数sum_moneyの値は4960。
変数iの次の値は5。If文の判定でA5セルは6月2日であるため、カウント処理が行われる。(右辺)=4960+8890となり、(左辺)の変数sum_moneyの値は13850。
変数iの次の値は6。If文の判定でA6セルは6月2日ではないため、カウント処理は行われない。変数sum_moneyの値は13850。
変数iの次の値は7。If文の判定でA7セルは6月2日ではないため、カウント処理は行われない。変数sum_moneyの値は13850。
カウント処理の実用例
カウント処理はどのようなときに利用するかを紹介します。
ある企業の購入マスタから、△△支店の購入金額の平均を求めたい場合を考えてみます。
例として、下記のようなマスタがあったとします。
購入金額の平均を求めるプログラミングは下記の通りです。
※あくまでも一例です。
Dim i As Integer
Dim count As Integer
Dim sum_money As Integer
Dim store_name As String
Dim ave As Integer
count = 0
sum_money = 0
store_name = "△△支店"
For i = 2 To 100
If Cells(i, 1) = "" Then
Exit For
ElseIf Cells(i, 2) = store_name Then
sum_money = sum_money + Cells(i, 4)
count = count + 1
End If
Next i
ave = sum_money / count
MsgBox ("△△支店の購入平均金額は" & ave & "円です")
2行目からカウントしていくので、for文の初期値2とします。
If文で1列目の日付が空欄になった場合、for文を抜ける処理を入れています。
もし1列目の日付が空欄でなかった場合、購入金額の合計(sum_money)と平均を求めるためのデータ個数(count)をカウントしています。
最後に平均値(ave)を求める処理を入れています。
以下のような結果になりました。
※念のため、手計算しても同じ結果となりました。
※処理の流れを記載していきます。
変数countの初期値は0。
変数sum_moneyの初期値は0。
変数store_nameの値は「△△支店」。
変数iの最初の値は2。If文の判定でA2セルは空欄ではないため、ElseIf処理が行われる。ElseIfの条件であるB2が「△△支店」と合致するので、内部処理が行われる。処理のひとつめ(sum_money)について、(右辺)=0+180となり、(左辺)の変数sum_moneyの値は180。処理のふたつめ(count)について、(右辺)=0+1となり、(左辺)の変数countの値は1。
変数iの次の値は3。If文の判定でA3セルは空欄ではないため、ElseIf処理が行われる。ElseIfの条件であるB3が「△△支店」と合致しないので、内部処理は行われない。変数sum_moneyの値は変わらず180。変数countの値も変わらず1。
変数iの次の値は4。If文の判定でA4セルは空欄ではないため、ElseIf処理が行われる。ElseIfの条件であるB4が「△△支店」と合致するので、内部処理が行われる。処理のひとつめ(sum_money)について、(右辺)=180+1200となり、(左辺)の変数sum_moneyの値は1380。処理のふたつめ(count)について、(右辺)=1+1となり、(左辺)の変数countの値は2。
~~~~中略~~~~
変数iの次の値は16。If文の判定でA18セルは空欄ではないため、ElseIf処理が行われる。ElseIfの条件であるB16が「△△支店」と合致するので、内部処理が行われる。処理のひとつめ(sum_money)について、(右辺)=3060+8890となり、(左辺)の変数sum_moneyの値は11950。処理のふたつめ(count)について、(右辺)=4+1となり、(左辺)の変数countの値は5。
変数iの次の値は17。If文の判定でA17セルは空欄であるため、ExitFor処理が行われ、for文の繰り返し処理から抜けることになる。最終的な変数sum_moneyの値は11950であり、変数countの値は5である。
その値を用いて、平均を計算して、処理終了。
でも、for文での終了値を100としているから、データが100個以上あったらどうするの?for文内で計算できないのでは?
ご指摘の通り。終了値を100としているので、それを超えるデータには対応できないコードとなっています。ただ、この問題を解消できる方法はもちろんあるので、別途紹介します。
とりあえず今回は、こんな処理が可能だということが伝わっていれば良いです。
まとめ
VBAマクロでのカウンタ処理について、紹介しました。
カウンタ処理
不特定回数分繰り返し処理をさせたとき、何回その処理したかを計算することができるのが、カウント処理です。
以下が基本構文です。
For 変数1 = 初期値 To 終了値
変数2 = 変数2 + 1
Next 変数1
条件付きカウンタ処理
If文を使うことで、ある条件でのみカウンタ処理を行うこともできます。
以下が基本構文です。
For 変数1 = 初期値 To 終了値
If 条件文 Then
変数2 = 変数2 + 1
End If
Next 変数1
カウンタ処理は様々なところで使えるので、しっかり理解しておきましょう。
最初は、「変数=変数+1」という数学的には成り立たない構文に慣れないかと思いますが、右辺の値を左辺に代入するというロジックも理解しておきましょう。
コメント