エクセル

【VBA入門】繰り返し処理の中で条件分岐を使う

エクセル

[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文が実行されます。

  1. i=1のとき:If文は3ではないのでIf文の中身は実行されない
  2. i=2のとき:If文は3ではないのでIf文の中身は実行されない
  3. i=3のとき:If文は3なのでIf文の中身が実行される
  4. i=4のとき:If文は3ではないのでIf文の中身は実行されない
  5. 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文の本体が実行されるたびにどんな値に変化してくか逐一確認しながら値を追っていくことが大切です。

これをトレースと言います。

繰り返し処理を作ろうと思ったら紙に値を書いてトレースしてからプログラミングしてもいいですね。

なんにせよ色々プログラムを書いていく中で少しずつ身についていく話です。