VBAで繰り返し処理を書くとき、まず For ~ Next を学ぶ方が多いと思います。
しかし実務では、次のような処理をしたい場面がよくあります。
- 選択したセルを1つずつ処理したい
- シートを順番に回して処理したい
- 何行あるか分からない範囲を安全に回したい
そんなときに便利なのが For Each です。
For Each は、Range や Worksheet などの「集合」を1つずつ処理するための構文です。
For Eachとは?(まずはイメージ)
For Each を一言で言うと、次のイメージです。
「この中に入っているものを、1つずつ全部使う」
数字を数えて回す For ~ Next と違い、
「何個あるか」を意識しなくてよいのが大きな特徴です。
For ~ Next との違い
| 比較 | For ~ Next | For Each |
|---|---|---|
| 回し方 | 数値で回す | 要素で回す |
| 件数 | 自分で指定する | 自動で全部 |
| 向いている場面 | 回数が決まっている | 範囲・シートなど |
基本①:RangeをFor Eachで処理する
まずは一番よく使う セル範囲(Range) の例です。
Sub Sample_ForEach_Range()
Dim c As Range
For Each c In Range("A1:A10")
c.Value = c.Value * 2
Next c
End Sub
このコードは、
- A1~A10のセルを
- 上から順番に1つずつ取り出して
- 値を2倍にする
という処理をしています。
ポイント
インデックス(行番号)を一切使っていないので、
初心者でもミスが起きにくい書き方です。
基本②:選択中のセルをFor Eachで処理する
ユーザーが選択したセルだけを処理したい場合も、For Each が最適です。
Sub Sample_ForEach_Selection()
Dim c As Range
For Each c In Selection
c.Interior.Color = vbYellow
Next c
End Sub
選択されているセルが何個あっても、
自動的にすべて処理されます。
基本③:Worksheet(シート)をFor Eachで回す
次は、シートを1枚ずつ処理する例です。
Sub Sample_ForEach_Worksheet()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Range("A1").Value = ws.Name
Next ws
End Sub
このコードは、
- ブック内のすべてのシートを
- 1枚ずつ順番に処理し
- A1セルにシート名を書き込む
という処理をしています。
For Eachを使うメリット
- 件数を数えなくてよい
- 最終行取得が不要
- コードが短く、読みやすい
- 範囲変更に強い
特に初心者のうちは、
For Each を使える場面では積極的に使うのがおすすめです。
よくあるミス①:変数の型が合っていない
For Each の変数は、
回す対象に合った型で宣言する必要があります。
❌ NG例
Dim i As Long
For Each i In Range("A1:A10")
' エラーになる
Next i
✅ 正解
Dim c As Range
For Each c In Range("A1:A10")
Next c
よくあるミス②:Nextの後に変数名を書き忘れる
For Each では、Next 変数名までがセットです。
❌ 読みにくい例
For Each c In Range("A1:A10")
c.Value = 1
Next
✅ おすすめ
For Each c In Range("A1:A10")
c.Value = 1
Next c
For Eachが向いていないケース
次のような場合は、For ~ Next のほうが向いています。
- 「5回だけ」など回数が決まっている
- 逆順で処理したい
- インデックス番号を使った計算が必要
それ以外の多くのケースでは、For Each のほうが安全です。
実務でよく使うFor Eachの例
- 空白セルを探す
- 条件に合うセルだけ色付け
- 全シートの同じセルを更新
- 選択範囲をまとめて処理
まとめ:For Eachは初心者の強い味方
- RangeやWorksheetの処理はFor Eachが基本
- 件数や最終行を気にしなくてよい
- コードが短く、読みやすい
- ミスが起きにくい
VBAを学び始めたら、
For ~ Next と For Each の両方を使い分けられるようになると、 コードのレベルが一段上がります。
まずは、今使っているFor文を1つ、For Eachに書き換えてみてください。


コメント