ブック内のシートを順次処理していく際、
表示されているシートだけをループする方法を解説します。
シートが表示されているかどうかは、
WorksheetオブジェクトのVisibleプロパティで判定できます。
For Eachステートメントでループする場合
For Eachステートメントを使用して表示シートをループするコードがこちらです。
Sub 表示されているシートのみを処理する() Dim 処理シート As Worksheet For Each 処理シート In ThisWorkbook.Worksheets If 処理シート.Visible = True Then ' ここに表示シートへの処理 Debug.Print 処理シート.Name End If Next End Sub
シートが表示されているかどうかは、
VisibleプロパティがTrueであるかどうかで分かります。
Trueのシートだけを分岐して処理をすることで、
表示されているシートのみをループすることができます。
Forステートメントでループする場合
続いてForステートメントを使用したコードがこちらです。
Sub 表示されているシートのみを処理する() Dim シート番号 As Worksheet For シート番号 = 1 To ThisWorkbook.Worksheets.Count Dim 処理シート As Worksheet Set 処理シート = Worksheets(シート番号) If 処理シート.Visible = True Then ' ここに表示シートへの処理 Debug.Print 処理シート.Name End If Next End Sub
結局For文の開始直後に変数「処理シート」にSetしているため、
Visibleに関わるコードはForEach文と全く変わらないですね。
この手のコードでずっと「Worksheets(シート番号)」を書き続けるのも大変ですし、
早々に変数に入れて処理を書くようにしましょう。
他の条件とセットで判定する場合
例えば「表示シートかつシート名が"データ○○"のシート」をループする場合は、
以下のいずれかのコードを使用してください。
Sub 表示されているデータシートのみを処理する() Dim 処理シート As Worksheet For Each 処理シート In ThisWorkbook.Worksheets If 処理シート.Visible = True Then If Left(処理シート.Name, 3) = "データ" Then ' ここに表示シートへの処理 Debug.Print 処理シート.Name End If End If Next End Sub
Sub 表示されているデータシートのみを処理する() Dim 処理シート As Worksheet For Each 処理シート In ThisWorkbook.Worksheets If 処理シート.Visible = True _ And Left(処理シート.Name, 3) = "データ" Then ' ここに表示シートへの処理 Debug.Print 処理シート.Name End If Next End Sub
表示されている かつ シート名が「データ」から始まる
など、2つの条件を判定する場合は、
- Ifステートメントを二つ重ねて(ネストして)分岐する
- ひとつのIfステートメントないでAnd演算子を用いて判定する
このいずれかの判定を行います。
判定に親子関係がなければどちらを用いても大差はありませんので、
読みやすいと思った方を採用してください。