ラピードアクト株式会社

技術記事:ExcelVBAで仕事を効率化しようVol.19

みなさん、こんにちは。
ITソリューション事業部の林です。

本記事では、ExcelVBAのテクニックを紹介・解説いたします。

今回紹介するのは、「繰り返し構文で複数オブジェクトの処理」です。

【目次】

  1. 複数オブジェクトを処理する方法
  2. For Eachの構文
  3. 使用例
  4. 終わりに

それでは、始めましょう!

複数オブジェクトを処理する方法

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の紹介でした。
それではまた次回、お会いしましょう!