1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

1. はじめに

ARアドバンストテクノロジ株式会社(ARI)の鈴木タクヤです。

前回 の更新からかなり空いてしまいましたが、まだ生きていました。
今回はExcelフィルタリングツールのソースコード解説第9回です。

(ツールの詳細については以下の記事を、「Excelフィルタリングツール解説シリーズ」タグの記事一覧については以下の記事下部「5. 解説記事のリンク」をご参照ください。)

解説第8回 は「For…Next」についての記事でしたが、今回のテーマは「For Each …Next」です。

2. 「For Each…Next」ステートメントとは

繰り返し(ループ)処理を記述する際に使用する以下の構文を「For Each…Nextステートメント」と呼びます。

For Each…Nextステートメント( [ ]内は省略可能 )
    For Each 要素 In 集合
        '~何かしらの処理~
        [Exit For]
        '~何かしらの処理~
    Next [要素]

前回 紹介した「For…Next」と非常によく似ていますが、あちらはループカウンタで繰り返し回数を指定していたのに対し、今回の「For Each…Next」は、「集合」の各「要素」について処理を行い、すべての要素について処理をし終わったら、あるいは Exit For に到達したら、繰り返し処理を終了します。

Excelフィルタリングツール の中では以下の2つのプロシージャ内で使用しています。

Excelフィルタリングツールより抜粋①
'■指定のブックを開いているか否かを判定する関数
Function isOpened(ByVal bookName As String) As Boolean
    isOpened = False
    Dim wb As Workbook
    isOpened = False
    
    For Each wb In Workbooks
        If wb.Name = bookName Then
            isOpened = True
            Exit For
        End If
    Next
    
    Set wb = Nothing
End Function

こちらのFunctionプロシージャは 解説第3回 で紹介しましたが、Excelで開かれているワークブックの集合である Workbooksコレクション から、その要素である各ワークブック(wb)の名前(wb.Name)を確認し、引数として渡された文字列(bookName)と一致するものがあればFunctionプロシージャの戻り値として True を設定するというものです。

コレクション について詳しく知りたい方は以下の記事が参考になります。

Excelフィルタリングツールより抜粋②
'■対象シート存在確認/活性化処理(渡されたブック・シート名に該当するシートが存在すれば活性化し、存在しなければエラーメッセージを表示する。)
Sub activateSheet(ByVal sheetName As String, ByVal wb As Workbook)
    Dim ws As Worksheet
    Dim sheetExists As Boolean      '初期値はFalse
    
    For Each ws In wb.Worksheets
    If ws.Name = sheetName Then
        wb.Sheets(sheetName).Activate
        sheetExists = True
        Exit For
    End If
    Next
    
    If Not sheetExists Then
        MsgBox "シート「" & sheetName & "」が「" & wb.Name & "」に存在しません。"
        Call endMacro
    End If
    
    Set ws = Nothing
End Sub

こちらのFunctionプロシージャは、引数で渡されたワークブック(wb)の全てのシート(wb.Worksheets)の名前(ws.Name)を順番に確認し、引数として渡された文字列(sheetName)と一致するものがあればそのシートを活性化(表示)し、変数 sheetExistsTrue を設定します。
どれも一致しなければ、変数 sheetExistsFalse のまま「For Each…Next」を抜けるため、後続のIf文の条件を満たし、メッセージボックスで シート「sheetName(シート名)」が「wb.Name(ブック名)」に存在しません。」 と表示するというものです。

このように「For Each…Next」は、何回繰り返すかは決まっていないが、集合の要素を片っ端から取り出して処理を行う場合に使用できます。

ここまでの使用例について流れを理解できた方は、 前回 紹介した A1セル自動選択ツール の処理も流れを理解できるかと思います。

A1セル自動選択ツール(再掲)
'A1セル自動選択ツール

Sub selectA1()

    Dim ws As Worksheet
    
    '各シートのA1セルを選択
    For Each ws In ActiveWorkbook.Worksheets
        ws.Activate
        ws.Cells(1, 1).Activate
    Next
    
    '一番左のシートを選択
    Worksheets(1).Activate

End Sub

3. おわりに

以上、「For Each…Next」の解説でした。

次回は、マクロの処理高速化も狙える Dictionary(連想配列)オブジェクト の使い方について解説します。

6. 参考文献

こちらはMicrosoftの公式ドキュメントです。

こちらは私がものすごくお世話になっている「エクセルの神髄」という解説サイト。より深く学習を進めたい方は是非。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?