【Excel VBA】For Eachの使い方をざっくり紹介【備忘録】

Excel
スポンサーリンク

今回は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とは_1

少し長くなりましたが、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回目の処理でRngA1セルが格納され、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に関する記事を不定期で投稿していますので、是非ご覧ください!

コメント

タイトルとURLをコピーしました