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