繰り返し処理の基本
音声
目次
For...Next文の基本
今回できるようになることは、For...Nextで決まった回数だけ繰り返す処理を作れるようになることです。
For...Nextは「何回繰り返すか」が明確な時に使います。ループ変数を宣言して開始値・終了値を指定すると、処理が自動で繰り返されます。
最小マクロ:
Sub Minimal_ForNext()
Dim i As Long
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(1)
ws.Range("A1:A10").ClearContents
For i = 1 To 10
ws.Cells(i, 1).Value = "行 " & i
Next i
MsgBox "完了: A1〜A10に書き込みました"
End Sub
貼り付け場所は、標準モジュールに貼り付けます。
実行方法は、VBE(Alt+F11)で開いてF5で実行するか、またはExcelの「マクロ」から実行します。
Stepを使った増減値の指定
Step句を使うと増分や減分を自由に指定できます。
Step 2で2ずつ増やしたり、Step -1で逆順に減らしたりできます。ループの進み方を変えることで偶数だけ処理するなどの柔軟な制御が可能です。以下は逆順でB列に書く例です。
Sub Step_Example()
Dim i As Long
For i = 10 To 1 Step -1
Cells(11 - i, 2).Value = "値:" & i
Next i
End Sub
確認方法:実行後にB列の値が10から1まで逆順で並んでいることを確認します。Stepの符号が想定と逆だと空ループになるので要チェックです。
For Each...Next文でコレクションを処理する
For Each...Nextは、ワークシートのコレクションやRangeのセル集合など、複数の要素を順に処理するのに向いています。
インデックスを意識せずに書けるため、コードが読みやすくなります。例えば選択中のセルの色を変える場合は、次のように書きます。
For Each c In Selection.Cells
' c を処理します
Next c
使い分けの基準として、インデックス(1,2,3)の管理が必要な場合はFor...Nextが向きます。一方で、要素ごとに順次処理するだけならFor Each...Nextが簡潔です。
また、RangeとCellsの違いは参照の仕方にあります。固定範囲を指定するならRange("A1:A10")が適しており、行列番号で参照するならCells(r, c)が向きます。
Do...Loop文の種類と使い分け
Do...Loopは条件評価の位置を変えることで、「繰り返す前に条件をチェック」するDo While/Untilと、「最低1回は実行してから条件をチェック」するLoop While/Untilがあります。
ユーザー入力待ちや、条件が途中で変わる処理には柔軟に対応できます。
例として、Do While SomeFlag = True ... LoopやDo ... Loop Until IsEmpty(ActiveCell)のように使い分けます。
Do While SomeFlag = True
' ...
Loop
Do
' ...
Loop Until IsEmpty(ActiveCell)
条件をループの先頭で評価すると最小回数が0回になり、ループ末尾で評価すると最低1回は実行される点が違いです。
Exit文でループを抜ける方法
Exit ForやExit Doを使うと、途中でループを止めて次の処理に移れます。検索で目的の値が見つかったら残りを処理しないときなどに使います。例えばIf Cells(i,1).Value = target Then Exit Forのように書きます。
よくあるミスとして、Exitを使っても次のネストされた外側のループは止まらないことがあり、意図した範囲で抜けられない原因になります。直し方は外側のフラグ変数を用意してループ終了後に判定するか、関数化してExit Subで抜ける方法を検討します。
注意(ここだけ)
- マクロを動かすにはファイルを.xlsxではなくマクロ有効ブック(.xlsm)で保存し、Excelの「コンテンツの有効化」でマクロを有効にしてください。
要約
For...Nextは回数が決まっている繰り返しに使うです。
Stepで増減幅や逆順が指定でき、符号に要チェックするです。
For Eachはコレクションを簡潔に処理でき、RangeとCellsの使い分けが肝心です。
Do...Loopは条件の評価位置で最低実行回数が変わるため用途で選ぶです。
Exit For/Exit Doは途中退出に使い、ネスト時はフラグや関数化で対応するです。