[PR]当サイトはアフィリエイト広告を利用しています。
はじめに
今回は条件分岐と繰り返し処理を組み合わせて、条件に合致する値だけ集計するという例題に取り組みます。
条件分岐については、「VBAで条件分岐」もご覧ください。
繰り返しについては、「SUM()関数を再現?繰り返しで合計を求める」もご覧ください。
条件に合致する値だけ集計するというのはSUMIF関数で求めることができます。
今回はこれと同じような処理をVBAでやってみようという回です。
今回の例題を解けば
For文とIf文を組み合わせる
という柔軟なプログラムが書けるようになります。
For文の中でIf文を使う方法
For文の中にIf文を書けば良いだけです。
Sub sample()
Dim i As Integer
For i = 1 To 5
If i = 3 Then
MsgBox i & "です"
End If
Next i
End Sub
単純にiが1から5まで変化して3のときメッセージボックスで出力するだけのプログラムです。
For文は指定した回数その中身(ForからNextまでの間に書かれた処理)を繰り返す命令文でした。
上のプログラムではFor文が5回繰り返されます。その一回ごとに中身のIf文が実行されます。
- i=1のとき:If文は3ではないのでIf文の中身は実行されない
- i=2のとき:If文は3ではないのでIf文の中身は実行されない
- i=3のとき:If文は3なのでIf文の中身が実行される
- i=4のとき:If文は3ではないのでIf文の中身は実行されない
- i=5のとき:If文は3ではないのでIf文の中身は実行されない
条件式の「=」に注意してください。条件式の中で「=」を使うと「右と左が同じかどうか」という意味に変わります。代入記号とは違う動きをするので注意です。
また所々コードが「字下げ」してありますね。これは「インデント」という書き方です。
命令文
タブ(字下げ) 中身
命令文 終了
このようになっています。
プログラミングでは命令から命令終了の部分までがセットで実行されます。それをわかりやすく把握するための書き方となります。For からNextまでとか、IfからEnd Ifまでとかのことです。
ちなみにこの節で解説した3の時出力するだけのプログラムを「流れ図」(フローチャート)で描くとこんな感じになります。
あるいはこう描くこともできます。
ひし形が条件分岐です。ループ1の下の条件式は「終了条件」といって、この条件式が成立したらループを終了するという意味です。
今回の例題
上記を踏まえて例題を解いてみましょう。
エクセルのシートに次のように入力します。
C3: 1
D3: 4
E3: 2
F3: 7
G3: 3
例題は次のようになります。
「C3からG3までの5つの値のうち、3より大きい値の合計を求めよ」
エクセルの関数で求める場合
C5セルに次のように入力します。
=SUMIF(C3:G3,”>3″)
11と出力されたでしょうか?
SUMIF関数の解説です。
SUMIF関数は考えたい範囲に入力されている値が条件式を満たしている場合、満たしている値だけ合計するという関数です。
=SUMIF(考えたい範囲,条件式)
考えたい範囲は今回はC3からG3ですね。
この範囲をドラッグすれば範囲が入力されます。
「C3:G3」と入ります。
条件式は「3より大きい」ですね。
これは「”>3″」と書きます。
「””」で囲むのを忘れずに。
SUMIF関数は条件式の後にもう一つ範囲を指定することができますが、今回は使わないので入力しなくてよいです。
VBAで求める場合
コード入力欄に次のように入力します。
Sub sumGreater3()
Dim i As Integer
Dim s As Integer
s = 0
For i = 1 To 5
If (Cells(3, i + 2).Value > 3) Then
s = s + Cells(3, i + 2).Value
End If
Next i
Range("D5").Value = s
End Sub
順に解説します。
今回も合計を計算するので前回「SUM()関数を再現?繰り返しで合計を求める」を参考に変数を準備します。
Dim i As Integer
Dim s As Integer
s = 0
これで合計する準備ができました。
アルゴリズム概要
今回も合計を求めるので、前回やったように一つずつセルを見てそれを変数sにどんどん足していきます。
前回と違うのは、足すときに3より大きい時だけ足すということです。
繰り返し処理中のiとCells()の関係
繰り返し処理はFor ToとNextの間に書かれた処理が何回も実行されるという処理でした。
まずIf文がない状態で考えてみましょう。
For i = 1 To 5
s = s + Cells(3, i + 2).Value
Next i
これだと
s = s + Cells(3, 3).Value
s = s + Cells(3, 4).Value
s = s + Cells(3, 5).Value
s = s + Cells(3, 6).Value
s = s + Cells(3, 7).Value
このように5回本体が実行されます。
If文を組み込む
上の5回の繰り返し処理のときに、If文を組み込むことで特定の条件の時だけ足し算を実行することができます。
If文は「VBAで条件分岐」でやりました。
If ThenとEnd Ifの間に書かれた処理が行われるという処理です。
今回は条件に合致しなかったときにする処理がないのでElseはありません。
If (Cells(3, i + 2).Value > 3) Then
s = s + Cells(3, i + 2).Value
End If
これでCells(3, i + 2)が3より大きければ本体の足し算を行うことができます。
Cells(3, 3).Value
Cells(3, 4).Value
Cells(3, 5).Value
Cells(3, 6).Value
Cells(3, 7).Value
が3より大きいか毎回判定しています。
判定の結果条件を満たしていれば
s = s + Cells(3, i + 2).Value
が実行されます。
これで条件を満たす値だけ合計に追加することができます。
おまけ:IF関数とSUM関数で求める
プログラミング的な考えをもう少し体験するためにSUMIF関数をIF関数とSUM関数で再現してみましょう。
C4セルに次のように入力します。
=IF(C3>3,C3,0)
C3セルが3より大きければそのままC3セルの値を出力。
そうでなければ0を出力します。
IF関数については「VBAで条件分岐」もご覧ください。
そしてC4セルの右下にある小さい四角を選択して右にドラッグします。
G4セルまで引っ張ります。
すると
=IF(D3>3,D3,0)
=IF(E3>3,E3,0)
…
=IF(G3>3,G3,0)
このように都合の良いところだけ変更された式が入力されます。
これはオートフィルというエクセルの機能です。
右にドラッグすれば右に一つずつセル表記がずれた式が入力されます。
最後にH4セルに
=SUM(C4:G4)
と入力します。
11と出力されたでしょうか?
SUM関数とIF関数でもプログラミング的なことができますね。
状況に応じてSUMIF関数と使い分ければよいと思います。
おまけでした。
まとめ
今回はSUMIF関数と同じような処理を、繰り返しと条件分岐を使ってやってみました。
Forが繰り返しを行いながら、数値がIfで判定されていく様子がイメージ出来たらすごいです。
初めのうちは、For文を使うときに、For文の本体が実行されるたびにどんな値に変化してくか逐一確認しながら値を追っていくことが大切です。
これをトレースと言います。
繰り返し処理を作ろうと思ったら紙に値を書いてトレースしてからプログラミングしてもいいですね。
なんにせよ色々プログラムを書いていく中で少しずつ身についていく話です。