【VBA】スケジュール管理を自動化!予定チェックを効率化する方法とは

エクセルで手作業のスケジュール管理を続けていませんか?
毎年1月になるたびに、カレンダーを1から作り直して、曜日を手入力して、土曜・日曜のセルを手作業で青・赤に塗り替える……そんな作業を繰り返していたら、それだけで数時間が消えていきます。
さらに「期日まであと何日?」と確認するたびに目視でチェックして、3日以内になったら手動で文字を赤くして——そんな煩わしい操作を毎週のルーティーンにしている方は、実は職場にとても多いものです。
VBAを使えば、これらの手作業を「ボタン1クリック」で完結させることができます。
この記事では、私が実際に受注したスケジュール管理の自動化マクロ開発をもとに、年度切替・曜日設定・期日アラートをまとめて自動化するVBAコードをプログラミング初心者でも理解しやすいように解説します。
記事を読み終えたころには「これは今すぐ自分の業務に使える!」と感じていただけるはずです。
手作業のスケジュール管理が引き起こす3つの問題
エクセルでスケジュール管理を手作業で続けていると、実は見えないところで大きなコストが積み重なっています。
VBAによる自動化を検討するにあたって、まずは手作業の問題点を整理しておきましょう。
問題①:年度が変わるたびにカレンダーを作り直している
新しい年度が始まるたびに、エクセルのカレンダーを「また最初から作らないと……」と感じた経験はありませんか。
日付を1日から31日まで手入力して、月ごとの末日を確認して、うるう年かどうかも調べて……といった作業は、小さいように見えて実は相当な時間を消費しています。
私がマクロ開発依頼を受けた案件でも、「毎年1月に半日かけてカレンダーを作り直している」というご相談がありました。
VBAを使えば、年の数字を変えるだけで365日分のカレンダーが自動で再生成されます。
問題②:曜日の色付けを毎年手動で塗り直している
「土曜日は青、日曜日は赤」というルールで色付けしているスケジュール表は、年が変わると曜日の位置がすべて変わるため、塗り直し作業が毎年発生します。
セルを1つひとつ確認しながら色を変えていくのは、単純ながら集中力を要する地味な作業です。
途中で1つ間違えると、以降の行がすべてずれたままになるリスクもあります。
VBAなら、曜日の判定と色付けを自動で処理するため、ミスゼロで瞬時に完了します。
問題③:期日の残り日数を毎回目視で確認している
タスクやプロジェクトの期日をエクセルで管理していると、「あの件、期日はいつだっけ?」と毎回目でスクロールして確認する作業が発生します。
件数が多くなるほど見落としのリスクが高まり、気づいたら期日を超過していた——というミスにつながることも。
VBAを使えば、残り日数を自動計算して「7日以内なら緑文字、3日以内なら赤文字」というように視覚的なアラートを自動で表示する仕組みを作れます。
目視確認に頼らない、抜け漏れゼロのスケジュール管理が実現します。
VBAでスケジュール管理を自動化するメリット
手作業の問題を確認したところで、次はVBAで自動化することで得られる具体的なメリットを見ていきましょう。
メリット①:年度切替がボタン1クリックで完了する
VBAを設定したスケジュール表では、年の数字を変えてボタンを押すだけで、翌年分のカレンダーを自動生成することが可能です。
うるう年の判定も、月末日の計算も、すべてVBAが自動処理します。
「毎年1月の作業」がゼロになるだけで、年間で数時間の作業時間を削減できます。
関連記事「便利なマクロが設定されたエクセルカレンダー」では、エクセルカレンダーをダウンロードできます。
実際にマクロを動かして便利さを体感してみてください。
メリット②:土日・祝日の色付けが自動で完了する
VBAにWeekday関数を組み込むことで、土曜日を青、日曜日を赤に自動で色付けすることができます。
年度が切り替わっても曜日の判定はVBAが自動処理するため、色の塗り直し作業は完全になくなります。
見た目にもわかりやすいカレンダーが、毎年ほぼゼロコストで完成するわけです。
メリット③:期日アラートで見落としを防げる
VBAを使えば、今日の日付と期日列を自動で比較して、残り日数に応じて文字の色を切り替えることができます。
たとえば「7日以内は緑文字」「3日以内は赤文字」「期日超過は赤の太字」というルールをコードに設定しておくと、エクセルを開いた瞬間に視覚的なアラートが表示されます。
目視チェックに頼らずに済むため、重要な締め切りの見落としを大幅に減らすことが可能です。
見落としを確実に防ぎたいなら、セルを点滅させるVBAの設定がおすすめです。
期日が近づいたら処理が完了するまでセルを点滅させる!という使い方ができます。
VBAスケジュール管理の基本|カレンダー自動生成コード
ここからは実際のVBAコードを使いながら、スケジュール管理の自動化を解説していきます。
まずは「年度を入力するだけで365日分の日付と曜日が自動で生成される」基本コードから確認しましょう。
年度切替・曜日設定を自動化するVBAコード
下記のサンプルコードは、B1セルに入力した年の数値をもとに、A列に日付・B列に曜日を自動設定するコードです。
土曜日は青、日曜日は赤で色付けも同時に処理します。
実行結果がこちら

【VBAコード】
Sub スケジュール自動設定()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("スケジュール")
Dim year As Integer
year = ws.Range("B1").Value '年度を入力するセル
Dim month As Integer
Dim startRow As Long
startRow = 3 '日付を入れる開始行
Dim i As Long
Dim d As Date
Dim dayCount As Long
dayCount = 0 '1月から12月まで順に処理
For month = 1 To 12
Dim lastDay As Integer
lastDay = Day(DateSerial(year, month + 1, 0)) '月末日を取得
For i = 1 To lastDay
d = DateSerial(year, month, i)
ws.Cells(startRow + dayCount, 1).Value = d '日付をセット
ws.Cells(startRow + dayCount, 2).Value = Format(d, "aaa")
'曜日をセット
'土曜日を青・日曜日を赤に色付け
Select Case Weekday(d, vbSunday)
Case 1 '日曜
ws.Cells(startRow + dayCount, 2).Font.Color = RGB(255, 0, 0)
Case 7 '土曜
ws.Cells(startRow + dayCount, 2).Font.Color = RGB(0, 70, 200)
Case Else
ws.Cells(startRow + dayCount, 2).Font.Color = RGB(0, 0, 0)
End Select
dayCount = dayCount + 1
Next i
Next month
MsgBox year & "年のカレンダーを自動設定しました。", vbInformation
End Sub
コードの流れを解説します。
最初に Set ws = ThisWorkbook.Worksheets(“スケジュール") で処理対象のシートを指定しています。シート名は実際のファイルに合わせて変更してください。
次に year = ws.Range(“B1").Value でB1セルに入力された年の数値を取得します。ここに「2025」や「2026」と入力するだけで、その年のカレンダーが生成される仕組みです。
DateSerial(year, month + 1, 0) は月末日を自動取得するテクニックです。「翌月の0日目」は前月の最終日になるため、うるう年の2月末日なども正確に処理できます。
Weekday関数でその日が何曜日かを判定し、Select Case 構文で日曜日なら赤(RGB(255,0,0))、土曜日なら青(RGB(0,70,200))に色付けします。
このコードを実行すると、1月1日から12月31日まで自動で日付・曜日・色が設定された1年分のカレンダーが完成します。
期日アラートを自動表示するVBAコード
次に「今日の日付と期日を比較して、残り日数に応じて文字色を自動変更する」コードを紹介します。
私がマクロ開発依頼で実際に実装した仕様をもとにしており、7日以内で緑、3日以内で赤、期日超過で赤の太字に色が変わります。
【VBAコード】
Sub 期日アラート色付け()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("スケジュール")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 3).End(xlUp).Row 'C列(期日列)の最終行
'色のリセット
ws.Range("A3:E" & lastRow).Font.Color = RGB(0, 0, 0)
Dim today As Date
today = Date '今日の日付を取得
Dim i As Long
For i = 3 To lastRow
Dim deadline As Date
If ws.Cells(i, 3).Value = "" Then GoTo Continue '期日が空欄の行はスキップ
deadline = ws.Cells(i, 3).Value
Dim remaining As Long
remaining = deadline - today '残り日数を計算
If remaining <= 3 And remaining >= 0 Then
'3日以内:赤文字
ws.Range("A" & i & ":E" & i).Font.Color = RGB(255, 0, 0)
ElseIf remaining <= 7 And remaining > 3 Then
'7日以内(4〜7日):緑文字
ws.Range("A" & i & ":E" & i).Font.Color = RGB(0, 176, 80)
ElseIf remaining < 0 Then
'期日超過:太字・赤文字
ws.Range("A" & i & ":E" & i).Font.Color = RGB(200, 0, 0)
ws.Range("A" & i & ":E" & i).Font.Bold = True
End If Continue:
Next i
MsgBox "期日チェックが完了しました。", vbInformation
End Sub
コードの流れを解説します。
まず today = Date で今日の日付を自動取得します。このコードを実行するたびに「今日の日付」を基準に判定するため、毎日実行しても常に正しいアラートが表示されます。
lastRow = ws.Cells(ws.Rows.Count, 3).End(xlUp).Row でC列(期日列)のデータが入っている最終行を自動取得しています。タスクが増えてもコードを修正する必要がない、実務向きの書き方です。
For i = 3 To lastRow のループで、期日列を1行ずつスキャンしていきます。期日が空欄の行は GoTo Continue でスキップするため、空白行があってもエラーになりません。
remaining = deadline – today で残り日数を計算し、3日以内なら赤、7日以内なら緑、期日超過(残り日数がマイナス)なら赤の太字という3段階のアラートを設定しています。
処理の先頭で全行の文字色を黒にリセットしてから再判定するため、前回実行時のアラート色が残り続けることもありません。
年度切替ボタンを設置して操作をさらに簡単にする方法
VBAコードを書いたら、次は「どうやって実行するか」が重要です。
毎回VBEを開いてコードを実行するのは非効率なため、エクセル上にボタンを設置して簡単に操作できるようにしましょう。
ボタンから年度切替・全自動処理を実行するVBA
下記のコードは、ボタンを押すと「年を入力するダイアログ」が表示され、入力した年に合わせてカレンダーの再生成と期日アラートの色付けを一気に実行するマクロです。
【VBAコード】
Sub 年度切替ボタン()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("スケジュール")
Dim newYear As String
newYear = InputBox("表示する年を入力してください(例:2025)", "年度切替", Year(Date))
If newYear = "" Then
Exit Sub
If Not IsNumeric(newYear) Then
MsgBox "数字で年を入力してください。", vbExclamation
Exit Sub
End If
ws.Range("B1").Value = CInt(newYear) '年をセルに書き込み
Call スケジュール自動設定
'カレンダー再生成
Call 期日アラート色付け
'色付けも再実行
MsgBox newYear & "年のスケジュールに切り替えました。", vbInformation
End Sub
コードの流れを解説します。
InputBox でユーザーに年の入力を求めます。デフォルト値は Year(Date)(今年)になっているため、「来年に切り替えたい場合だけ変更する」という使い方が自然にできます。
IsNumeric(newYear) で入力値が数値かどうかを確認しています。「あいうえお」など数値以外が入力されたときに処理を止めるエラー対策です。
最後に Call スケジュール自動設定 と Call 期日アラート色付け を順番に呼び出すことで、「年の切替 → カレンダー再生成 → アラート色付け」の3ステップを1ボタンで完結させています。
このボタンをエクセルシートに設置する手順は、「開発タブ → 挿入 → フォームコントロールのボタン → マクロの登録」から「年度切替ボタン」を選ぶだけで完了します。
コードをブックを開いたときに自動実行させる方法
ボタンを押さなくても「エクセルを開いたときに自動でアラートを更新したい」という場合は、Workbook_Open イベントを使う方法が便利です。
VBEを開き、「ThisWorkbook」のコードエリアに以下のコードを貼り付けるだけで、ファイルを開くたびに期日アラートが自動更新されます。
Private Sub Workbook_Open()
Call 期日アラート色付け 'ファイルを開いたとき自動実行
End Sub
これを設定しておくと、毎朝ファイルを開くたびに最新の残り日数でアラートが自動更新されます。
「ボタンを押し忘れてアラートが古いままだった」というヒューマンエラーを防ぐことができます。
VBAスケジュール管理を導入する際の注意点
VBAのスケジュール管理は非常に便利ですが、実装前にいくつかの点を確認しておきましょう。
まず、シート名とセル番地の指定は実際のファイルに合わせて変更することが必要です。サンプルコードは「スケジュール」というシート名を想定していますが、ご自身のファイルのシート名に書き換えてから使ってください。
次に、期日列の列番号についてです。サンプルコードはC列(3列目)を期日列として判定していますが、実際の表のレイアウトに合わせて変更が必要です。
また、マクロ実行にはエクセルの「マクロを有効にする」設定が必要です。ファイルを開いたときに「コンテンツを有効にする」ボタンを押すことを忘れないようにしましょう。
さらに、処理の最初に色をリセットする行を必ず入れるのが重要なポイントです。
リセットを入れておかないと、前回実行時の色が残り続けて誤った情報を表示し続けてしまいます。
スケジュール管理VBAを実際の業務に応用するポイント
今回紹介したVBAコードは、そのまま使えるシンプルな構成にしていますが、実際の業務では少し応用するだけでさらに強力なツールになります。
いくつかの応用アイデアを紹介します。
応用①:担当者別にアラート色を変える
チームでスケジュールを管理している場合、担当者の列を追加して「担当者Aの期日は青系、担当者Bの期日は橙系」というように色を分けることができます。
If ws.Cells(i, 4).Value = “Aさん" Then という条件を追加し、その条件の中に今回の残り日数判定を組み込むだけで実現できます。
誰の案件がどのくらい切迫しているか、色で瞬時に判断できる管理表の完成です。
応用②:完了フラグを立てたタスクをアラート対象から除外する
タスク管理の場合、完了済みのタスクはアラート対象から除外したいケースがほとんどです。
E列に「完了」と入力されている行はスキップする条件を加えるだけで対応できます。
If ws.Cells(i, 5).Value = "完了" Then GoTo Continue
この1行を期日判定の前に追加するだけで、完了済みタスクには色がつかなくなります。
応用③:スケジュール表を印刷用に自動整形する
VBAでアラート色付けが完了したら、そのままの状態で印刷用に整形する処理も追加できます。
列幅の自動調整、罫線の設定、印刷範囲の指定といった処理をまとめて実行するコードを末尾に追加することで「アラート更新 → 印刷整形 → 印刷実行」までをボタン1つで完結させることも可能です。
まとめ ~ スケジュール管理こそVBAで自動化が正解 ~
エクセルのスケジュール管理を手作業で続けることは、手間と時間がかかるので非効率な作業といえます。
VBAを使えば、年度切替・曜日設定・期日アラートといったスケジュール管理の核心部分をすべて自動化することが可能です。
今回紹介したコードの要点をまとめると、
DateSerial関数でうるう年も含めた月末日を正確に処理すること、Weekday関数で曜日判定と色付けを自動化すること、今日の日付と期日の差分を計算して残り日数に応じたアラート色付けを実装すること、そしてそれらをボタン1クリックで一括実行できる構成にすること、
これらの処理が実務で使えるスケジュール管理VBAのポイントです。
まずは今回紹介したサンプルコードをそのまま使ってみて、動きを確認したうえで自分の業務に合わせて数値や列番号を調整してみてください。
もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。
業務内容に合わせたオーダーメイドマクロを設定させていただきます。
最後まで読んでいただきありがとうございました。
エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。







