【VBA】日付・曜日を判定して月末処理を自動化する方法(コピペOK)

VBA
スポンサーリンク

書き換えポイント

変数・箇所 説明 初期値
Month(Date) + 1, 0 月末日取得の計算式。変更不要
Weekday(lastDay, vbMonday) > 5 土日判定。変更不要
'--- ★ここに〜 月末最終営業日に実行したい処理 MsgBox(デモ用)

コードの流れ

  1. 月末日の取得: DateSerial(Year(Date), Month(Date) + 1, 0) で翌月の0日 = 今月の末日を取得
  2. 営業日にずらす: Do While ループで月末日が土日なら1日ずつ前にずらす
  3. 今日と比較: Date <> lastDay なら対象外としてスキップ
  4. 処理の実行: 今日が月末最終営業日なら、★の箇所に書いた処理を実行

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引数を書く

関連記事


次にやりたくなること


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

「祝日テーブルも含めた完全な営業日判定を作りたい」「月末処理を複数ステップ(集計→色分け→PDF→メール)で自動化したい」「特定の曜日(毎週金曜など)に定期実行したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できる。

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

  • Excel のバージョン / OS
  • 月末処理の内容(何をしたいか)
  • 祝日判定が必要かどうか
  • データの行数と処理対象のシート数

あわせて読みたい

コメント

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