VBAオジサンのらくがき帳

#09 条件分岐とくり返し

2021-02-28 00:00:00

これまで見てきたサンプルでは単純に処理を実行するだけのものがほとんどでしたが、通常は実現したい機能の実装のためにはいくつかの処理を組み合わせて実行することとなります。マクロに記述された処理は基本的には上から順番に実行されますが、ある一定の条件のときだけ実行したり、条件によって処理の内容を変えたり、同じような処理を複数回くり返したりしたい場合があります。そのために下にあげたようなステートメント(文)が用意されています。

If Then Elseステートメントは一定の条件で処理を分けるためにつかいます。下の例ではA1セルとB1セル の値を比べて、C1セルに結果を表示しています。ElseIfやElseは必要なければ省略できます。

If Range("A1").Value > Range("B1").Value Then
    Range("C1").Value = "A>Bです"
ElseIf Range("A1").Value = Range("B1").Value Then
    Range("C1").Value = "A=Bです"
Else
    Range("C1").Value = "A<Bです"
End If

Do Loopステートメントは一定の条件でくり返しをおこなうときに使います。下の例ではA1、A2、A3と順番にセルの値が空になるまで、B列にデータをコピーしています。下の形が基本だと思いますが、Whileの位置を処理の一番最後、Loopの右に持ってきて、ループ内の処理を実行してから条件をチェックすることもできます。またWhileの代わりにUntilをつかった条件の設定もできます。UntilはWhileとは条件判定が逆で正しくない間は処理をくり返します。While Wendステートメントは古い書き方なので、たまに目にすることはありますが、これから書くコードでは使わないほうがいいでしょう。

Dim i as Long
i = 1
Do While Range("A" & i).Value <> ""
    Range("B" & i).Value = Range("A" & i).Value
    i = i + 1
Loop

For Nextステートメントは一定の回数くり返しをおこなうときに使います。下の例で最初のループではA1からA10セルの値をABCと設定しています。2番目のループのようにStepを使って、逆の順番で処理を行うことも可能です。似たようなものにFor Each Nextステートメントがありますが、こちらは配列などの要素全てに対して処理をおこなうときに使います

Dim i as Long
For i = 1 To 10
    Range("A" & i).Value = "ABC"
Next i
For i = 10 To 1 Step -1
    Range("A" & i).Value = "ABC"
Next i

Select Caseステートメントはある値について、場合分けして処理をおこなうときに使います。上の3つに比べれば使用頻度は低めだと思います。

Select Case Range("A1").Value
    Case 1
          Range("B1").Value = "A"
    Case 2,3
          Range("B1").Value = "B"
    Case 4 To 6
          Range("B1").Value = "C"
    Case Is > 6
          Range("B1").Value = "D"
    Case Else
          Range("B1").Value = "E"
End Select