日程Fit|「いつ空いてますか?」の往復はもう不要。候補日を選んでURLを送るだけ|登録不要|今すぐ無料で使う →

Excel VBAで週次スケジュールを52週自動生成する方法|WC(週開始日)テンプレート運用

Excelで週次スケジュールを52週分作ると、シート複製・日付入力・見出し更新が毎回発生して、運用がどんどん重くなります。週開始日(WC)を1セルに集約し、テンプレート+VBAで「シート名」「月〜日の日期」「ヘッダー」を連動させれば、手入力をほぼゼロにして安定運用できます。

日程Fit。無料・登録不要。「いつ空いてる?」を、ひとつのリンクで。リンクを送って、○△×でかんたん日程調整。無料で日程を作る。
目次

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の言語設定によっては、Formatmmmが英語にならないケースがあります。タブ名を必ず「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_CREATE53 に変えるだけで対応できます。
  • 開始日が「年度開始」や「プロジェクト開始」なら、必ずしも1月始まりでなくてOKです。開始日を変えるだけで全週が再生成できます。
  • 作成後にテンプレを大幅改修するなら、「上書き運用」ではなく、別ブックで新年度分を生成してから移行すると安全です。

まとめ:WC×テンプレ×VBAで“週次の手作業”をなくす

週次スケジュールの自動化は、難しい関数や複雑な仕組みがなくても実現できます。ポイントは次の3つだけです。

  • WC(週開始日)を1セル(例:B2)に集約し、曜日の日付はすべて参照式で作る
  • Templateシートを完成させ、レイアウト・書式・印刷設定を固定する
  • VBAでTemplateを52週分コピーし、各シートのB2へ週開始日をセットして連動させる

これだけで、「シート名」「ヘッダー」「月〜日の実日付」が一致した状態を自動で量産でき、週次の更新作業が一気に軽くなります。あとは運用に合わせて、週数・開始日・見出し表記を微調整して使い回してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次