1. はじめに
ARアドバンストテクノロジ株式会社(ARI)の鈴木タクヤです。
前回 の更新からかなり空いてしまいましたが、まだ生きていました。
今回はExcelフィルタリングツールのソースコード解説第9回です。
(ツールの詳細については以下の記事を、「Excelフィルタリングツール解説シリーズ」タグの記事一覧については以下の記事下部「5. 解説記事のリンク」をご参照ください。)
解説第8回 は「For…Next」についての記事でしたが、今回のテーマは「For Each …Next」です。
2. 「For Each…Next」ステートメントとは
繰り返し(ループ)処理を記述する際に使用する以下の構文を「For Each…Nextステートメント」と呼びます。
For Each 要素 In 集合
'~何かしらの処理~
[Exit For]
'~何かしらの処理~
Next [要素]
前回 紹介した「For…Next」と非常によく似ていますが、あちらはループカウンタで繰り返し回数を指定していたのに対し、今回の「For Each…Next」は、「集合」の各「要素」について処理を行い、すべての要素について処理をし終わったら、あるいは Exit For
に到達したら、繰り返し処理を終了します。
Excelフィルタリングツール の中では以下の2つのプロシージャ内で使用しています。
'■指定のブックを開いているか否かを判定する関数
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
を設定するというものです。
コレクション について詳しく知りたい方は以下の記事が参考になります。
'■対象シート存在確認/活性化処理(渡されたブック・シート名に該当するシートが存在すれば活性化し、存在しなければエラーメッセージを表示する。)
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
)と一致するものがあればそのシートを活性化(表示)し、変数 sheetExists
に True
を設定します。
どれも一致しなければ、変数 sheetExists
が False
のまま「For Each…Next」を抜けるため、後続のIf文の条件を満たし、メッセージボックスで シート「sheetName
(シート名)」が「wb.Name
(ブック名)」に存在しません。」 と表示するというものです。
このように「For Each…Next」は、何回繰り返すかは決まっていないが、集合の要素を片っ端から取り出して処理を行う場合に使用できます。
ここまでの使用例について流れを理解できた方は、 前回 紹介した 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の公式ドキュメントです。
こちらは私がものすごくお世話になっている「エクセルの神髄」という解説サイト。より深く学習を進めたい方は是非。