【Excel VBA】選択した複数シート(作業グループ)に同じ処理を一括実行する方法

複数のシートに同じヘッダーを追加したり、同じセルの値を更新したり、同じ印刷設定を適用したり…。Excelで複数のシートにまったく同じ操作をしたい、という場面は頻繁にあります。

VBAを使えば、「現在選択されているすべてのシート(作業グループ)」を対象として、ループ処理で同じ命令を一度に実行できます。

この記事では、ActiveWindow.SelectedSheetsコレクションを使い、選択中の複数シートに同じ処理を一括で適用するための基本パターンを解説します。


目次

核心は ActiveWindow.SelectedSheets コレクション

VBAで現在選択されているシートの集まりを取得するには、ActiveWindow.SelectedSheetsという特殊なコレクションを利用します。

  • ActiveWindow: 現在アクティブになっているExcelのウィンドウを指します。
  • SelectedSheets: そのウィンドウ内で、選択状態になっているシート(作業グループ)の集まりを返します。

このSelectedSheetsコレクションに対してFor Eachループを実行することで、グループ内のシートを一枚ずつ順番に処理することができます。


完成したVBAコード

以下が、まず特定の複数シートを選択し、その選択されたシートすべてに対して、A1セルに日付を入力して書式を設定するVBAコードです。

Sub ProcessAllSelectedSheets()

    ' 変数を宣言します
    Dim targetSheet As Worksheet
    
    ' --- 1. 処理対象の複数シートを選択(作業グループを作成) ---
    ' ここでは例として、特定の名前のシートを選択しています
    ' ユーザーが手動で複数シートを選択した状態でマクロを実行しても機能します
    On Error Resume Next ' 存在しないシート名を指定した場合のエラーを回避
    ThisWorkbook.Worksheets(Array("Report_Jan", "Report_Feb", "Report_Mar")).Select
    If Err.Number <> 0 Then
        MsgBox "指定されたシートの一部が見つかりません。", vbCritical
        On Error GoTo 0
        Exit Sub
    End If
    On Error GoTo 0
    
    '--- シートが1枚しか選択されていない場合は処理を中断 ---
    If ActiveWindow.SelectedSheets.Count <= 1 Then
        MsgBox "このマクロは、複数のシートを選択した状態で実行してください。", vbInformation
        Exit Sub
    End If
    
    ' --- 2. 選択されているすべてのシートをループ処理 ---
    For Each targetSheet In ActiveWindow.SelectedSheets
    
        ' --- 3. 各シートに対して同じ処理を実行 ---
        ' 例: セルA1に「最終更新日: (今日の日付)」と入力し、太字にする
        With targetSheet.Range("A1")
            .Value = "最終更新日: " & Date
            .Font.Bold = True
        End With
        
    Next targetSheet
    
    ' --- 4. 処理後に作業グループを解除(推奨) ---
    ' 意図しない複数シートへの入力を防ぐため、先頭のシートを選択し直す
    ThisWorkbook.Worksheets(1).Select
    
    MsgBox "選択されたシートに処理を実行しました。"

End Sub

コードのポイント解説

① 作業グループの作成

ThisWorkbook.Worksheets(Array("Report_Jan", "Report_Feb", "Report_Mar")).Select

まず、処理の対象となるシートを作業グループとして選択します。この部分はマクロに含めず、ユーザーが手動でCtrlキーを押しながらシートを選択した状態で、後述のループ処理だけを実行するマクロを作成することも可能です。

② 選択されたシートのループ処理

For Each targetSheet In ActiveWindow.SelectedSheets

これがこのテクニックの心臓部です。For Eachループを使い、ActiveWindow.SelectedSheetsコレクションに含まれるシートを、変数targetSheetに一つずつ格納しながら巡回します。

③ 各シートへの共通処理

With targetSheet.Range("A1")
    .Value = "最終更新日: " & Date
    .Font.Bold = True
End With

ループの中で、変数targetSheetは選択されたシートを順番に指していきます。そのため、この変数に対して行った操作(ここではA1セルへの入力と書式設定)が、選択されたすべてのシートに対して実行されます。

④ 作業グループの解除(推奨)

ThisWorkbook.Worksheets(1).Select

マクロの処理が終わった後もシートがグループ化されたままだと、ユーザーが意図せず複数のシートに同じデータを入力してしまう事故につながる可能性があります。 処理の最後に、いずれか1枚のシートを単独で選択し直し、作業グループを解除しておくのが親切な設計です。


まとめ

選択した複数のシートに一括で同じ処理を行うための手順は、非常にシンプルです。

  1. 手動またはVBAで、対象となる複数のシートを作業グループとして選択する。
  2. For Each mySheet In ActiveWindow.SelectedSheets の構文でループを開始する。
  3. ループの中で、変数mySheetを使って、各シートに対する共通の処理を記述する。
  4. (推奨)最後にいずれか1枚のシートを選択し直し、作業グループを解除する。

このパターンは、多数のシートの体裁を整えたり、共通の項目を一括で更新したりする際に、絶大な効果を発揮する強力なテクニックです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次