【VBA入門】For Eachの使い方|For NextやDo Loopとの違いも解説

この記事はアフィリエイト広告を利用しています。
【VBA入門】For Eachの使い方|For NextやDo Loopとの違いも解説

ようこそ♪ささぽんのExcel教室へ。

VBAで「繰り返し処理」を書こうとして、For NextやDo Loopでつまずいた経験はありませんか?

セルや配列を扱うとき、「思った通りにループしない」「処理が飛んでしまう」といった悩みは、初心者がよくぶつかる壁です。
そんなときにこそ使ってほしいのが、For Each文です。
シンプルな構文で、配列やセル範囲を自然な流れで処理できるため、実務でも非常によく使われます。

この記事では、For Eachの基本的な使い方から、For文・Do文との違いや使い分け実務での活用例までをやさしく解説します!

ささぽん

この記事は以下のような方におすすめです!
・VBAの基本的なループ処理を学びたい方
・ループ処理のバリエーションを増やしたい方

・For文との違いや使い分けが知りたい方

このブログは「基礎からExcelマクロを学びたいと考えている方」や、
「独学での習得に壁を感じた方」に向けて、やさしく、わかりやすく、丁寧に解説しています。

読み終わるころにはきっと、
Excelマクロって意外と簡単かも!」「もっとやってみたい!」と思えるはず。

一緒に楽しく学びながら、Excelマクロ使いを目指しましょう!

目次

1.For Eachとは?繰り返し処理の基本と構文

◼︎繰り返し処理の基本とFor Eachの役割

◼︎For Eachの基本構文

2. For Eachの実践パターンを押さえよう

◼︎セル範囲を1つずつ処理する

◼︎配列を処理する

◼︎Collectionやオブジェクトを扱う応用例

3. For Next・Do Loopとの違いと使い分け

◼︎3つのループ構文を比較しよう

◼︎それぞれの得意分野と選び方

4. For Eachの注意点と対応策

◼︎動的配列の処理をする際の注意

◼︎配列やセルの値を変更したいときの注意

◼︎範囲指定ミスによる意図しないループに注意

5. まとめ|自分に合ったループ処理を選ぼう

◼︎For Eachの特徴と活用シーンの整理

◼︎3つのループ構文の使い分け比較

◼︎初心者が押さえておきたい注意点まとめ

1.For Eachとは?繰り返し処理の基本と構文

◼︎繰り返し処理の基本とFor Eachの役割

プログラミングにおいて「同じ処理を何度も繰り返す」ことはよくあります。
VBAでもこれを実現するために、いくつかのループ構文が用意されています。

その中でもFor Each文は、配列やセル範囲などの“集まり”を自然な流れで1つずつ処理したいときに最適な構文です。

特に、次のようなケースではFor Eachが活躍します。

  • A列の全セルに同じ処理をしたい
  • コレクション内のオブジェクトを順番に処理したい
  • 配列の中身を1つずつ確認・出力したい

このように「要素を1つずつ取り出して処理する」場合に、For Eachはとてもシンプルで書きやすく、初心者にも扱いやすい構文です。

◼︎For Eachの基本構文

まずは、For Each文の基本構文を見てみましょう。


Dim 変数 As 型
For Each 変数 In コレクション
 処理
Next 変数

この構文のポイントは以下の3つです。

  • 「変数」には、処理対象となる1要素が1回ごとに代入される
  • 「コレクション」は、配列やRangeオブジェクト、Collectionなどの複数要素の集まり
  • 「Next」で次の要素の処理に移動し、すべての要素を処理するとループ終了する

たとえば「A1〜A5までのセルに“OK”と書き込む」場合は、以下のように書けます。


Dim c As Range
For Each c In Range(“A1:A5”)
 c.Value = “OK”
Next c

このように、For Eachを使えば、ループ回数やインデックスを意識せずにシンプルに書けるのが特徴です。

For Eachは、「複数の要素を1つずつ順番に処理したい」場面で非常に便利な構文です。
構文がシンプルで、繰り返し処理にありがちなエラーも少なく済みます。

次章では、配列やセル範囲など、実務でよく使うパターンを取り上げていきましょう。

2. For Eachの実践パターンを押さえよう

◼︎セル範囲を1つずつ処理する

For Eachのもっとも代表的な使い方が、セル範囲のループ処理です。
たとえば「特定の列の値をすべてチェックする」「条件に応じて色をつける」といった処理は、日常業務でもよく登場します。

以下は、A列の1行目〜10行目までのセルを1つずつチェックし、「空白なら“未入力”と表示する」サンプルコードです。


Sub CheckEmptyCells()
 Dim c As Range
 For Each c In Range(“A1:A10”)
  If c.Value = “” Then
   c.Value = “未入力”
  End If
 Next c
End Sub

このように、For Eachを使えば「セル範囲の1つ1つに同じ処理をしたい」という場面を、シンプルかつ明快な構文で実現できます。

◼︎配列を処理する

VBAでは、配列の中身を1つずつ取り出して処理する場面もよくあります。
For Eachは、固定長配列やVariant型の配列に対して、とてもスマートに使えます。

以下は、配列内の値をすべてメッセージボックスで表示する基本例です。


Sub ShowArrayValues()
 Dim fruits As Variant
 Dim item As Variant

 fruits = Array(“りんご”, “みかん”, “バナナ”)

 For Each item In fruits
  MsgBox item
 Next item
End Sub

このコードでは、fruits配列の中身が順にitemに代入され、1つずつ表示されます。

インデックスの指定や上限・下限を気にせず書けるのが、For Eachの大きな利点です。

なお、動的配列や2次元配列にはそのまま使えないこともあるため、注意してください。
配列について詳しく学びたい方は、以下の記事をご覧ください!

◼︎Collectionやオブジェクトを扱う応用例

For Eachは、配列だけでなくCollection(コレクション)やオブジェクトの集まりにも非常に適しています。
Collectionとは、複数の値やオブジェクトを1つにまとめて管理できるデータ構造で、VBAでよく使われます。

以下は、Collectionに格納された名前を順番に表示する例です。


Sub LoopThroughCollection()
 Dim names As New Collection
 Dim n As Variant

 names.Add “佐藤”
 names.Add “田中”
 names.Add “鈴木”

 For Each n In names
  MsgBox n
 Next n
End Sub

また、ワークシートやワークブックなど、VBAのオブジェクト群にもFor Eachは有効です。

たとえば「すべてのシート名を取得する」処理も次のように簡単に書けます。


Sub ShowSheetNames()
 Dim ws As Worksheet
 For Each ws In ThisWorkbook.Worksheets
  Debug.Print ws.Name
 Next ws
End Sub

このように、For EachはCollectionやオブジェクトを扱う場面でも直感的かつミスが少ない書き方ができます。

For Eachは、セル・配列・Collectionなど、複数の要素を順番に処理したいときに非常に役立ちます。
特に「ループの回数」や「インデックス」を意識せずに書ける点が、初心者にとって大きなメリットです。

次章では、他のループ構文(For Next・Do Loop)との違いに注目し、それぞれの使いどころを整理していきましょう。

3. For Next・Do Loopとの違いと使い分け

◼︎3つのループ構文を比較しよう

VBAには、主に3つの繰り返し構文があります。
それぞれの構文は、処理の目的や対象によって使い分ける必要があります。

以下の表に、For Each・For Next・Do Loopの主な特徴をまとめました。

構文特徴向いている処理
For Each要素を1つずつ順に処理セル範囲、配列、Collectionなどの“集まり”を扱うとき
For Next回数やインデックスで制御「1〜10回繰り返す」など明確な回数の処理
Do Loop条件に応じて繰り返す条件が真の間だけループ、または条件成立までループ

たとえば、「すべてのセルに処理をしたい」ならFor Each、

「1〜5まで数値を加算」ならFor Next、

「入力されるまで繰り返す」ならDo Loopが向いています。

この比較をもとに、次項ではそれぞれの得意分野をもう少し具体的に解説していきます。

◼︎それぞれの得意分野と選び方

3つの構文にはそれぞれ向き・不向きがあり、処理したい内容に応じて使い分けることがポイントです。

以下に、典型的な用途とともに、選び方の目安を紹介します。

  • For Each:セルや配列など要素の数が明確でなくても全体を処理したいとき
    例)表のすべての行に処理をする、コレクションを1つずつチェックする
  • For Next特定の回数だけ処理を繰り返したいとき
    例)1〜10まで加算する、10回ループしてランダムに値を表示する
  • Do Loop条件に応じて繰り返す必要があるとき(開始前または終了後に条件判定)
    例)セルが空でない間入力を続ける、ユーザーが「はい」と言うまでメッセージを繰り返す

For Eachは回数や順番を意識せず、対象を1つずつ処理するだけでよい場合に特に強みを発揮します。

その一方で、処理の中で「何番目か」を把握したい場合はFor Nextが向いています。

4. For Eachの注意点と対応策

◼︎動的配列の処理をする際の注意

For Eachは、配列の中身を1つずつ処理するのに便利ですが、動的配列を扱う場合には定義のしかたに注意が必要です。

たとえば、次のようにVariant型の変数に1次元の配列を格納している場合は、For Eachで問題なく処理できます。


Dim arr As Variant
ReDim arr(0 To 2)
arr(0) = “A”: arr(1) = “B”: arr(2) = “C”

For Each v In arr
 Debug.Print v
Next

一方で、Integer型やString型など、特定の型で動的配列を定義した場合は、For Eachでの処理に制限が出ることがあります。
配列の型や構造によっては、For Eachで正しく動作しなかったり、書き換えができなかったりする可能性があるため注意が必要です。

安全に処理したい場合は、次のようにFor文でインデックスを指定する方法も選択肢に入れておくと安心です。


Dim arr() As Integer
ReDim arr(0 To 2)

Dim i As Long
For i = LBound(arr) To UBound(arr)
 Debug.Print arr(i)
Next i

このように、動的配列をFor Eachで使うには、Variant型で定義することが重要です。処理に応じて、For文との使い分けも検討しましょう。

◼︎配列やセルの値を変更したいときの注意

For Eachは「要素を1つずつ取り出して処理する」ことに特化した構文です。
しかし、配列やセルの値そのものを変更したい場合には、注意が必要です。

たとえば、次のように配列内の値を変更しようとすると、うまくいかないことがあります。


Dim arr As Variant
arr = Array(1, 2, 3)

For Each v In arr
 v = v * 2 ’ 元のarrの中身は変わらない
Next

このコードでは、変数vに要素のコピーが渡されており、vを変更しても元の配列の値には影響しません

つまり、For Eachでは「要素の読み取り」はできても「書き換え」は直接できないということです。

セルに対しては、Rangeオブジェクトを操作するため以下のように変更が可能です。


Dim c As Range
For Each c In Range(“A1:A3”)
 c.Value = c.Value * 2
Next

このように、セルはオブジェクトなので参照渡しになり、値の更新も可能です。

一方で、配列の要素を更新したい場合は、For文でインデックスを使った処理が適しています。

◼︎範囲指定ミスによる意図しないループに注意

For Eachでセル範囲を処理する場合、Rangeの指定ミスが思わぬ結果を引き起こすことがあります

特に注意が必要なのは、次のようなケースです。


Dim c As Range
For Each c In Range(“A:A”)
 If c.Value = “” Then Exit For
 Debug.Print c.Value
Next

このコードは、一見「A列の空白までを処理する」ように見えますが、Range(“A:A”)はA列全体(1〜1048576行)を対象としているため、パフォーマンスに大きく影響する可能性があります。

また、結合セルや空白セルが混在する範囲を指定すると、「思った通りの順番や回数で処理されない」こともあります。

範囲を指定する際は、以下のような工夫をすると安全です。

  • UsedRangeやEndプロパティを使って実データ範囲を特定する
  • 明示的に「A1:A10」のように範囲を限定する
  • 結合セルや空白セルを含む場合は、事前に確認や分岐を入れる

For Eachはループ対象をすべて処理しようとするため、処理対象の範囲を正確に絞り込むことが大切です。

For Eachは便利な構文ですが、配列の型やセル範囲の指定方法によっては、思わぬ制限やトラブルが発生することがあります。
動的配列を扱う際は型の定義に注意し、値の変更が必要な場合は他のループ処理との併用も視野に入れましょう。

5. まとめ|自分に合ったループ処理を選ぼう

◼︎For Eachの特徴と活用シーンの整理

まずは、VBAにおけるFor Each構文の基本的な特徴と、実務でよく使われるパターンを振り返っておきましょう。

  • セル範囲や配列、Collectionなどの“集まり”を順番に処理できる
  • 回数やインデックスを意識せず、シンプルにループが書ける
  • セル(Rangeオブジェクト)は値の書き換えも可能
  • 配列の値を変更したいときはFor文との使い分けが必要
  • 範囲指定ミスや型の制限に注意が必要

For Eachは、「対象が決まっていて、順番に処理したいだけ」の場面で最も効果を発揮します。

余計なカウント処理や条件分岐を省けるため、コードも読みやすく保てます。

◼︎3つのループ構文の使い分け比較

VBAにおける主な繰り返し処理の構文は、以下の3つです。

それぞれの特徴と向いている処理を表で整理しましょう。

構文特徴向いている処理
For Each要素を1つずつ順に処理セル範囲、配列、Collectionなどの“集まり”を扱うとき
For Next回数やインデックスで制御「1〜10回繰り返す」など明確な回数の処理
Do Loop条件に応じて繰り返す条件が真の間だけループ、または条件成立までループ

迷ったときの判断基準は以下のとおりです。

  • 対象が“集まり”で順に処理したい → For Each
  • 何回ループするか決まっている → For Next
  • 条件で繰り返しを制御したい → Do Loop

このように、構文ごとの特性を理解して使い分けることで、ミスも減り、読みやすいマクロが書けます

◼︎初心者が押さえておきたい注意点まとめ

最後に、For Eachを使う上で初心者がつまずきやすいポイントを、確認リストとして整理しておきましょう。

  • 配列をFor Eachで処理する場合、Variant型で定義すると安全
  • 配列の値は直接書き換えできない(値を変更するならFor文を使う)
  • セルの値はRangeオブジェクトを通じて変更可能
  • セル範囲は「A1:A10」など、明確に指定するのが基本
  • UsedRangeやEndプロパティを活用して、実データ範囲を特定
  • 配列の次元や中身の構造を理解しておく(2次元配列には注意)

これらの注意点を意識しておくだけで、For Eachのトラブルはかなり防げます

構文の特性をマスターして、ぜひ実務でもFor Each構文を使ってみてくださいね!

\ Excelマクロ制作も承っています /

各種クラウドソーシングサイトにて業務効率化ツールの作成・カスタマイズを承っております。
ご相談・お見積もりは無料ですので、まずはお気軽にご覧ください!

見積もり無料!超効率化!Excelマクロ開発します ルーティンワークの煩わしさに悩んでいる方へ