みなさん、こんにちは。
ITソリューション事業部の林です。
本記事では、ExcelVBAのテクニックを紹介・解説いたします。
今回紹介するのは、「繰り返し構文で複数オブジェクトの処理」です。
【目次】
それでは、始めましょう!
複数オブジェクトを処理する方法
ExcelVBAで、オブジェクトの集合体=複数オブジェクトを処理するには、Forステートメントを使用します。
Forステートメントについては初級編第3回で紹介しましたが、今回は少々異なります。
過去に紹介した構文では、回数を明示的に指定していましたが、今回は回数を指定しないForの書き方になります。
それが「For Each」です。
For Eachの構文
For Eachは、オブジェクト集合体からオブジェクトをひとつずつ取り出して処理します。
構文は以下のように記述します。
For Each オブジェクト変数 In オブジェクト集合体
オブジェクト変数を用意するときには、データ型にはVariantを指定しておけば問題ありません。
オブジェクトの種類に合わせてデータ型を指定しても、もちろんOKです。
オブジェクト集合体には、ワークシートオブジェクト(Worksheets)やセル範囲(Range)など、様々な対象を指定できます。
このFor Eachは、オブジェクト集合体のように「回数を指定できないもの」を処理するために使用します。
Excelワークシートを例にすると、ファイルによって作成されたシート数が1つだったり3つだったり、バラバラです。
そのようなケースでは、一定回数繰り返すForではなく、For Eachを使用しましょう。
補足ですが、一定回数繰り返すForも、For Eachも、Forステートメントです。
両者の違いは構文の書き方だけで、繰り返し処理を行う点に違いはありません。
使用例
使用例① ワークシートを読み込む①
マクロの保存されたExcelブックに存在するワークシートの名前を出力します。
Sub ExcelVBA_019_Example1() Dim objSheet As Variant 'オブジェクト変数を指定 For Each objSheet In ThisWorkbook.Worksheets 'ワークシートを繰り返し処理する Debug.Print objSheet.Name 'イミディエイトウインドウにシート名を出力 Next End Sub
出力結果(Sheet1,Sheet2,Sheet3が存在するとき)
使用例② ワークシートを読み込む②
ファイル指定ダイアログでExcelファイルを指定し、ワークシートを読み込みます。
読み込んだシートの名前が「週報」だった場合、その旨メッセージ表示します。
Sub ExcelVBA_019_Example2() Dim Bk As Variant Dim StrLine As String 'ファイル選択ダイアログで選択 With Application.FileDialog(msoFileDialogFilePicker) .AllowMultiSelect = False 'ファイル複数選択不可 If .Show = True Then StrLine = .SelectedItems(1) '選択したファイルを変数に記憶 If Right(StrLine, 4) <> "xlsx" Then Exit Sub 'ファイル拡張子がxlsxではない場合処理終了 End If Set Bk = Workbooks.Open(Filename:=StrLine) '指定したファイルを開き、変数へ格納 Else Exit Sub '選択キャンセルされたら処理終了 End If End With Dim objSheet 'オブジェクト変数を指定 For Each objSheet In Bk.Worksheets 'ワークシートを繰り返し処理する If objSheet.Name = "週報" Then MsgBox "週報シートが存在します", vbInformation '週報シートが存在する場合にメッセージ出力 End If Next End Sub
ワークシートの一覧
出力結果
使用例③ Rangeオブジェクトを読み込む
セル範囲(Range)のセルをひとつずつ読み込みます。
Sub ExcelVBA_019_Example3() Dim objCell 'オブジェクト変数を指定 For Each objCell In ActiveSheet.Range("A1:C2") 'セル範囲を繰り返し処理する Debug.Print objCell.Value 'イミディエイトウインドウにセルの値を出力 Next End Sub
ワークシートの値
出力結果
終わりに
以上、For Eachの紹介でした。
それではまた次回、お会いしましょう!