複数のシートに同じヘッダーを追加したり、同じセルの値を更新したり、同じ印刷設定を適用したり…。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枚のシートを単独で選択し直し、作業グループを解除しておくのが親切な設計です。
まとめ
選択した複数のシートに一括で同じ処理を行うための手順は、非常にシンプルです。
- 手動またはVBAで、対象となる複数のシートを作業グループとして選択する。
For Each mySheet In ActiveWindow.SelectedSheets
の構文でループを開始する。- ループの中で、変数
mySheet
を使って、各シートに対する共通の処理を記述する。 - (推奨)最後にいずれか1枚のシートを選択し直し、作業グループを解除する。
このパターンは、多数のシートの体裁を整えたり、共通の項目を一括で更新したりする際に、絶大な効果を発揮する強力なテクニックです。