【Excel VBA】シートをループ(繰り返し処理)For Each

各ワークシートで同じ処理をする

こんにちは、タクローです。

皆さんはExcelのシートを使って、次のような情報を管理していませんか?

  • 社員ごと、会員ごと、同じひな型のワークシートを使って情報を管理
  • 月ごと、年ごと、同じひな型のワークシートを使って売上実績や、コスト、業績を管理

こういった情報を管理するのに、Excelを使う機会って多いのではないでしょうか?

こういったExcelシートは、同じひな型のワークシートを使用するため、シート1つ1つ同じ操作の繰り返しになるでしょう。

Excel初心者の方にとっては決まった操作を覚えてしまうだけで処理ができてしまいますから、楽でしょう。

ただ、慣れてくると「毎日、毎日」、「毎回、毎回」同じ操作の繰り返しだと、うんざりするもの。

決まりきった同じ操作をもっと短時間で簡単に処理できないの?

日々、そんなお悩みをお持ちの方であれば、Excel VBAを駆使して効率化しちゃいましょう!

今回は、そんなExcel VBAスキルの中から、複数ある同じひな型のワークシート上で同じ処理をする場合の工夫について解説していきたいと思います。

各シート同じ処理を繰り返すコーディング

例えば、次のようなExcelワークシートがあったとします。

ワークシートオブジェクトサンプル

これらワークシート1つ1つのに次のような処理をすることとします。

Public Sub Sample1()

        Sheets("東京都").Range("A1").Value = Sheets("東京都").Name & "は関東地方です。"
        
        Sheets("埼玉県").Range("A1").Value = Sheets("埼玉県").Name & "は関東地方です。"
        
        Sheets("神奈川県").Range("A1").Value = Sheets("神奈川県").Name & "は関東地方です。"
        
        Sheets("千葉県").Range("A1").Value = Sheets("千葉県").Name & "は関東地方です。"
        
        Sheets("茨城県").Range("A1").Value = Sheets("茨城県").Name & "は関東地方です。"
        
        Sheets("群馬県").Range("A1").Value = Sheets("群馬県").Name & "は関東地方です。"
        
        Sheets("栃木県").Range("A1").Value = Sheets("栃木県").Name & "は関東地方です。"

End Sub

標準モジュールに「Sample1」という引数なしのSubプロシージャを作りました。

このコードは、各ワークシートのセル「A1」に、各ワークシートの名前と文字列「は関東地方です。」をつなげたものを表示させるものです。

とても簡単なコードです。

このマクロ「Sample1」を実行すると、「東京都」シートのセル「A1」に「東京都は関東地方です。」と表示されます。

また、「埼玉県」シートであれば、セル「A1」に「埼玉県は関東地方です。」と表示されるはずです。

すべてのシートが同じように表示されます。

さて、このコードを見てみると、「Sheets(“東京都”)」だったり、「Sheets(“埼玉県”)」だったりと、ワークシートを指定する箇所以外はすべて同じ処理であることがおわかりいただけると思います。

目的となる処理はこれでも実現できます。

ただ、同じコードの繰り返しで、効率が悪いです。

このコードの冗長性を解消できれば、すっきりして、メンテナンスしやすく、また非常にわかりやすいコードにすることができます。

各シートの処理をループで回そう

各シートで同じ処理をする場合、ループさせてコードの単純化を図ることができます。

さきほどのコードを次のように書き換えることができます。

Public Sub Sample2()

        Dim ws As Worksheet

        For Each ws In Worksheets
                ws.Range("A1").Value = ws.Name & "は関東地方です。"
        Next

End Sub

標準モジュールに「Sample2」という引数なしのSubプロシージャを作りました。

いかがでしょうか?

このマクロ「Sample2」を実行しても、先ほどの繰り返しばかりのコード(マクロ「Sample1」)と同じ結果になります。

コードが簡単になったことは、一目瞭然です。

では、このコードの内容について、解説していきたいと思います。

まず、「ワークシートオブジェクト」を宣言しましょう。

「Dim ws As Worksheet」とありますが、この「As Worksheet」は「ワークシートオブジェクト」型で変数を宣言しています。

変数名をここでは「ws」とします。

そして、「For Each ws In Worksheets~Next」で各シートをループさせているのです。

「ws In Worksheets」の「Worksheets」はコレクションと言って、つまり「ワークシートオブジェクト」の集合体を表しています。

「ワークシートコレクション」は、ここで使う各シートの集合体のことを指します。

ワークシートオブジェクトとワークシートコレクション

このワークシートの集合体であるコレクションから、ワークシートオブジェクトを1つずつ抜き出し、オブジェクト変数「ws」に入れていきます。

このことからも、変数「ws」が「ワークシートオブジェクト」型でなければならない理由がおわかりでしょう。

ループさせる度に、オブジェクト変数「ws」に入ってくるワークシートオブジェクトが変わります。

最初は「東京都」ワークシート、次は「埼玉県」ワークシート、その次は「神奈川県」ワークシートといった感じです。

各ワークシートのセル「A1」(ws.Range(“A1”).Value)に、各ワークシートオブジェクトの「名前」(.Nameプロパティ)を表示する処理を繰り返しています。

最後のワークシートまでループさせた後、そのループを抜け出し、それ以降の処理に続いていきます。

ワークシートオブジェクトをループさせる

まとめ

今回は各ワークシート同じ処理をする場合に、ワークシートをループさせるテクニックについて解説しました。

同じ処理でも、ちょっとしたテクニックを知っていると、コーディング効率がかなり変わってくることがおわかりになったのではないでしょうか?

他の人が読んでもわかりやすいコードを心がけましょう。

そうすると自然とコーディングテクニックが磨かれていくでしょう。

もしルーティンワークがあるようでしたら、Excel VBAを使って効率的に、もっと便利にさくっと終わらせちゃいましょう!

最後までお付き合いいただき、ありがとうございました。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする