今回はFor Eachの使い方をざっくり紹介したいと思います。
For Eachとは
For Eachは繰り返し処理の一つで、ざっくり説明すると「コレクションからオブジェクトを1つずつ取り出して繰り返す」処理になります。
Sub test_ForEach()
Dim arr As Variant
Dim arr_str As Variant
ReDim arr(2)
arr(0) = "こんにちは"
arr(1) = "はりぼなブログに"
arr(2) = "ようこそ!"
For Each arr_str In arr
MsgBox arr_str
Next
End Sub
・・・って言われてもピンと来ない方も多いと思いますので、オブジェクトとコレクションについてそれぞれ説明します。
まずオブジェクトについてざっくり言うと「モノ」のことで、Excelでよく見かけるやつだと
- ブック
- セル
- シート
- グラフ
なんかが想像つきやすいかと思います。
そしてコレクションは「複数あるオブジェクトをまとめたもの」のことです。
セル範囲であるRange(“A1:A5”)もコレクションですし、Excelブックに複数含まれているシートもコレクションに当たります。
少し長くなりましたが、For Eachと聞いたら「まとめたやつ(コレクション)からモノ(オブジェクト)を一つずつ取り出して処理できる」繰り返し処理のことだと思っておけばとりあえずOKです。
書き方
それでは次に書き方を説明します。
For Eachの書き方は以下の通りです。
For Each 【オブジェクト】 In 【コレクション】
Next
【オブジェクト】のところにはコレクションから取り出したオブジェクトの格納先を指定し、【コレクション】は取り出し元になるコレクションを指定します。
例えばRange(“A1:A5”)からセルを1つずつ取り出す時は以下のように記述します。
Dim Rng As Range
'Range("A1:A5")から一つずつ取り出してRngに格納する
For Each Rng In Range("A1:A5")
'1回目:RngにA1セルが格納される
'2回目:RngにA2セルが格納される
'3回目:RngにA3セルが格納される
'4回目:RngにA4セルが格納される
'5回目:RngにA5セルが格納される
'→計5回繰り返し処理が実行される。
Next
こうすると1回目の処理でRng
にA1セルが格納され、2回目はA2セル,3回目はA3セル…のように格納されていき、計5回処理が繰り返されます。
使用例
次に使用例を簡単に紹介します。
私個人としては、
- ブック内のシートを一つずつ取り出す
- フォルダ内のファイル一つずつ取り出す
をよく使っているので、是非参考にしていただければと思います。
ブック内のシートを一つずつ取り出す
まず「ブック内のシートを一つずつ取り出す」時のコードになります。
開いているブック内に含まれているシートをFor Eachで一つずつ取り出し、最終的にメッセージボックスにシート名一覧を表示するイメージです。
Sub test_ForEach_GetSht()
Dim mySht As Worksheet
Dim str_Sht_List As String
For Each mySht In ThisWorkbook.Worksheets
str_Sht_List = str_Sht_List & mySht.Name & vbCrLf
Next
MsgBox str_Sht_List
End Sub
Sheet1~5まで入っているブックで実行すると以下のように処理されます。
ポイントになるのがFor Each mySht In ThisWorkbook.Worksheets
の部分になります。
For Each mySht In ThisWorkbook.Worksheets
str_Sht_List = str_Sht_List & mySht.Name & vbCrLf
Next
In
の後ろをThisWorkbook.Worksheets
にすることでブック内のシートの数だけ処理を繰り返すことが出来ます。
そして繰り返しの度にmySht
に取り出したシートが格納されるのでmysht
を使用してシート毎に操作ができるようになる、といった具合です。
このようにブック内のシートの数だけ繰り返し処理を行いたい場合は、In
の後ろをThisWorkbook.Worksheets
にするようにしましょう。
フォルダ内のファイル一つずつ取り出す
次に「フォルダ内のファイル一つずつ取り出す」時のコードになります。C:\ExcelMacro\果物
に格納されているファイルを取得し、シートにファイル名を転記していくイメージです。
Sub test_ForEach_GetFiles()
Dim FSO As FileSystemObject
Dim Fld As Folder
Dim File As File
Dim targetFldPath As String
Dim i As Long
Application.ScreenUpdating = False
targetFldPath = "C:\ExcelMacro\果物"
Set FSO = New FileSystemObject
Set Fld = FSO.GetFolder(targetFldPath)
i = 0
For Each File In Fld.Files
ThisWorkbook.Worksheets(1).Range("A1").Offset(i, 0) = File.Name
i = i + 1
Next
Set FSO = Nothing
Set Fld = Nothing
Set File = Nothing
Application.ScreenUpdating = True
End Sub
実行すると以下のようになります。
ポイントになるのがFor Each File In Fld.Files
の部分になります。
For Each File In Fld.Files
ThisWorkbook.Worksheets(1).Range("A1").Offset(i, 0) = File.Name
i = i + 1
Next
In
の後ろをFld.Files
とすることで、GetFolder
で指定したフォルダ内のファイル全てを取得することが出来ます。
今回の例で言うと果物フォルダ内の
- イチゴ.xlsx
- バナナ.xlsx
- リンゴ.xlsx
が取得できるわけです。
そして取得したファイルは繰り返し毎にFile
に格納されるので、これを使って操作ができるようになるといったわけです。
このようにフォルダ内のファイル全てを操作したい場合はIn
の後ろをFld.Files
にするようにしましょう。
まとめ
今回はFor Eachの使い方をざっくり紹介しました。
For Eachを使うことでシートやファイル全てを取得して操作するといったことが可能になるので、是非覚えて活用して頂ければと思います。
このブログではVBAに関する記事を不定期で投稿していますので、是非ご覧ください!
コメント