書き換えポイント
| 変数・箇所 | 説明 | 初期値 |
|---|---|---|
Month(Date) + 1, 0 |
月末日取得の計算式。変更不要 | — |
Weekday(lastDay, vbMonday) > 5 |
土日判定。変更不要 | — |
'--- ★ここに〜 |
月末最終営業日に実行したい処理 | MsgBox(デモ用) |
コードの流れ
- 月末日の取得:
DateSerial(Year(Date), Month(Date) + 1, 0)で翌月の0日 = 今月の末日を取得 - 営業日にずらす:
Do Whileループで月末日が土日なら1日ずつ前にずらす - 今日と比較:
Date <> lastDayなら対象外としてスキップ - 処理の実行: 今日が月末最終営業日なら、★の箇所に書いた処理を実行
DateSerial(年, 月+1, 0)は「翌月の0日目 = 今月の最終日」を意味する。VBAの日付処理では定番のテクニック。初見では分かりにくいが、覚えると月末取得がこの1行で済む。
よくある落とし穴5選
1. Weekday の第2引数を省略して曜日がずれる
原因: Weekday(Date) とだけ書くと、デフォルトで日曜始まり(vbSunday)になる。この場合、土曜=7、日曜=1 になり、>= 6 の判定では土曜しか引っかからない。
自分もこれでハマった。vbMonday を指定し忘れて金曜日に処理が走らなくなった。上司に「金曜の数字が出てない」と指摘されて気づいた。あのときは冷や汗だった。
対策: Weekday(Date, vbMonday) と必ず第2引数を書く。月曜=1〜日曜=7 で統一すれば > 5 で土日判定ができる。
2. DateSerial の「月+1, 0」が理解できない
原因: DateSerial(2026, 4, 0) が 2026/03/31 になる仕組みが分かりにくい。
対策: 「翌月の0日目 = 今月の最終日」と覚える。VBAが自動的に日付を繰り下げてくれる。12月の場合も DateSerial(2026, 13, 0) → 2026/12/31 で正常に動く。
3. 祝日を考慮していない
原因: この記事のコードは土日のみ除外。祝日(元日、成人の日、etc.)は営業日として扱われる。
対策: 祝日も除外したい場合は、シートに祝日一覧(マスタ)を用意し、Application.Match で突き合わせる。この記事の範囲では土日除外のみ対応。
4. 月末処理が2回走ってしまう
原因: マクロを同じ日に2回実行すると、当然2回走る。
対策: 処理済みフラグをセルに書き込む方法がある。フラグ用セルはデータと被らない空きセルや別シートに置くことを推奨。
If Range("A1").Value = Format(Date, "yyyy/mm/dd") Then
MsgBox "本日は処理済みです。", vbInformation
Exit Sub
End If
' --- 処理 ---
Range("A1").Value = Format(Date, "yyyy/mm/dd")
5. Date と Now を間違えて日付比較がうまくいかない
原因: Now は日付+時刻を返す(例:2026/03/07 14:30:00)。Date は日付のみ(例:2026/03/07)。日付比較に Now を使うと時刻部分のせいで一致しない。
対策: 日付の比較には必ず Date を使う。時刻が不要なら Now は使わない。
FAQ
Q1: 祝日も除外した営業日判定をしたい
シートに祝日一覧を用意し、月末日から遡りながら祝日にも該当しないか確認する。この記事では土日のみ除外する方法を紹介しているが、祝日テーブルとの組み合わせはカスタマイズの範囲。
Q2: 月初の最初の営業日を取得したい
DateSerial(Year(Date), Month(Date), 1) で月初日を取得し、土日なら+1する:
Dim firstDay As Date
firstDay = DateSerial(Year(Date), Month(Date), 1)
Do While Weekday(firstDay, vbMonday) > 5
firstDay = firstDay + 1
Loop
Q3: 月末最終営業日に色分けも自動実行したい
月末判定の★部分に色分けマクロを呼び出す行を追加する。色分けの方法は セルの値に応じて行を自動色分け を参照。
'--- ★ここに月末処理 ---
Call ColorByValue ' 色分けマクロを呼び出す
Q4: ファイルを開いたら自動で月末判定させたい
ThisWorkbook モジュール(標準モジュールではない)に Workbook_Open イベントを書く:
Private Sub Workbook_Open()
Call RunOnLastBusinessDay
End Sub
注意: このコードは VBE 左側のプロジェクトエクスプローラーで「ThisWorkbook」をダブルクリックして開くウィンドウに貼る。標準モジュールに貼っても動かない。
これでファイルを開くたびに自動判定される。セルの値が変わったら自動実行する方法(セルの値が変わったら自動実行)と同じイベント駆動の考え方。
Q5: 判定結果をセルに書き出したい
MsgBoxの代わりにセルに書く:
Range("A1").Value = "最終営業日: " & Format(lastDay, "yyyy/mm/dd")
Range("A2").Value = IIf(Date = lastDay, "今日は対象日", "今日は対象外")
まとめ
Weekday(Date, vbMonday)で曜日番号を取得し、土日を判定できるDateSerial(Year(Date), Month(Date) + 1, 0)で月末日を取得できる- 月末日が土日なら前にずらして最終営業日を求める
vbMondayの指定忘れが最大の落とし穴。必ず第2引数を書く
関連記事
- マクロをボタン1つで実行する方法 — 月末判定マクロをボタンに割り当てればワンクリックで済む
- セルの値に応じて行を自動色分け — 月末行や期限切れの行を色分けする
- ExcelファイルをPDFに一括変換 — 月末レポートをPDFにして保存・配布
次にやりたくなること
- Excelからメール自動作成(Outlook連携): 月末処理の結果をメールで送信。報告の自動化に直結する
- セルの値が変わったら自動実行: 日付セルの変更をトリガーに判定処理を自動実行
もっとカスタマイズしたい場合
「祝日テーブルも含めた完全な営業日判定を作りたい」「月末処理を複数ステップ(集計→色分け→PDF→メール)で自動化したい」「特定の曜日(毎週金曜など)に定期実行したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できる。
相談時に伝えると話が早い情報:
- Excel のバージョン / OS
- 月末処理の内容(何をしたいか)
- 祝日判定が必要かどうか
- データの行数と処理対象のシート数

コメント