ExcelマクロVBA入門
第59回.コレクション処理(For Each)

Excelマクロの基礎と応用、エクセルVBAの入門・初級・初心者向け解説
最終更新日:2019-03-03

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


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


コレクションはオブジェクトの集まりですので、

For Each は、コレクションの中から、個別のオブジェクトを取り出して処理する場合に使用します。

コレクションの全ての要素に対し処理を行うと、ループは終了します。


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


For Each の構文

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

Next [element]

element 必ず指定します。
コレクションの各要素を繰り返す変数を指定します。引数 element にはバリアント型 (Variant) 変数、総称オブジェクト型変数、または任意の固有オブジェクト型のオブジェクトの変数を指定できます。
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

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



使用例

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,・・・

の順に処理されます。

セルは縦横の2次元なので、For Eachには、あまり向きません。

例えば、とりあえず、横・縦の順でも問題なかったとしても、

その後に、縦・横の順に変更する必要が出てきたときに困る事になります。


サイト内の参考ページ






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

Rangeオブジェクト
Applicationのプロパティ
コレクションとは
コレクション処理(For Each)
エラー処理(On Error)
「On Error Go To」と「Exit Sub」
「On Error Resume Next」とErrオブジェクト
ブックを開く(Open)
ブックを閉じる・保存(Close,Save,SaveAs)
シートの挿入、名前の変更(Add,Name)
シートのコピー・移動・削除(Copy,Move,Delete)

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

Excelワークシート関数一覧(2010以降)|VBAリファレンス(4月22日)
クラスとCallByNameとポリモーフィズム(多態性)|VBA技術解説(4月6日)
VBAでのタイマー処理(SetTimer,OnTime)|VBA技術解説(4月3日)
クラスとイベントとマルチプロセス並列処理|VBA技術解説(4月2日)
エクセルの日付と時刻のまとめ|エクセル関数超技(3月6日)
Excelシートの複雑な計算式を解析するVBA|VBAサンプル集(2月18日)
VBAクラスの作り方:独自Rangeっぽいものを作ってみた|VBA技術解説(2月16日)
VBAクラスの作り方:列名のプロパティを自動作成する|VBA技術解説(2月14日)
VBAクラスの作り方:列名の入力支援と列移動対応|VBA技術解説(2月11日)
クラスを使って他ブックのイベントを補足する|VBA技術解説(2月6日)

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

1.ひらがな⇔カタカナの変換|エクセル基本操作
2.最終行の取得(End,Rows.Count)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.RangeとCellsの使い方|ExcelマクロVBA入門
6.変数とデータ型(Dim)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.繰り返し処理(For Next)|ExcelマクロVBA入門
9.とにかく書いて見よう(Sub,End Sub)|VBA入門
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • コレクション処理(For Each)

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


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






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

    本文下部へ