【2026年8月最新】VBAのFor Each文とは?配列・コレクション・Selectionをループ処理する使い方をやさしく解説
「Excel VBAのマクロを見ていたら、For Eachという見慣れない書き方が出てきた」「配列やコレクションを1件ずつ処理したいけれど、For Nextとどう違うのか分からない」——経理・総務・営業事務の現場で、こうした疑問にぶつかる方は少なくありません。
For Eachステートメントは、Excel VBAで配列・シート・選択セル範囲・フォルダ内ファイルなど「複数の要素の集まり」を1件ずつ自動で処理するための構文です。件数を数える必要がなく、書き方も比較的シンプルなため、VBA入門者が最初につまずきやすい一方で、覚えてしまえば非常に汎用性の高い道具になります。
この記事では、For Eachの基本構文から、配列・Selection・Worksheetsコレクション・フォルダ内ファイル一覧の取得まで、実務でよく使う4つの使い方を整理します。さらに後半では、弊社(株式会社GENAI)の実運用データをもとに、「そもそもVBAのループ処理を書かなくても、AIに日本語で指示するだけで同じことができる」という選択肢についても紹介します。
この記事を最後まで読むと、次の6つが明確になります。
01 BASICS For Eachステートメントとは何か VBAのループ処理の中でも「集まりを丸ごと処理する」ための構文
Excel VBAで「同じ処理を繰り返す」ための構文(ステートメント)には、代表的なものが2種類あります。1つは件数(インデックス番号)を指定して回すFor...Next、もう1つが今回解説するFor Each...Nextです。
📚 用語解説
VBA (Visual Basic for Applications):Excel・Word・AccessなどMicrosoft Office製品に組み込まれているプログラミング言語。マクロと呼ばれる自動処理を作成するために使われます。Officeさえあれば追加インストールなしで使える手軽さから、経理・総務・営業事務など非エンジニア職種でも古くから利用されてきました。
📚 用語解説
ステートメント:プログラミング言語における「命令文」の単位。VBAではFor EachやIfのように、決まったキーワードで始まる命令のかたまりをステートメントと呼びます。日本語で言えば「〜せよ」という1つの業務指示に相当します。
For Eachの最大の特徴は、「対象がいくつあるか」を自分で数える必要がないという点です。配列の要素数やフォルダ内のファイル数が実行のたびに変わっても、コードを一切修正せずに、集まりの中身を先頭から最後まで自動で1つずつ処理してくれます。
For Eachが処理できる対象は、大きく分けて次の3種類です。
| 対象 | 具体例 | 本記事での解説箇所 |
|---|---|---|
| 配列 | Dim arr(2) As String などで宣言した配列 | 第2章 |
| オブジェクトの集まり(コレクション) | Worksheets・Workbooks・Selection・Files など | 第3〜5章 |
| 独自に作成したCollectionオブジェクト | Collectionクラスで自作したデータの集まり | 第2章 |
📚 用語解説
コレクション:同じ種類のオブジェクトをまとめて管理する「入れ物」のこと。VBAでは、開いているシート全部をまとめたWorksheets、開いているブック全部をまとめたWorkbooksなど、あらかじめ用意されたコレクションが数多く存在します。For Eachはこのコレクションと非常に相性のよい構文です。
「配列やシートが何個あるか分からないが、全部に同じ処理をしたい」というときはFor Eachの出番です。逆に「3番目の要素だけ処理したい」「番号を使って計算したい」という場合はFor Nextの方が適しています(詳しくは第2章で解説します)。
02 BASIC SYNTAX 基本構文と配列操作・For Nextとの使い分け 配列を1周する基本形から、逆順ループができない理由まで
まずはFor Eachの基本構文を見てみましょう。配列の中身を順番に処理する、もっとも基本的な形です。
Sub SampleForEachArray()
Dim fruits(2) As String
Dim item As Variant
fruits(0) = "りんご"
fruits(1) = "みかん"
fruits(2) = "ぶどう"
For Each item In fruits
Debug.Print item
Next item
End Sub
構文はFor Each 変数 In 対象で始まり、Next 変数で終わります。ここでのitemは「ループ変数」と呼ばれ、対象(この例では配列fruits)の中身が1つずつ順番に代入されていきます。配列の要素数をUBound関数などで数える必要が一切ない点が、通常のFor文との大きな違いです。
2-1. ループ変数の型はVariantにしておくのが安全
For Eachのループ変数は、対象の中身に合わせて型を柔軟に受け取れるVariant型で宣言するのが基本です。配列が文字列ならString型でも動きますが、オブジェクトのコレクション(Worksheetsなど)を処理する場合は、対象のオブジェクト型(WorksheetやRangeなど)またはVariant型で宣言する必要があります。
2-2. For Nextとの使い分け
For NextとFor Eachは、どちらも「繰り返し処理」を行う点は共通していますが、得意な場面がはっきり分かれています。
| 観点 | For Next | For Each |
|---|---|---|
| 何を指定するか | 開始番号・終了番号(インデックス) | 対象の集まり(配列・コレクション)そのもの |
| 件数の把握 | 事前に件数(UBoundなど)が必要な場合が多い | 不要。集まりの中身を自動で全部処理 |
| 要素番号の利用 | ◎ i番目という情報を計算に使える | △ 標準では要素番号を直接扱えない |
| 逆順ループ | ◎ Step -1 で簡単に対応可能 | × 標準では非対応(後述) |
| 向いている場面 | 番号を使った計算・特定範囲だけの処理 | 集まり全体に同じ処理を一律で行いたいとき |
たとえば「3番目から5番目の要素だけを処理したい」「要素番号を使って別の配列と突き合わせたい」といった、番号そのものに意味がある処理ではFor Nextが適しています。一方、「集まりの中身全部に同じ処理をしたいだけ」で番号自体には意味がない場合は、コードがシンプルになるFor Eachの方が読みやすくなります。
2-3. 逆順でループを回すには?(For Eachの制約)
ここでよくある誤解が、「For Eachでも逆順に処理できるのでは」というものです。結論から言うと、For Eachには逆順に処理するための標準的な機能(Stepオプション)が存在しません。For NextであればStep -1を指定するだけで簡単に逆順ループが組めますが、For Eachには同等の指定方法が用意されていないのです。
' For Nextなら逆順は簡単
Dim i As Long
For i = UBound(fruits) To LBound(fruits) Step -1
Debug.Print fruits(i)
Next i
' For Eachには Step 相当の指定がない(逆順不可)
配列の要素数を変えながら(削除しながら)For Eachでループを回すと、内部で管理している要素の位置がずれて、想定外の要素をスキップしたり、エラーが発生したりすることがあります。要素を削除しながら処理したい場合は、後ろから前に向かって処理できるFor Next(Step -1)を使うのが安全です。
つまり、「逆順に処理したい」「要素を削除しながら処理したい」というケースでは、For Eachではなく素直にFor Nextを使うのが正解です。For Eachはあくまで「順番を問わず、集まり全体に同じ処理を行いたいとき」に向いた構文だと覚えておきましょう。
03 SELECTION Selectionを1セルずつ操作する方法 ユーザーが選択した範囲を、For Eachで自動処理する
📚 用語解説
Selection:Excelの画面上で、ユーザーが現在マウスやキーボードで選択しているセル範囲・図形・グラフなどを表すオブジェクト。マクロ実行時にどこが選ばれているかによって内容が変わる「動的な対象」である点が特徴です。
「選択した範囲だけを一括で処理したい」という要望は、経理・営業事務の現場で非常によく出てきます。For Eachを使えば、選択されているセルが何個あっても、コードを変えずに1セルずつ同じ処理を実行できます。
Sub SampleForEachSelection()
Dim cell As Range
For Each cell In Selection
If IsNumeric(cell.Value) And Not IsEmpty(cell.Value) Then
cell.Value = cell.Value * 1.1
End If
Next cell
End Sub
この例では、選択範囲の中の数値が入っているセルだけを1.1倍にしています。あらかじめ「選択範囲は何行何列か」を調べる必要がなく、ユーザーがどんな範囲を選んでも同じマクロで対応できるのが、Selectionをループ処理する最大のメリットです。なお、VBAのIsNumeric関数は空セル(Empty)に対してもTrueを返すため、条件をIsNumeric(cell.Value)だけにすると空セルまで0×1.1として書き換えてしまいます。空セルを除外するには、上記コードのようにAnd Not IsEmpty(cell.Value)を条件に加えます。
3-1. 複数範囲(離れたセル)を選択している場合
Ctrlキーを押しながら複数の離れた範囲を選択している場合でも、For Each cell In Selectionと書くだけで、すべての範囲にまたがる全セルを順番に処理できます。範囲ごとにコードを分ける必要がなく、選択がどれだけ複雑な形になっていてもFor Eachが自動的に1セルずつ拾ってくれます。
Selectionはユーザーの操作次第で内容が変わるため、「セルが1つも選ばれていない」「シート以外(グラフなど)が選ばれている」という状態で実行されるとエラーになることがあります。マクロの冒頭でIf TypeName(Selection) <> "Range" Then Exit Subのようなチェックを入れておくと安全です。
3-2. SelectionとActiveSheet.UsedRangeの違い
似た用途で使われるものにActiveSheet.UsedRange(シート内でデータが入力されている全範囲)があります。Selectionはユーザーが今選んでいる範囲、UsedRangeはシート上でデータが存在する範囲全体という違いがあり、目的に応じて使い分けが必要です。「毎回同じ範囲を自動で処理したい」ならUsedRange、「ユーザーが選んだ範囲だけ処理したい」ならSelectionが適しています。
Selectionはマクロ実行時点でのアクティブな選択状態に依存するため、他のプロシージャから呼び出したり、自動実行(イベントマクロ)で使ったりすると、意図しない範囲が対象になることがあります。基本的には「ユーザーがボタンを押して実行する」用途に限定して設計するのが安全です。
04 COLLECTIONS Worksheets・Workbooksコレクションの操作 シート・ブック単位でまとめて処理する
📚 用語解説
オブジェクト:VBAで操作の対象となる「モノ」の総称。1枚のシートはWorksheetオブジェクト、1つのセルはRangeオブジェクト、1冊のブックはWorkbookオブジェクトとして扱われます。For Eachは、こうしたオブジェクトが複数集まったコレクションを処理するのが得意です。
複数のシートに同じ処理を行いたい場合は、WorksheetsコレクションをFor Eachでループします。
Sub SampleForEachWorksheets()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Range("A1").Value = "処理済"
Debug.Print ws.Name & " を処理しました"
Next ws
End Sub
4-1. Worksheetsコレクションの注意点
Worksheetsコレクションには、非表示になっているシートも含まれます。「見えているシートだけ処理したい」場合は、For Eachのループ内でws.Visibleプロパティを判定し、非表示シートをスキップする処理を追加する必要があります。
Worksheetsには、表示・非表示を問わず全てのワークシートが含まれるWorksheetsには含まれず、全種類のシートを扱いたい場合はSheetsコレクションを使うws.Visible = xlSheetVisibleで表示状態を判定できる4-2. Workbooksコレクション(複数ブックの一括処理)
同時に開いている複数のExcelブックに対して同じ処理をしたい場合は、WorkbooksコレクションをFor Eachで処理します。
Sub SampleForEachWorkbooks()
Dim wb As Workbook
For Each wb In Workbooks
Debug.Print wb.Name & " / 保存済み: " & wb.Saved
Next wb
End Sub
この構文は、複数の集計ブックをまとめて上書き保存したい、開いている全ブックの保存状態をチェックしたいといった、月次処理・締め作業でよく使われるパターンです。
Worksheets.CountやWorkbooks.Countで事前に対象の件数を確認し、想定通りの件数かログに出力しておくと、「意図しないシート・ブックまで処理してしまった」という事故を未然に防げます。
05 ADVANCED USAGE 【応用】フォルダ内ファイルを一括取得する FileSystemObjectと組み合わせて、ファイル単位のループ処理を行う
📚 用語解説
FileSystemObject (FSO):Windowsのファイル・フォルダを操作するためのオブジェクト。VBA標準の機能ではなく、Microsoft Scripting Runtimeという外部ライブラリが提供する機能です。ファイル一覧の取得・コピー・削除・存在チェックなど、Excel VBA単体より高機能なファイル操作ができます。
For Eachは配列やシートだけでなく、フォルダの中にあるファイルの集まりにも使えます。ここではFileSystemObjectと組み合わせて、フォルダ内の全ファイル名を取得する例を紹介します。
Sub SampleForEachFiles()
Dim fso As Object
Dim folder As Object
Dim file As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder("C:\請求書")
For Each file In folder.Files
Debug.Print file.Name & " / 更新日: " & file.DateLastModified
Next file
End Sub
📚 用語解説
後期バインディング (CreateObject):事前に「参照設定」でライブラリを登録しなくても、実行時にCreateObject("Scripting.FileSystemObject")のようにオブジェクトを生成する方法。上記コード例のようにObject型で宣言して後期バインディングを使うと、参照設定の登録漏れによる「別のPCでは動かない」というトラブルを避けやすくなります。
5-1. 参照設定を使う「早期バインディング」との違い
FileSystemObjectを使うには、VBEの「ツール」→「参照設定」からMicrosoft Scripting Runtimeを有効にする「早期バインディング」という方法もあります。早期バインディングは入力補完が効いて書きやすい反面、参照設定が有効になっていない別のPCでマクロを開くとエラーになるという弱点があります。社内で複数人がマクロを共有する場合は、コード例のようにObject型で宣言する後期バインディングの方がトラブルが起きにくく安全です。
5-2. サブフォルダの中まで取得したい場合
上記のコード例は1階層分のファイルのみが対象です。サブフォルダの中身まで含めて全ファイルを取得したい場合は、folder.SubFoldersプロパティをFor Eachでループし、自分自身のプロシージャを再帰的に呼び出す処理が必要になります。
GetFolderで
対象フォルダを指定
For Eachで
ファイルを1件ずつ処理
サブフォルダは
再帰処理で対応
folder.Filesは1階層分のみ。サブフォルダの中身はSubFoldersで別途処理するフォルダ内に数千件単位のファイルがある場合、For Eachでの逐次処理はそれなりの時間がかかります。処理件数が多い場合は、進捗をApplication.StatusBarに表示するなどして、マクロが固まっていないことをユーザーに伝える工夫があると親切です。
06 GENAI CASE STUDY 【独自データ】繰り返し処理の自動化とAI移行の実際 For Eachで書いていたような「集まりを1件ずつ処理する」作業を、AIはどう扱うか
ここからは弊社(株式会社GENAI)の実データをもとに、「VBAのFor Eachで書くような繰り返し処理」と「AIによる自動化」を比較します。For Eachは非常に便利な構文ですが、こうしたループ処理を伴うマクロには、運用が長期化すると特有の課題が出てくることも事実です。
6-1. For Each系マクロが抱えがちな運用課題
弊社がこれまでに複数の企業様のマクロ資産を拝見してきた中で、For Eachを使った「一括処理系」のマクロで共通して見られる課題が以下の3つです。
こうした課題は、For Eachという構文そのものの欠陥ではなく、「集まりを1件ずつ処理する」という自動化の性質上、対象の形が変わるたびに調整が必要になるという構造的な問題です。
6-2. 弊社での実運用: Claude Codeによる一括処理の自動化
弊社では、Claude Code(Anthropic社のAIエージェント)を使って、経理・秘書業務・開発など幅広い業務にAIを組み込んでいます。Max 20xプラン(月額$200・約30,000円)を全社契約し、For Eachでループ処理を書く代わりに日本語で指示するだけの一括処理タスクを日常的に処理しています。
| 項目 | 内容 |
|---|---|
| 契約プラン | Claude Max 20x(月$200 / 約30,000円) |
| 利用開始 | 2025年後半〜 |
| 利用部署 | 経営・営業・広告・開発・経理・秘書業務・個人業務まで全社 |
| 一括処理系の用途例 | 複数シートの集計・選択範囲のデータ整形・フォルダ内ファイルの一括リネームや振り分け |
特に経理業務では、請求書チェック・経費仕訳・freee連携などの処理で月40時間 → 月5時間まで作業時間が圧縮できている肌感です(あくまで弊社での概算値です)。従来はFor Eachを使ったマクロで複数シート・複数ファイルを一括処理していたような作業の多くも、この削減効果に含まれています。
上記は弊社の肌感ベースの数値であり、業種・業態・既存のマクロ資産の複雑さによって効果は変動します。「VBAを完全に廃止すべき」という主張ではなく、あくまで選択肢の一つとしてご覧ください。
6-3. VBAとAI、両方を使い分ける現実解
誤解してほしくないのは、「For EachもVBAももう不要」という話ではないという点です。すでに安定稼働しているマクロを無理に置き換える必要はありません。弊社の実運用でも、以下のような使い分けをしています。
そのまま維持
(無理に置き換えない)
頻繁に変わる処理
AIに条件を伝えて
その場で対応
一括処理業務
最初からAIに
日本語で指示
07 GETTING STARTED WITH AI 非エンジニアがFor Eachを書かずにAIで実現する3ステップ VBAが書けなくても、日本語で指示するだけで一括処理ができる
「For Eachの構文は分かったけれど、Selection・コレクション・FileSystemObjectを組み合わせたコードを自分で書くのは難しい」という方も多いはずです。ここでは、プログラミング未経験の方が、AI(Claude Code)を使って一括処理を自動化するまでの流れを3ステップで紹介します。
ステップ1: 「1件ずつ何をしたいか」を日本語でそのまま伝える
最初のステップは、VBAのように「For EachかFor Nextか」「配列かコレクションか」を選ぶ必要が一切ないという点です。「この選択範囲の数値セルだけ1.1倍にして」「このフォルダにあるファイルを全部、更新日と一緒に一覧にして」といった、普段使っている言葉のまま指示するだけで処理が実行されます。
「選択したセル範囲の中で、数値が入っているセルだけを1.1倍にして」——この一文だけで、VBAでいうところのFor Eachによるセルのループ処理・IsNumericによる判定が、コードを書かずに実行されます。
ステップ2: 結果を確認し、条件を追加で伝える
VBAであれば「対象シートの条件を1つ追加する」だけでもFor Eachのループ内に分岐コードの追加が発生しますが、AIに指示する場合は会話の続きで条件を足すだけです。「非表示シートは除外して」「拡張子が.xlsmのファイルだけに絞って」といった追加条件も、その場で反映されます。
ステップ3: 定型業務として繰り返し使えるようにする
毎週・毎月など定期的に発生する一括処理であれば、指示の流れをそのまま繰り返し使えるパターンとして保存しておけます。これにより、担当者が変わってもFor Eachのコードを読み解く必要がなく、業務手順書を見ながら同じ指示を出すだけで同じ結果が再現できます。
日本語で
やりたいことを伝える
結果を見て
条件を追加する
定型業務として
繰り返し使う
08 QUICK GUIDE VBAで自分で書く vs AIに任せる 早見表 あなたの状況に合わせた選び方
最後に、状況別の判断基準を1枚の表にまとめます。
| あなたの状況 | おすすめ | 理由 |
|---|---|---|
| すでに安定稼働しているFor Each系マクロがある | VBAのまま維持 | 動いているものを無理に置き換える必要はない |
| マクロを書ける担当者が1人しかいない | AIへの移行を検討 | 属人化リスクの解消が急務 |
| 単発・一度きりの一括処理をしたい | AIに直接依頼 | コードを書く工数の方が高くつく |
| プログラミングを学ぶ目的も兼ねている | VBAを学習 | 構造化された学習には手を動かす経験が有効 |
| 複数業務(経理・営業・広告等)を横断で自動化したい | AI(Claude Code)を軸に据える | VBAは基本Excel内に閉じるが、AIは業務横断で使える |
迷ったときの目安は「その処理を1年後も同じ人がメンテナンスできるか」です。答えが「わからない」であれば、AIへの移行を検討する価値があります。
09 CONCLUSION まとめ ── ループ処理の先にある「業務自動化」 For EachとAI、それぞれの正しい使い方
この記事では、VBAのFor Eachステートメントの基本構文から、配列・Selection・Worksheets/Workbooksコレクション・フォルダ内ファイルの一括取得まで、実務でよく使う4つのパターンを整理しました。最後にポイントを振り返ります。
For Eachは今なお現場で強力な構文ですが、「対象の形が変わったときに誰が直すのか」という属人化の問題は避けて通れません。配列・Selection・ファイル処理のような小さなループであっても、積み重なれば大きな運用コストになります。
「うちのマクロ、実は担当者しかわからない」「新しく仕組みを作るなら、コードを書かない方法も検討したい」——そう感じた方は、ぜひ以下からAI鬼管理にご相談ください。
「For Eachで書いた一括処理、実は誰も直せない」を、AI鬼管理が一緒に棚卸しします
VBAで積み上げてきた自動化資産を無理に捨てる必要はありません。
属人化リスクのある部分だけをAIに置き換える、現実的な移行プランをご提案します。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
よくある質問
Q. For EachとFor Nextはどちらを覚えればいいですか?
A. 両方覚えておくのが理想ですが、優先度で言えばFor Eachの方が実務での応用範囲が広いです。配列・シート・ファイルなど「集まりを丸ごと処理したい」場面が多い一方、番号を使った計算や逆順処理が必要になったときだけFor Nextを追加で覚える、という順番がおすすめです。
Q. For Eachでループ変数の値を書き換えると、元の配列も変わりますか?
A. 配列が文字列・数値などの値型の場合、ループ変数は値のコピーが渡されるため、ループ変数を書き換えても元の配列の中身は変わりません。一方、オブジェクト(Range・Worksheetなど)の場合はループ変数が参照そのものになるため、ループ変数のプロパティを変更すると元のオブジェクトにも反映されます。
Q. For Eachで逆順にループを回す方法はありますか?
A. For Each自体にはStepオプションに相当する逆順指定の機能がありません。逆順で処理したい場合は、For Next(Step -1)を使うか、対象をいったん配列に変換してからインデックスで逆順にアクセスする方法を使います。
Q. SelectionでFor Eachを使うとき、何も選択されていないとどうなりますか?
A. Excelでは通常、シート上で最低1つのセルが常に選択されている状態になるため「何も選択されていない」ことは基本的に起こりません。ただし、選択対象がセル範囲以外(グラフや図形など)の場合は、For Each cell In SelectionでRangeを期待するコードがエラーになります。実行前にTypeName(Selection)で種類を確認しておくと安全です。
Q. Worksheetsコレクションをループすると、グラフシートも処理対象になりますか?
A. いいえ、なりません。Worksheetsコレクションにはワークシートのみが含まれ、グラフシートは含まれません。ワークシートとグラフシートの両方をまとめて処理したい場合は、Sheetsコレクションを使う必要があります。
Q. FileSystemObjectを使うのに、参照設定は必ず必要ですか?
A. 必須ではありません。CreateObject("Scripting.FileSystemObject")を使う後期バインディングであれば、参照設定なしでFileSystemObjectを利用できます。参照設定(早期バインディング)は入力補完が使える利点がありますが、参照設定が無効な別のPCで開くとエラーになるため、複数人でマクロを共有する場合は後期バインディングの方が安全です。
Q. VBAを使わずに、AIだけで一括処理はできますか?
A. できます。Claude CodeのようなAIエージェントであれば、「選択範囲の数値セルを1.1倍にして」「このフォルダのファイルを一覧にして」と日本語で指示するだけで、For EachやFileSystemObjectに相当する処理をコードなしで実行できます。条件の追加や変更も会話ベースで対応できるため、非エンジニアの方でも扱いやすい方法です。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
AI鬼管理/AIBPO by AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
専門スタッフが、御社に最適な
業務自動化・業務代行プランを無料でご提案します。




