【VBA】プログラムの流れを制御する(If文、For/Doループ)

VBA

はじめに

第1回では、VBAの基本として変数やオブジェクト操作を学び、Excelに命令を出す方法の第一歩を踏み出しました。しかし、これだけでは一本道の単純な処理しかできません。

プログラミングの真価は、状況に応じて処理を変えたり、同じ作業を何度も繰り返したりすることにあります。今回は、その中核を担う「条件分岐(If文)」と「繰り返し処理(ループ)」をマスターしましょう。これができれば、VBAで実現できることの幅が爆発的に広がります。

1. 条件分岐 (If...Then) – VBAに判断させる

If文は、指定した条件が「真(True)」か「偽(False)」かを判断し、真の場合にのみ特定の処理を実行させます。

基本形: If...Then...End If

最もシンプルな形です。「もし(If)条件が満たされたら、その時(Then)処理を実行する」と覚えます。

例:材料の引張強度が基準値を超えていたら「合格」と表示する

Sub CheckStrength()
    Dim strength As Double
    strength = 250.5

    ' 強度が250以上であれば、B1セルに「合格」と入力
    If strength >= 250 Then
        Range("B1").Value = "合格"
    End If
End Sub

Elseを使った処理の分岐

条件が真(True)の場合と、偽(False)の場合で、それぞれ異なる処理を行いたい場合はElseを使います。

例:株価が200日移動平均線より上か下かでセルの色を変える

Sub PriceCheck()
    Dim currentPrice As Double
    Dim movingAverage As Double

    currentPrice = 1500
    movingAverage = 1450

    ' 現在価格が移動平均より上か?
    If currentPrice > movingAverage Then
        ' 真の場合:A1セルを緑色にする
        Range("A1").Interior.Color = RGB(0, 255, 0) ' 緑
    Else
        ' 偽の場合:A1セルを赤色にする
        Range("A1").Interior.Color = RGB(255, 0, 0) ' 赤
    End If
End Sub

ElseIfで複数の条件を組み合わせる

3つ以上の条件で分岐させたい場合はElseIfを使います。

例:P/E(株価収益率)に応じて「割安」「適正」「割高」を判定する

Sub JudgePER()
    Dim per As Double
    per = 22.5

    If per < 15 Then
        Range("A1").Value = "割安"
    ElseIf per < 25 Then
        Range("A1").Value = "適正"
    Else
        Range("A1").Value = "割高"
    End If
End Sub

2. 繰り返し処理(ループ) – 面倒な作業はVBAに任せる

ループ処理は、同じ、あるいは少しずつ変化する作業を何度も繰り返すための構文です。VBA自動化の要と言えます。

For...Nextループ – 回数が決まっている繰り返し

最も一般的なループです。「1から10まで」のように、繰り返す回数が決まっている場合に使います。

例:10個の材料サンプルのデータを合計する

Sub SumData()
    Dim i As Long
    Dim total As Double
    total = 0

    ' iを1から10まで1ずつ増やしながら繰り返す
    For i = 1 To 10
        ' Cells(行, 列) を使ってA列のデータを参照
        total = total + Cells(i, "A").Value
    Next i

    ' 結果をB1セルに出力
    Range("B1").Value = total
End Sub

実務では、データ数が変動することがほとんどです。最終行を自動で取得してループの終点に設定するのが定石です。

' A列の最終行を取得
Dim lastRow As Long
lastRow = Cells(Rows.Count, "A").End(xlUp).Row

' 1行目から最終行までループ
For i = 1 To lastRow
    ' ... 処理 ...
Next i

Do...Loopループ – 条件に応じた繰り返し

「特定の条件を満たしている間、ずっと繰り返す」という、回数が事前に決まっていない処理に使います。

Do While [条件]は、条件が真(True)の間繰り返します。

例:A列が空白になるまで、B列に「処理済み」と入力し続ける

Sub MarkAsDone()
    Dim i As Long
    i = 1

    ' A列のi行目のセルが空白でない間、ループを続ける
    Do While Cells(i, "A").Value <> ""
        Cells(i, "B").Value = "処理済み"
        i = i + 1 ' 次の行に進むためにiをインクリメント
    Loop
End Sub

この方法は、データに途中で空白行がない限り、最終行まで確実に処理できるため非常に堅牢でよく使われます。

3. 【演習】条件分岐と繰り返しの組み合わせ

それでは、今回学んだことを組み合わせてみましょう。

お題: A列に材料の強度リストがある。強度が400以上のものだけを、C列に転記し、元のセルの背景色を黄色にしなさい。

Sub ExtractHighStrengthMaterials()
    Dim lastRow As Long
    Dim i As Long
    Dim outputRow As Long

    ' 最終行を取得
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    
    ' 書き出し先の行を初期化
    outputRow = 1

    ' 1行目から最終行までループ
    For i = 1 To lastRow
        ' 条件分岐:強度が400以上か?
        If Cells(i, "A").Value >= 400 Then
            ' 条件が真の場合の処理
            
            ' C列に値を転記
            Cells(outputRow, "C").Value = Cells(i, "A").Value
            
            ' 元のセルの色を変更
            Cells(i, "A").Interior.Color = vbYellow
            
            ' 書き出し先の行を1つ進める
            outputRow = outputRow + 1
        End If
    Next i
End Sub

このコードを実行すれば、面倒な抽出と色付けの作業が一瞬で完了します。

まとめ

今回は、VBAプログラミングの心臓部である「制御構造」を学びました。

  • If: 条件によって処理を分岐させる
  • Forループ: 決まった回数だけ処理を繰り返す
  • Doループ: 条件が満たされるまで処理を繰り返す

これらの組み合わせであらゆるロジックを組み立てることができます。次回は、これらの処理を「部品化」して、より整理され、再利用しやすいコードを書くための「SubFunction」について学びます。プログラミングの構造化を理解し、一気にステップアップしましょう。

コメント