Excel VBAでループの使い方をお探しですね。

広告

Excel VBAの繰り返し処理を使いこなそう!For NextとDo Whileの違いと使い分け

Excel VBAで大量のセルを処理するとき、同じ命令を何度も手作業で書くのは大変ですよね。

そんなときに便利なのが「繰り返し処理」、つまりループです。

1行目から最終行まで値を入力したり、空白セルが出るまで処理したり、複数シートを順番に操作したり――こうした作業を自動化できるんです。

この記事では、Excel VBAの繰り返し処理の基本を整理しながら、特によく使う「For Next」と「Do While」の違いや使い分け、実務でつまずきやすいポイントまで分かりやすく解説していきます。

Excel VBAの繰り返し処理って何?どんなときに使うの?

Excel VBAの繰り返し処理とは、同じ処理を何回も、または特定の条件を満たすまで自動で実行してくれる便利な仕組みです。

例えば、こんな作業を想像してみてください。

– A1からA100まで連番を入力する
– A列にデータが入っている行だけ、B列に計算結果を出す
– 複数のワークシートに同じ書式を設定する

もしループを使わずに100行分の処理を全部手書きしたら…コードが長くなるだけじゃなくて、修正漏れや入力ミスも増えてしまいます。

VBAで業務を効率化したいなら、ループ処理は避けて通れない基本技術なんです。

VBAでよく使われるループには、いくつか種類があります。

– **For Next**:回数を指定して繰り返す
– **Do While**:条件が成り立つ間、繰り返す
– **Do Until**:条件が成り立つまで繰り返す
– **For Each**:コレクション内の要素を順番に処理する

この中でも、初心者がまず押さえておきたいのが「For Next」と「Do While」です。

使い分けのコツはシンプル。

**繰り返す回数が最初から分かっているならFor Next**、**繰り返す回数が実行してみないと分からないならDo While**を使います。

この判断基準を持っておくと、コードが読みやすくなって、後から見返したときも処理の意図が伝わりやすくなりますよ。

For Nextの使い方:回数が決まっている処理に便利!

For Nextは、指定した開始値から終了値までカウンター変数を変化させながら処理を繰り返す構文です。

「1行目から10行目まで処理する」「1列目から5列目まで値を入れる」のように、繰り返す範囲や回数がはっきりしている場合に向いています。

基本の書き方はこんな感じです。

“`vb
Sub ForNextSample()
Dim i As Long

For i = 1 To 10
Cells(i, 1).Value = i
Next i
End Sub
“`

このコードでは、変数iが1から10まで1ずつ増えながら、A1からA10に連番を入力しています。

`Cells(i, 1)`は「i行目、1列目」という意味なので、iが1ならA1、iが2ならA2、iが10ならA10が対象になります。

For Nextのいいところは、カウンター変数が自動的に増えていくこと。

だから行番号や列番号を扱う処理ととても相性がいいんです。

ちなみに、変数の型はIntegerでも動きますが、Excelの行数は多いので、実務ではLong型を使う方が安全です。

Stepで増減幅を変えられる

For Nextでは、`Step`を使うことでカウンター変数の増減幅を指定できます。

普通は1ずつ増えますが、「Step 2」と書けば2ずつ増えますし、「Step -1」と書けば逆方向に減っていきます。

例えば、1行おきに処理したい場合や、**行を削除するときに下から上へ処理したい場合**に便利です。

特に行削除では、上から順番に削除すると行番号がずれて処理漏れが起きることがあるので、逆順ループを使うのが定番なんです。

“`vb
Sub ReverseLoopSample()
Dim i As Long

For i = 10 To 1 Step -1
If Cells(i, 1).Value = “” Then
Rows(i).Delete
End If
Next i
End Sub
“`

ループを入れ子にする

For Nextは入れ子(ネスト)にして使うこともできます。

行と列の両方を処理したい場合は、外側のループで行、内側のループで列を動かすと、表全体に値や書式を設定できます。

ただし、ネストが深くなりすぎるとコードが読みづらくなるので注意。

2重ループはよく使いますが、3重以上になる場合は、処理を別のプロシージャに分けたり、対象範囲を見直したりして、読みやすさを保つ工夫が必要です。

Do Whileの使い方:条件を満たす間だけ繰り返す

Do Whileは、指定した条件がTrue(真)である間だけ処理を繰り返す構文です。

For Nextが「何回繰り返すか」を基準にするのに対し、Do Whileは「どの条件の間は続けるか」を基準にします。

そのため、繰り返し回数があらかじめ分からない場面でよく使われます。

例えば、

– A列にデータが入っている間だけ処理する
– ユーザーが特定の文字を入力するまで入力を求める
– ファイルが存在する間だけ処理する

といったケースですね。

“`vb
Sub DoWhileSample()
Dim i As Long
i = 1

Do While Cells(i, 1).Value <> “”
Cells(i, 2).Value = Cells(i, 1).Value * 2
i = i + 1
Loop
End Sub
“`

このコードでは、A列のセルが空白でない間、A列の値を2倍してB列に入力しています。

ここで重要なのが、ループ内で「i = i + 1」として行番号を進めている点です。

Do Whileでは、For Nextのようにカウンター変数が自動で増えるわけではありません。

だから、条件に関係する変数をループ内で変化させないと、いつまでも同じセルを見続けてしまって、**無限ループ**になる可能性があります。

無限ループとは処理が終わらなくなる状態で、VBAが固まったように見える原因になるので気をつけましょう!

条件の判定タイミングを選べる

Do Whileには、条件を最初に判定する書き方と、最後に判定する書き方があります。

– **Do While 条件 ~ Loop**:処理の前に条件を確認。

最初から条件を満たしていなければ1回も実行されない
– **Do ~ Loop While 条件**:先に処理を実行してから条件を確認。

最低1回は処理される

例えば、ユーザーにInputBoxで入力を求める処理のように、まず一度は入力画面を出したい場合は後判定の書き方が向いています。

Do UntilとDo Whileの違い

Do Whileと似た構文に「Do Until」があります。

– **Do While**:「条件が成り立つ間、繰り返す」
– **Do Until**:「条件が成り立つまで、繰り返す」

同じ処理でも条件式を反転させればどちらでも書けますが、読みやすさは処理内容によって変わります。

例えば、「空白でない間続ける」なら`Do While Cells(i, 1).Value <> “”`が自然ですし、「空白になるまで続ける」なら`Do Until Cells(i, 1).Value = “”`が自然です。

チームでコードを共有する場合は、条件文を読んだだけで終了条件が分かる書き方を選ぶと、後々メンテナンスしやすくなりますよ。

For NextとDo Whileの違い・使い分けと実務での注意点

For NextとDo Whileの最も大きな違いは、**繰り返しの基準**です。

– **For Next**:開始値と終了値が決まっていて、回数を管理しながら処理
– **Do While**:条件がTrueである限り処理を続ける。

データの件数や終了タイミングが実行時に変わる処理に向いている

つまり、「1行目から100行目まで必ず処理する」ならFor Next、「A列のデータが何行あるか分からないけど空白セルまで処理したい」ならDo While、という使い分けになります。

| 比較項目 | For Next | Do While |
|—|—|—|
| 向いている処理 | 回数や範囲が決まっている処理 | 条件で終了する処理 |
| 代表例 | 1〜100行目を処理、列を順番に処理 | 空白セルまで処理、入力がある間処理 |
| カウンターの変化 | 基本的に自動で増減する | 自分で変数を更新する必要がある |
| 注意点 | Stepの向きや終了値の設定ミス | 無限ループに注意 |

実務でよくある迷いどころ

実務では、「最終行を取得してFor Nextで回す」方法と、「空白セルまでDo Whileで回す」方法のどちらを使うか迷うことがあります。

データの途中に空白行がないことが保証されているならDo Whileでも問題ありませんが、**途中に空白が入る可能性がある表では、空白セルに到達した時点で処理が止まってしまいます**。

その場合は、最終行を取得してFor Nextで処理する方が安全です。

例えば`Cells(Rows.Count, 1).End(xlUp).Row`でA列の最終行を取得して、1行目から最終行までFor Nextで回すと、途中の空白にも対応しやすくなります。

“`vb
Sub LastRowForNextSample()
Dim i As Long
Dim lastRow As Long

lastRow = Cells(Rows.Count, 1).End(xlUp).Row

For i = 1 To lastRow
If Cells(i, 1).Value <> “” Then
Cells(i, 2).Value = Cells(i, 1).Value & ” 処理済み”
End If
Next i
End Sub
“`

途中でループを抜ける方法

ループ処理では、途中で条件を満たしたら抜ける書き方も覚えておくと便利です。

– **For Next**:`Exit For`
– **Do While**:`Exit Do`

例えば、一覧の中から「完了」という文字を探して、見つかった時点で処理を終了する場合、最後まで無駄にループする必要はありませんよね。

Exit文を適切に使うと処理速度の改善にもつながります。

ただし、多用しすぎると処理の流れが追いにくくなるので、「見つかったら終了」「エラー条件なら中断」のように目的が明確な場面で使うのがおすすめです。

初心者がつまずきやすいポイント

最後に、初心者がよくつまずくポイントを整理しておきましょう。

**For Nextでよくあるミス**
– 逆順に処理したいのに`Step -1`を書き忘れると、ループが1回も実行されないことがある

**Do Whileでよくあるミス**
– 条件を変化させる処理を書き忘れると無限ループになる

**処理速度の問題**
– ループ内でセルを1つずつ操作すると処理が遅くなる場合がある
– 大量データでは配列に読み込んで処理する方法も検討できる

まずは「**回数が決まっているならFor Next**」「**条件で続けるならDo While**」という基本を押さえましょう。

慣れてきたら、For Each、Do Until、配列処理などへ学習を広げていくと、Excel VBAで扱える自動化の幅がぐっと広がりますよ!

広告