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

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神からのお導きがありました。こっちのほうが楽!!!

公開日:2017/06/20
更新日:2017/06/21

4件のコメント

  1. thom より:

    *youさん
    Array使うと便利ですよ。

    For Each ws In Worksheets(Array("Sheet1", "Sheet3", "Sheet5"))
      Debug.Print ws.Name
    Next
    
    • *you より:

      thomさん

      Arra—y!!! マジだ! こっちのが記述が少なく済んでいいですね! ありがとうございます、あとで本文追記させてもらいますー(*´Д`)

    • denden より:

      コメント失礼いたします。
      こちらの方法を試したのですが、インデックスが有効範囲にありませんというエラーが発生してしまいます。
      どのようにしたら解決できるんでしょうか?

      <エラー発生個所>
      For Each ws In Worksheets(Array(“Sheet1”, “Sheet3”, “Sheet5”))

      <当方の環境>
      Excelのバージョン不明
      Office365 proplusの製品です。おそらく最新の2016同等かと思います。

    • *you より:

      dendenさん、コメントありがとうございます。

      Sheet1, Sheet3などの、指定している名前のシートが存在していないのではないでしょうか?


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)