ExcelVBAでワークシートのループに自作Collectionや配列を使ってみる

ワークシートをループさせて特定のシートだけ処理をする、っていうのを書く場合。もともとWorksheetsコレクションというのがあるので、それを使うことが多かったんですが、総数が多くて該当シートが少ないときなんか、こう書いてみたらどうかなーって思ったのがあったのでメモ的に。
全シートをループしながら該当シートをIfで分岐
Sub sample1()
Dim tgtSheet As Worksheet
For Each tgtSheet In Worksheets 'ブック内の全てのシートをループ
If tgtSheet.Name = "aaa" Or _
tgtSheet.Name = "bbb" Or _
tgtSheet.Name = "ccc" Then '特定の名前のシート名だったら
'処理
End If
Next
End Sub
Worksheetsコレクションを使ってすべてのシートをループさせて…、っていうよくある形。もちろんこれでも動くけど、シートの総数が多くて該当シートが少ない場合、なんか無駄が多いような…、と。
Collectionに該当シートを格納しておいてループ
Sub sample2()
Dim wsCollection As Collection 'コレクションを宣言
Set wsCollection = New Collection '生成
wsCollection.Add Sheets("aaa") 'シートを追加
wsCollection.Add Sheets("bbb")
wsCollection.Add Sheets("ccc")
Dim tgtSheet As Worksheet
For Each tgtSheet In wsCollection 'コレクションをループ
'処理
Next
Set wsCollection = Nothing '破棄
End Sub
コレクションを自分で作って、該当のシートを格納しておいて、そのコレクションをループさせちゃう。こっちのほうがスマートなんじゃないかなー。
追記:配列で指定してループ
Sub sample3()
Dim tgtSheet As Worksheet
For Each tgtSheet In Worksheets(Array("aaa", "bbb", "ccc")) 'ブック内の特定の名前のシートをループ
'処理
Next
End Sub
thom神からのお導きがありました。こっちのほうが楽!!!
ExcelVBAに興味をお持ちの方は、こちらの記事もどうぞ!
- これからExcelのマクロを始めたいという方に!簡単な練習問題作りました。
- 私がExcelVBAでよく使う便利なコード・スニペットまとめ
- プログラム初心者さんへ贈る、エラーが起きたら試してみて欲しいこと
- ExcelVBAのクラスモジュールって何?という人向けの使い方まとめ
書籍を執筆しています。






4件のコメント
*youさん
Array使うと便利ですよ。
For Each ws In Worksheets(Array("Sheet1", "Sheet3", "Sheet5")) Debug.Print ws.Name Nextthomさん
Arra—y!!! マジだ! こっちのが記述が少なく済んでいいですね! ありがとうございます、あとで本文追記させてもらいますー(*´Д`)
コメント失礼いたします。
こちらの方法を試したのですが、インデックスが有効範囲にありませんというエラーが発生してしまいます。
どのようにしたら解決できるんでしょうか?
<エラー発生個所>
For Each ws In Worksheets(Array(“Sheet1”, “Sheet3”, “Sheet5”))
<当方の環境>
Excelのバージョン不明
Office365 proplusの製品です。おそらく最新の2016同等かと思います。
dendenさん、コメントありがとうございます。
Sheet1, Sheet3などの、指定している名前のシートが存在していないのではないでしょうか?
コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。