Excel VBAで繰り返しを行う:For Each Next
ExcelのVBAを使って次のような処理をしたい場合があります。
- 配列データをうまく扱いたい。
- 現在開いている全てのブック名を調べたい。
- 全てのシート名を調べたい。
- 複数のセルの値を調べたい。
このような「複数の要素を扱いたい」場合にはFor Each Nextが便利です。For Each Nextはコレクションや配列に効率よくアクセスするしくみです。一般的にカウンタ変数を使ったFor Next処理よりもスピードが速くなることが多いです。
For Each Nextの基本
For Each Nextは下記のように使います。
For Each 要素を入れる変数 In コレクションまたは配列
[何らかの処理]
Next
「指定したコレクションまたは配列のそれぞれの要素に、ある一つの処理を繰り返す」という意味です。配列の場合とコレクション(同じ要素のまとまり)の場合とで使い方に大きな違いはありませんが、コレクションはExcelで既に用意されているものを使うことが多いので分けて説明していきます。
配列の処理
配列を使った例を書いてみます。適当な配列を一つ定義して、その配列の内容を全て表示します。
' 配列を準備
Dim foods(5) As String
foods(0) = "カレーライス"
foods(1) = "ラーメン"
foods(2) = "ステーキ"
foods(3) = "ハンバーグ"
foods(4) = "ごはん"
' 繰り返し処理で値を表示する
Dim food As Variant
' For Each Nextで配列をループ処理する場合にはVariant型の変数を用意する
For Each food In foods
Debug.Print food
Next
コレクションの処理
コレクションとは、同じオブジェクトが複数まとまったことのことを言います。ExcelではWorkbookやSheetなど色々なオブジェクトがコレクションというものを使って管理されています。Sheetsコレクションには現在開いているSheetが、Workbooksコレクションには現在開いているすべてのWorkbookが入っているというイメージです。コレクションには配列と同じように色々な値を保存できます。
これを使って現在開いている全てのブック名を表示してみます。
' Workbooksコレクションを使って全てのブック名を表示
Dim book As Workbook
' WorkbooksコレクションにはWorkbookオブジェクトが入っている(型が不明ならObject型で変数宣言してもよい)
For Each book In Workbooks
Debug.Print book.Name
Next
次に、Sheetsコレクションを使って、全てのシート名の頭に「変更後」と加えてみます。
' Sheetsコレクションを使って全てのシート名を変更する
Dim obj As Object
For Each obj In Sheets
obj.Name = "変更後" & obj.Name ' 元のシート名の頭に「変更後」をつける
Next
セルの処理
Range関数でセルの内容にアクセスできますが、For Each Nextを併用してこれを処理することができます。
ここではRange関数で指定したセルの中から「愛知県」という文字列を含むセルを探して、さらに見つけたセルの背景色を赤色にする例をご紹介します。
' セルA1からセルC10までの範囲から「愛知県」という文字列を含むセルを探す
' 見つけたセルの背景色を赤色にする
Dim elm As Range
For Each elm In Range("A1:C10") ' セルA1~セルC10までの範囲をループ
If elm.Value Like "*愛知県*" Then ' セルの値が「愛知県」を含むかどうか判定
elm.Interior.Color = RGB(255, 0, 0) ' セルの背景色に赤色を設定
End If
Next
まとめ
いかがでしたでしょうか。このように広く応用ができる文なので、ぜひマスターして自在に扱えるようになってください。