【VBA】複数シートに同じ処理を一括実行する方法(コピペOK)

VBA
スポンサーリンク

書き換えポイント

変数・箇所 説明 初期値
skipSheets スキップするシート名の配列。追加・削除は Array(...) 内を変更するだけ Array("目次", "集計", "マスタ")
'--- ★書き換えポイント2 各シートで実行したい処理 ヘッダー挿入+書式設定(デモ用)

コードの流れ

  1. スキップ対象の定義: Array("目次", "集計", "マスタ") でスキップするシート名を配列で指定
  2. 非表示チェック: ws.Visible <> xlSheetVisible なら処理をスキップ
  3. シート名チェック: IsInArray 関数でスキップ対象に含まれるか確認
  4. 処理の実行: 対象シートにヘッダー挿入+書式設定
  5. 完了メッセージ: 処理したシート数を表示

全シートにヘッダーを挿入した後、ボタン(マクロをボタン1つで実行する方法)を設置すれば、次回からはワンクリックで一括処理できる。


スポンサーリンク

よくある落とし穴5選

1. ws. を付け忘れてアクティブシートだけ処理される

原因: Range("A1").Value = "test" と書くと、ループ中ずっとアクティブシートのA1を操作する。

対策: 必ず ws.Range("A1") のようにシート変数を付ける。ws.Cells, ws.Rows も同様。

2. 目次シートや集計シートまで処理してしまった

自分もこれで痛い目にあった。For Eachで全シートにヘッダー挿入を実行したら、「目次」シートにもヘッダーが入ってしまい、目次のリンクが全部ずれた。戻すのに1時間かかった。目次シートまでぶっ壊すとは思わなかった。

対策: 実務版のように skipSheets 配列でスキップ対象を事前に定義する。

3. 非表示シートも処理されてしまう

原因: For Each ws In Worksheets は非表示シートも含む。非表示にしていたマスタシートが書き換えられる可能性がある。

対策: ws.Visible <> xlSheetVisible でスキップする。実務版コードには組み込み済み。

4. シート名の全角・半角やスペースが一致しない

原因: If ws.Name = "目次" と書いたが、実際のシート名が「目次 」(末尾に半角スペースあり)だった。

対策: If Trim(ws.Name) = "目次" のように Trim(文字列の前後のスペースを除去する関数)でスペースを除去してから比較する。

5. ループ中にシートを追加/削除するとエラーになる

原因: For Each ループの途中でシートのコレクションを変更すると、VBAが混乱してエラーが出る。

対策: ループ中はシートの追加・削除をしない。必要なら、ループ前にシート名を配列に格納し、配列でループする。


FAQ

Q1: 特定のシートだけを処理したい(全シートではなく)

スキップではなく対象シートを指定したい場合は、対象シート名を配列に入れて一致チェックする:


Dim targetSheets As Variant
targetSheets = Array("1月", "2月", "3月")

For Each ws In ThisWorkbook.Worksheets
    If IsInArray(ws.Name, targetSheets) Then
        ' 対象シートの処理
        ws.Range("A1").Value = "処理済み"
    End If
Next ws

Q2: 処理の進捗をリアルタイムで確認したい

ステータスバーに進捗を表示する:


Dim total As Long
total = ThisWorkbook.Worksheets.Count

For Each ws In ThisWorkbook.Worksheets
    count = count + 1
    Application.StatusBar = "処理中... " & count & " / " & total & " シート"
    ' --- 処理 ---
Next ws

Application.StatusBar = False  ' ステータスバーを元に戻す

Q3: 全シートに色分けを一括適用したい

ループ内で色分け処理を呼び出す。色分けの方法は セルの値に応じて行を自動色分け を参照。


For Each ws In ThisWorkbook.Worksheets
    Call ColorByValue(ws)  ' 各シートを引数で渡す
Next ws

Q4: 全シートのデータを1つのシートに集約したい

これは「複数シートの一括処理」とは別のテーマ。複数Excelファイルを1つに統合する方法は 複数Excelファイルを1つに統合 を参照。1ファイル内のシート統合もループで可能だが、処理内容が複雑になるためカスタマイズの範囲。

Q5: ボタン1つで全シート処理を実行したい

マクロをボタン1つで実行する方法 で、ProcessSheetsWithSkip をボタンに割り当てる。シート上に「全シート一括処理」ボタンを置けば、同僚にも簡単に使ってもらえる。


まとめ

  • For Each ws In ThisWorkbook.Worksheets で全シートをループできる
  • ws.Range("A1") のようにシート変数を付けないと、アクティブシートだけ処理される(最大の落とし穴)
  • スキップ対象は配列で管理し、非表示シートも除外すると安全
  • シート数が増えてもコードの変更は不要。ループが自動で全シートを処理する

関連記事


次にやりたくなること


もっとカスタマイズしたい場合

「全シートの集計結果を1つのサマリーシートにまとめたい」「シートごとに異なる条件で処理を分けたい」「処理結果をメールで自動送信したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できる。

相談時に伝えると話が早い情報:

  • Excel のバージョン / OS
  • シートの枚数と構成(月別/拠点別など)
  • 各シートに実行したい処理の内容
  • スキップしたいシートの有無

あわせて読みたい

コメント

タイトルとURLをコピーしました