Excelで週次スケジュールを52週分作ると、シート複製・日付入力・見出し更新が毎回発生して、運用がどんどん重くなります。週開始日(WC)を1セルに集約し、テンプレート+VBAで「シート名」「月〜日の日期」「ヘッダー」を連動させれば、手入力をほぼゼロにして安定運用できます。
WC(週開始日)基準の週次スケジュールが「壊れにくい」理由
週次スケジュールを手作業で回すと、次のような「よくある事故」が起きます。
- シートをコピーしたのに、日付だけ更新し忘れて前週のまま
- 月曜だけ直して火〜日がズレたまま
- シート名と中身の日付が一致しない(タブは今週、中身は先週…)
- 年をまたいだ週で、月と年の入力ミスが増える
そこでおすすめなのが、「WC(週開始日)=その週の基準日」を1セルに置き、残りの曜日はそのセルから自動計算する設計です。すると、更新ポイントが「WCセル」だけになります。さらに、テンプレートをVBAで複製してWCセルを週ごとに埋めれば、52週分のシートが一気に揃い、ズレも起きにくくなります。
完成形のイメージ(シート名・日付・ヘッダーが連動)
この記事で作る仕組みは、次の3点が連動します。
- シート名(タブ名):
WC 29 Dec 2025のように週開始日を含めて命名 - 基準セル(WC):例として
B2に週開始日(月曜など)を入れる - 各曜日の日付:
B2を参照して+0〜+6で自動表示 - ヘッダー(見出し):
A1に「Week Schedule Planner: 29 Dec 2025」を自動表示
これにより、生成後にどのシートを開いても「タブ名」「ヘッダー」「月〜日の実日付」が一致し、チェックコストが大幅に下がります。
テンプレートシートを作る(基準セル+日付の参照式)
まずは、週次スケジュールのレイアウトを完成させたテンプレート用シートを1枚作ります。シート名は分かりやすく Template にします(後述のVBAがこの名前を参照します)。
基準セル(WC)を決める
ここでは例として、週開始日(WC)を入れるセルを B2 にします。
- B2:WC(週開始日)
- テンプレート段階では、B2は空欄でOK(VBAが各シートに日付を入れます)
曜日ごとの日付セルは「B2参照」に統一する
次に、月〜日の日付セルを、必ずB2を基準に自動計算する式にします。曜日の並び(例:月〜日)に合わせて、+0から+6を足します。
| 曜日 | 例のセル | 式(B2がWCの場合) | 考え方 |
|---|---|---|---|
| 月 | C5 | =IF($B$2="","",$B$2) | 週開始日そのもの |
| 火 | D5 | =IF($B$2="","",$B$2+1) | WC+1日 |
| 水 | E5 | =IF($B$2="","",$B$2+2) | WC+2日 |
| 木 | F5 | =IF($B$2="","",$B$2+3) | WC+3日 |
| 金 | G5 | =IF($B$2="","",$B$2+4) | WC+4日 |
| 土 | H5 | =IF($B$2="","",$B$2+5) | WC+5日 |
| 日 | I5 | =IF($B$2="","",$B$2+6) | WC+6日 |
ポイントは次の通りです。
- $B$2 のように絶対参照にしておくと、コピーやレイアウト変更に強くなります。
- IFで空欄時は空欄にしておくと、テンプレートの見栄えが崩れません(B2が空のとき「0」や「1900/1/0」系が出るのを防げます)。
- 曜日の位置(C5〜I5)はあなたの表に合わせてOKです。重要なのは「+0〜+6」の設計です。
日付が数値に見えるときの対処(表示形式)
Excelは日付を内部的にはシリアル値(連番)で保持します。表示が「45678」のような数値に見える場合は、セルの表示形式を日付に設定すれば解決します。
- 対象セルを選択 → 右クリック →「セルの書式設定」
- 「表示形式」→「日付」または「ユーザー定義」
おすすめの表示例:
- 海外表記に寄せたい:
dd mmm yyyy(例:29 Dec 2025) - 日本式で分かりやすい:
yyyy/mm/dd(例:2025/12/29) - 曜日も入れたい:
yyyy/mm/dd(aaa)(例:2025/12/29(月))
VBAで52週分のシートを自動作成する(Templateを複製してWCを埋める)
テンプレートができたら、VBAで「週ごとのシート」を自動生成します。やることはシンプルで、Templateをコピー → シート名をWC形式に → B2へ週開始日をセット、これを52回繰り返します。
事前準備(マクロ有効ブックと開発タブ)
- 保存形式は必ず .xlsm(マクロ有効ブック)
- VBAエディタ:Alt + F11
- 標準モジュール追加:VBAエディタ →「挿入」→「モジュール」
会社PCなどでマクロが制限されている場合は、Excelの「オプション」→「トラストセンター」→「トラストセンターの設定」→「マクロの設定」を確認してください(運用ルールがある環境では管理者に従ってください)。
設定項目(開始日・週数・基準セル)を最初に固定する
実運用でミスを減らすには、開始日と週数をコードの先頭で定数化するのがコツです。今回の要件である「WC 29 Dec 2025」開始・52週作成に合わせ、次のように指定します。
| 項目 | 例 | 意味 |
|---|---|---|
| Templateシート名 | Template | 複製元のシート名 |
| WC基準セル | B2 | 週開始日を書き込むセル |
| 開始日(WC) | 2025/12/29 | 最初の週の週開始日 |
| 作成週数 | 52 | 生成するシート数 |
VBAコード(英語月略称で「WC 29 Dec 2025」を確実に作る版)
WindowsやExcelの言語設定によっては、Formatのmmmが英語にならないケースがあります。タブ名を必ず「Dec」など英語月略称にしたい場合は、月名を配列で固定するのが安全です。
Option Explicit
Public Sub CreateWeeklyScheduleSheets()
Const TEMPLATE_SHEET As String = "Template"
Const WC_CELL As String = "B2" ' 週開始日(WC)を入れるセル
Const WEEKS_TO_CREATE As Long = 52 ' 52週分
Dim startWC As Date
startWC = DateSerial(2025, 12, 29) ' WC 29 Dec 2025(例:月曜開始)
Dim i As Long
Dim wc As Date
Dim newName As String
Dim wsNew As Worksheet
' 安全&高速化(必要に応じて)
Application.ScreenUpdating = False
For i = 0 To WEEKS_TO_CREATE - 1
wc = DateAdd("d", 7 * i, startWC)
newName = SheetNameFromWC(wc) ' "WC 29 Dec 2025" 形式
' すでに同名シートがある場合はスキップ(上書きしたい場合は後述)
If WorksheetExists(newName) Then
GoTo NextWeek
End If
' Template をコピーして末尾に追加
ThisWorkbook.Worksheets(TEMPLATE_SHEET).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Set wsNew = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
' シート名を設定
wsNew.Name = newName
' WCセルに週開始日をセット(これで月〜日の式が自動更新)
wsNew.Range(WC_CELL).Value = wc
wsNew.Range(WC_CELL).NumberFormat = "yyyy/mm/dd"
NextWeek:
Next i
Application.ScreenUpdating = True
MsgBox "週次シートの作成が完了しました。", vbInformation
End Sub
' 指定名のワークシートが存在するか
Private Function WorksheetExists(ByVal sheetName As String) As Boolean
Dim ws As Worksheet
On Error Resume Next
Set ws = ThisWorkbook.Worksheets(sheetName)
WorksheetExists = Not ws Is Nothing
On Error GoTo 0
End Function
' WC日付から「WC dd mmm yyyy」のシート名を作る(英語月略称を固定)
Private Function SheetNameFromWC(ByVal wc As Date) As String
Dim mon As Variant
mon = Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", _
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
SheetNameFromWC = "WC " & Format$(wc, "dd") & " " & mon(Month(wc) - 1) & " " & Format$(wc, "yyyy")
End Function
このマクロの肝は、各シートでB2へ「その週のWC」を書き込む点です。テンプレート側の日付セルがB2参照になっていれば、月〜日の表示が自動で切り替わります。
同名シートを「上書き」したい場合の考え方
一度作ったあとに「やっぱりテンプレートを修正したので作り直したい」というケースは多いです。その場合、同名シートを見つけたら削除して作り直す運用もできます。ただし、削除は戻せないので、必ずバックアップを取ってからにしてください。
上書き運用にするなら、ループの中で同名シートが存在したら削除する処理を入れます(例)。
' If WorksheetExists(newName) Then
' Application.DisplayAlerts = False
' ThisWorkbook.Worksheets(newName).Delete
' Application.DisplayAlerts = True
' End If
各シートの上部に「WC日付の見出し(ヘッダー)」を自動表示する
次の要望がある場合、テンプレート側に式を入れておくのが最短です。
- シート上部(例:A1)に 「Week Schedule Planner: 29 Dec 2025」 の見出しを出したい
- WCセル(B2)の値に連動して、自動更新したい
TemplateのA1に入れる式(TEXT連動)
テンプレートの A1 に、次のような式を入れてください。
=IF($B$2="","","Week Schedule Planner: " & TEXT($B$2,"dd mmm yyyy"))
これで、VBAが各シートのB2にWC日付を入れた瞬間に、A1も自動で更新されます。テンプレート段階でB2が空でも、A1は空欄のままなので見栄えも崩れません。
日本語表記にしたい場合の例
ヘッダーを日本語に寄せるなら、次のような式も使えます。
=IF($B$2="","","週次スケジュール(WC): " & TEXT($B$2,"yyyy年m月d日"))
曜日も入れるなら yyyy年m月d日(aaa) のようにカスタムできます。
週開始日(WC)を「月曜日」に自動で揃えたいとき
運用上、「開始日は分かるけど、それが週の途中の日付かもしれない」ということがあります。例えば、任意の日付から「その週の月曜」を自動算出してWCにしたい場合は、テンプレートや別セルで計算できます。
任意の日付から「週の月曜(WC)」を求める式
例として、A2に任意の日付が入っているとします。その週の月曜(WC)は次の式で求められます。
=A2-WEEKDAY(A2,2)+1
WEEKDAY(A2,2)は「月=1、火=2…日=7」で返します- その値を引いて +1 することで、週の月曜に補正します
この考え方をVBA側に組み込むこともできますが、まずはテンプレートを「B2が月曜である前提」にしておくと、設計がシンプルでトラブルが減ります。
運用で差がつくテンプレート設計のコツ
Templateは触る人を限定し、保護・非表示にする
テンプレートが壊れると、52週すべてに影響します。次のどちらかは早めにやっておくと安定します。
- Templateシートを保護(入力セル以外をロック)
- Templateシートを非表示(必要なときだけ表示)
WCセル(B2)は「入力用」に見えるデザインにする
生成後に人がB2を触ってしまうと、週全体がズレます。運用で触らせない場合でも、セルの見た目を工夫すると事故が減ります。
- B2の背景色を薄くして「基準日」だと分かるようにする
- コメント(メモ)で「このセルはVBAがセットします」など注意書きを入れる
- シート保護でB2だけ編集不可にする(完全自動運用の場合)
印刷・PDF化するなら、ページ設定もテンプレで固める
週次スケジュールは配布物になることも多いです。テンプレートに以下をセットしておくと、生成した52枚すべてに反映されます。
- 印刷範囲
- 余白、拡大縮小(1ページに収める等)
- ヘッダー/フッター(部署名、版数、ページ番号など)
よくあるつまずきと解決策(ここだけ見れば復旧できる)
| 症状 | 原因 | 対策 |
|---|---|---|
| 日付が「45678」など数字に見える | 表示形式が「標準」 | セルの書式を「日付」またはユーザー定義(例:yyyy/mm/dd)にする |
| Templateをコピーしても日付が変わらない | 日付セルがB2参照ではなく固定入力 | 曜日セルを必ず $B$2+0〜+6 の式に統一する |
| マクロ実行でエラー「Subscript out of range」 | Templateシート名が違う/存在しない | シート名を Template に合わせる(またはコードの定数を変更) |
| 同じ週を二重に作ろうとしてエラーになる | 同名シートが既にある | スキップ運用にするか、上書き(削除して作り直し)運用にする |
| シート名が意図した表記にならない | PCの言語設定で月名が変わる | 月略称を配列で固定する(記事のVBAコード方式) |
週次スケジュールを「52週分」作るときの現実的な注意点
52週分を作ると、単純計算で1年をカバーできますが、運用上は次の点も知っておくと安心です。
- 年によっては「53週目」が必要に感じることがあります(ISO週や年度の区切り方次第)。必要なら
WEEKS_TO_CREATEを53に変えるだけで対応できます。 - 開始日が「年度開始」や「プロジェクト開始」なら、必ずしも1月始まりでなくてOKです。開始日を変えるだけで全週が再生成できます。
- 作成後にテンプレを大幅改修するなら、「上書き運用」ではなく、別ブックで新年度分を生成してから移行すると安全です。
まとめ:WC×テンプレ×VBAで“週次の手作業”をなくす
週次スケジュールの自動化は、難しい関数や複雑な仕組みがなくても実現できます。ポイントは次の3つだけです。
- WC(週開始日)を1セル(例:B2)に集約し、曜日の日付はすべて参照式で作る
- Templateシートを完成させ、レイアウト・書式・印刷設定を固定する
- VBAでTemplateを52週分コピーし、各シートのB2へ週開始日をセットして連動させる
これだけで、「シート名」「ヘッダー」「月〜日の実日付」が一致した状態を自動で量産でき、週次の更新作業が一気に軽くなります。あとは運用に合わせて、週数・開始日・見出し表記を微調整して使い回してください。

コメント