VBA入門
コレクション処理(For Each)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2021-09-20

第59回.コレクション処理(For Each)


For Each は、コレクションの各要素に対して繰り返し処理を実行します。


コレクションはオブジェクトの集まりですので、
For Each は、
コレクションの中から、個々のオブジェクトを取り出して処理する場合に使用します。
コレクションの全ての要素に対しての処理が終わるとループは終了します。

※For Eachでは配列も扱えますが、ここではコレクションについてのみ説明します。


For Each の構文

For Each element In group
  [statements]
  [Exit For]
  [statements]

Next [element]

element 必ず指定します。
コレクションの各要素を繰り返す変数を指定します。
引数 element にはバリアント型変数、総称オブジェクト型変数、または固有オブジェクト型のオブジェクト変数を指定できます。
group 必ず指定します。
オブジェクト コレクション名または配列名を指定します。
statements 省略可能です。
引数 group の各メンバに対して実行するステートメントを指定します。

elementのデータ型について
elementに指定するオブジェクトについては、「第52回.オブジェクト変数」で説明した、
Variant(バリアント型) > Object(総称オブジェクト型) > 固有オブジェクト型
ということになります。

固有オブジェクト型が不明な場合は、総称オブジェクト型やバリアント型でも良いのですが、
そもそも、コレクション名は解っている訳ですから、
コレクション名の最後のsを取れば、通常はそれで固有オブジェクト型になります。

Dim 変数 As ○○○
For Each 変数 In ○○○s
 ・・・
Next 変数

○○○がオブジェクト、○○○sがコレクションです。

ただし、
※全てのオブジェクト・コレクションについてこの規則が当てはまるわけではありません。
  あくまで、このような命名規則が多いというこです。


Exit For

コレクションの全ての要素に対し処理が終了する前に、ループを抜けます。

For Each 変数 In コレクション
  ・・・
  If 終了すべき条件 Then
    Exit For
  End If
  ・・・
Next

このような使い方になります。


For Each の使用例

Dim ws As Worksheet
For Each ws In Worksheets
  ws.PrintPreview
Next ws

これで、全シートが印刷プレビューされます。
(印刷プレビューについては、後々説明します。)

これは、For Eachを使わずに書くと、

Dim i As Integer
For i = 1 To Worksheets.Count
  Worksheets(i).PrintPreview
Next i

このようになります。
.Countはコレクションの要素数です。


Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
  Debug.Print ws.Name
Next

マクロの書かれているブックのすべてのワークシートをイミィディエイト ウインドウに出力しています。


RangeオブジェクトのFor Each

RangeをFor Eachで処理する場合、少々注意が必要です。

Dim MyRange As Range
Dim i As Long
i = 1
For Each MyRange In Range("A1:B5")
  MyRange = i
  i = i + 1
Next

これを実行してみれば解りますが、
A1,B1,A2,B2,・・・
このような順に処理されます。
列→行
この順で取得されます。

RangeのFor Eachは処理順に注意が必要です。
例えば、とりあえず列→行の順で問題なかったとしても、
その後に、行→列の順に変更する必要が出てきたときに困る事になります。
従って、このような処理順を気にする必要がないときにのみ使用してください。


For Each サイト内の参考ページ

練習問題17(ブック・シートの操作の練習)
マクロVBA練習問題 ※まず最初に A列にパス、B列にブック名(エクセルのファイル名)を、実際のあなたのPC環境に合わせて入力して下さい。・シート「練習17_回答」を新規に追加し、そのA列にブック名 B列にそのブックの全シート名の一覧を入れて下さい。
複数シートの印刷(PrintOut)|VBAサンプル集
複数シートをVBAで印刷する方法です。ワークシートが「Sheet1」「Sheet2」「Sheet3」…があるものとします。そのような場合に、指定のワークシートのみ印刷する場合です。以下では、テスト実行しやすいように、Preview:=True これでプレピュー表示にしています。
名前定義の一覧(Name)|ExcelマクロVBAサンプル集
名前定義は使い方によっては、とても便利な機能ですが、長く使っているブックでは、とても多くの名前定義が入ってしまっていたり、参照エラーを起こしている名前定義が多数あったりと、管理に困る場合も多々出てきます。これらが発生する原因としては、ブック間のシートコピーで増えていってしまったり、シートおよびセルの削除によって参照…




同じテーマ「マクロVBA入門」の記事

第56回.Rangeオブジェクト(RangeとCells)
第57回.Applicationのプロパティ(マクロ高速化と警告停止等)
第58回.コレクションとは(Collection)
第59回.コレクション処理(For Each)
第60回.エラー処理(On Error)
第61回.「On Error GoTo」と「Exit Sub」
第62回.「On Error Resume Next」とErrオブジェクト
第63回.ブックを開く(Open,Add)
第64回.ブックを閉じる・保存(Close,Save,SaveAs)
第65回.シートの挿入、名前の変更(Add,Name)
第66回.シートのコピー・移動・削除(Copy,Move,Delete)


新着記事NEW ・・・新着記事一覧を見る

VLOOKUPを使うことを基本としてシートを設計すべきか|エクセル雑感(2021-08-17)
コンピューターはブラックボックスで良い|エクセル雑感(2021-08-14)
小文字"abc"を大文字"ABC"に変換する方法|エクセル雑感(2021-08-13)
ADOでテキストデータを集計する|VBAサンプル集(2021-08-04)
VBA学習のお勧めコース|エクセル雑感(2021-08-01)
エクセル馬名ダービー|エクセル雑感(2021-07-21)
在庫を減らせ!毎日棚卸ししろ!|エクセル雑感(2021-07-05)
日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)
DXってなんだ? ITと何が違うの?|エクセル雑感(2021-06-24)
エクセルVBA 段級位 目安|エクセル雑感(2021-06-21)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.とにかく書いてみよう(Sub,End Sub)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ