月末の最終営業日をExcelで取得|土日・祝日を除く3パターンの関数式まとめ

Excel
この記事は約11分で読めます。

※本記事はアフィリエイト広告(プロモーション)を含みます。

成人女性
成人女性

毎月の支払予定表、月末締めにしてるんだけど…月末が土日のときって結局「その前の金曜」に直さなきゃで、毎回手作業なんだよね。これ、関数で一発にできないの?

ノア
ノア

お、いいところに気づいたにゃ。「月末日」を出す関数はあっても、「月末の“最終営業日”」をズバッと返す専用関数は、実はExcelに無いんだにゃ。だから組み合わせで作るのが定石にゃ。

ヒイラギ
ヒイラギ

私も施工管理時代、工程表や請求の締め日を入れるときに同じところでつまずきました。

ヒイラギ
ヒイラギ

結論から言うと、EOMONTHWORKDAYを組み合わせれば、土日も祝日も避けた最終営業日を自動で出せる可能性が高いです。祝日リストを用意したくない場合の“軽い代替式”もあるので、順番に見ていきましょう。

この記事でわかること

  • 月末の最終営業日を関数で自動取得する“王道の式”
  • なぜ「翌月1日から−1日」で逆算するのか、その考え方
  • 祝日リストが要らないWEEKDAYを使った代替式
  • 祝日リスト(内閣府データ)の入手と使い方の一般手順
  • コピペで使える「支払・締め日管理表」テンプレ
  • よくあるエラーと対処(祝日範囲の指定ミスなど)
  • 中上級者向け:VBAで自作関数にする例
  • 翌月末・2ヶ月先末への応用(EOMONTHの応用)

まず結論:最終営業日はこの式で出ます

 そもそも最終営業日とは、その月のうち、土日や祝日を除いた“最後の平日”のことです。
月末日が土曜・日曜・祝日に当たると、月末そのものではなく、その手前の平日が「実際に動ける最後の日」になります。これを自動で出すのがこの記事のゴールです。

祝日も避けたい場合は、次の式が王道です。

=WORKDAY(EOMONTH(A1,0)+1, -1, 祝日リスト)

この式は「A1の“翌月1日”を起点に、1営業日ぶん戻る」ことで、当月の最終営業日を返しています。(祝日リストは祝日が並んだセル範囲。例:$E$2:$E$30)

祝日まではこだわらず「土日だけ避ければOK」という場合は、祝日リスト無しでもいけます。

=WORKDAY(EOMONTH(A1,0)+1, -1)

第3引数(祝日リスト)を省くと、土日だけを避けた最終営業日になります。


なぜ「翌月1日から−1日」で逆算するの?

「月末→戻す」より「翌月頭→1営業日戻す」が安全だからです

 直感的には「月末日を出して、土日なら戻す」と考えたくなります。
ですが月末そのものを起点にすると、“月末が平日か土日か”で場合分けが必要になり、式が複雑になりがちです。

そこで発想を変えます。WORKDAYは「指定日から○営業日後/前の日付」を返す関数で、土日(と渡した祝日)を自動でスキップしてくれます。この性質を使い、「翌月1日」という“確実に存在する起点”から1営業日だけ戻せば、月末が平日でも土日でも、必ず当月の最終営業日に着地します。場合分けが消えるわけです。

ノア
ノア

「月末から後ろ向きに数える」んじゃなくて、「翌月の入口から一歩バックする」発想にゃ。スタート地点を固定すると、式がシンプルになるにゃ。

ちなみに各パーツの役割はこうです。

  • EOMONTH(A1,0)A1の月の「月末日」を返す(0は当月の意味)
  • +1月末日の翌日=「翌月1日」にする
  • WORKDAY(起点, -1, 祝日)起点から1営業日前へ戻す(土日・祝日は自動スキップ)

祝日も避けたい:WORKDAY+祝日リストの作り方

内閣府の「国民の祝日」データを使うのが一般的です

 祝日を避けるには、第3引数に「祝日が並んだセル範囲」を渡します。祝日の一覧は、内閣府「国民の祝日について」のページで配布されているCSVを使うのが一般的な方法です(無料・公的データ)。

  1. 内閣府「国民の祝日について」のページを開く
  2. ページ内のCSVファイル 例:「昭和30年〜国民の祝日(csv形式)」
    ※リンク名は毎年更新をダウンロード
  3. CSVを開き、日付の列をExcelの空き列(例:E列)に貼り付ける
  4. 貼り付けた範囲を式の第3引数に指定する(例:$E$2:$E$30)
=WORKDAY(EOMONTH(A1,0)+1, -1, $E$2:$E$30)

E列に祝日を並べておけば、その祝日も“営業日でない日”として自動でスキップされます。

ヒイラギ
ヒイラギ

ひとつ正直にお伝えすると、この内閣府CSVは過去にファイル名や文字コードの仕様が変わったことがあり、貼り付け時に文字化けや日付ズレが起きるケースが報告されています

ヒイラギ
ヒイラギ

貼り付け後は「日付として認識されているか(右寄せになっているか)」を一度確認すると安全だと私は考えています。


祝日リストが面倒:WEEKDAYを使う代替式

土日だけ避ければいいなら、祝日リスト無しで1セル完結します

「祝日まではいらない」「とにかく身軽に土日だけ避けたい」
――そんなときはWEEKDAYで曜日を判定して引き算する方法があります。

=EOMONTH(A1,0)-MAX(WEEKDAY(EOMONTH(A1,0),2)-5,0)

やっていることを分解すると、

  • EOMONTH(A1,0)まず月末日を出す
  • WEEKDAY(月末,2)月末が何曜日かを数値化(月曜=1 … 土曜=6 / 日曜=7)
  • -5 と MAX(…,0)土曜なら1、日曜なら2、平日なら0を“戻す日数”として算出
  • 最後にその日数を月末から引くので、月末が土日でも直前の平日に着地します。
ノア
ノア

WEEKDAYの「種類2」は月曜が1スタートだから、土日が6・7にまとまって判定しやすいにゃ。ここが地味な肝にゃ。

ただし注意点もあります。
この代替式は「土日」しか避けません。祝日は考慮されないため、祝日に当たる月末まわりはズレます祝日も外したいなら、前述のWORKDAY+祝日リストの式を使ってください。

成人女性
成人女性

なるほど…祝日まで気にするか・しないかで、式を選べばいいのか。これで合ってるよね?

ヒイラギ
ヒイラギ

はい、その理解で目的に合うと思います。
「精度(祝日も外す)」を取るならWORKDAY、「手軽さ(1セル完結)」を取るならWEEKDAY

ヒイラギ
ヒイラギ

どちらが正解という話ではなく、目的で選ぶのが良いと私は考えています。


コピペで使える「支払・締め日管理表」テンプレ

A列に基準日を入れるだけで、締め日が自動で並びます

 実務でそのまま使える形にしたのが下の表です。
A列に各月の任意の日付(1日でOK)を入れると、最終営業日と、その3営業日前(社内締め想定)が自動表示されます。

項目セル例入れる式何をする式か
基準日(任意の日)A22025/1/1 など手入力対象月を決める入口
月末の最終営業日B2=WORKDAY(EOMONTH(A2,0)+1,-1,$E:$E)土日祝を避けた月末営業日
社内締め(3営業日前)C2=WORKDAY(B2,-3,$E:$E)最終営業日から3営業日戻す
翌月の最終営業日D2=WORKDAY(EOMONTH(A2,1)+1,-1,$E:$E)来月分の締めを先読み

祝日リストはE列にまとめて貼り、式では列ごと($E:$E)を参照すると、後から祝日を足しても式の修正が不要になります。

ここで使ったEOMONTHやWORKDAYは、日付計算の“土台”になる関数です。基礎からおさらいしておくと、今回の式がぐっと応用しやすくなります。


よくあるエラーと対処法

「結果が数字(45000みたいな値)で出る」

関数が返すのは“日付シリアル値”なので、セルの表示形式が「標準」のままだと数字に見えます。セルの表示形式を「日付」に変えれば直ります。

「祝日が避けられない/範囲指定がおかしい」

よくある原因は次のあたりです。

  • 祝日リストの範囲指定がズレている(見出し行まで含む/空白セルを含む)
  • 貼り付けた祝日が「文字列」になっていて、日付として認識されていない
  • 複数年ぶんが必要なのに、当年ぶんしか貼っていない

特に「文字列の日付」は見た目が同じでも関数が無視するため、貼り付け後に右寄せ(=日付認識)になっているかの確認が有効です。

「#NAME? と出る」

 関数名のスペルミスか、ごく古いExcelで関数が使えないケースが考えられます。WORKDAY・EOMONTHは比較的新しいバージョンで標準搭載されています。

ノア
ノア

土曜も営業日に入れたい会社(建設・小売など)は、WORKDAY.INTLを使うと「どの曜日を休みにするか」を細かく指定できるにゃ。日曜だけ休みなら週末番号「11」にゃ。

※例)=WORKDAY.INTL(EOMONTH(A1,0)+1,-1,11,$E:$E)


中上級者向け:VBAで自作関数にする

何度も使うなら関数化すると式がスッキリ!

 同じ計算をブック中で多用する場合、私はVBAで自作関数にして使っていました。
標準モジュールに下記を貼ると、ワークシートで「=LastWorkday(A1)」のように呼べます。

Function LastWorkday(targetDate As Date) As Date
    Dim d As Date
    ' 当月末日=「翌月の0日目」で取得
    d = DateSerial(Year(targetDate), Month(targetDate) + 1, 0)
    ' 土日なら平日まで1日ずつ戻す(月=1…日=7)
    Do While Weekday(d, vbMonday) > 5
        d = d - 1
    Loop
    LastWorkday = d
End Function
  • DateSerial(年, 月+1, 0)で「翌月0日=当月末日」を取得しています。
  • Weekday(d, vbMonday)が5より大きい(=土6・日7)間だけ1日ずつ戻します。

※このVBA例は土日のみ対応です。祝日も外したい場合は、祝日を配列で持たせて判定を1つ足す形で拡張できます。

ヒイラギ
ヒイラギ

VBA(マクロ)入りのファイルは拡張子が .xlsm になり、開く際にセキュリティ警告が出ます
配布相手が限られる社内用途などで使うのが無難だと私は考えています。


応用:翌月末・2ヶ月先の末も同じ発想で

EOMONTHの「月数」をずらすだけです

 EOMONTHの第2引数は「何ヶ月ずらすか」。
ここを変えるだけで先々の月末営業日が出せます。

やりたいこと何をする式か
当月の最終営業日=WORKDAY(EOMONTH(A1,0)+1,-1,$E:$E)当月末を起点
翌月の最終営業日=WORKDAY(EOMONTH(A1,1)+1,-1,$E:$E)1ヶ月先の月末
2ヶ月先の最終営業日=WORKDAY(EOMONTH(A1,2)+1,-1,$E:$E)2ヶ月先の月末

「EOMONTH(A1, n)+1」のnを増やすほど先の月へ進み、あとは同じく1営業日戻すだけです。資金繰り表や入金予定の先読みに使えます。


まとめ

  • 王道は=WORKDAY(EOMONTH(A1,0)+1, -1, 祝日リスト)で、土日も祝日も避けられる
  • 「翌月1日から1営業日戻す」逆算にすると、場合分けが消えてシンプルになる
  • 祝日が不要ならWEEKDAY式が1セルで完結(ただし祝日は避けられない)
  • 祝日リストは内閣府「国民の祝日について」のCSVを使うのが一般的
  • 結果が数字で出たら表示形式を「日付」に、避けられない時は範囲・文字列を疑う
  • 多用するならVBAで関数化、先の月はEOMONTHの月数を変えるだけ
ヒイラギ
ヒイラギ

最初は式が呪文のように見えるかもしれません。
でも「翌月の入口から一歩戻る」という考え方さえ掴めば、応用はぜんぶ同じです。

ヒイラギ
ヒイラギ

まずはコピペで動かして、自分の表に馴染ませてみてください。
手作業の月末修正から解放される時間は、地味でも確実にあなたの選べる余白になっていくはずだと私は考えています。

ノア
ノア

動かしてみて「お、合ってる!」ってなった瞬間がいちばん楽しいにゃ。まずは1セル、試してみるにゃ!

今回のように「手作業のひと手間」を関数やテンプレで減らすと、空いた時間を別のことに回せます。事務作業そのものを軽くする工夫は、こちらでもまとめています。


よくある質問

Q. 祝日リストは毎年更新が必要ですか?

A. はい、基本的には必要です。

 内閣府のデータは将来の祝日が確定するたびに更新されるため、年に一度ほど最新版に貼り替えると安心です。複数年ぶんをまとめて貼っておくと、当面の更新頻度を下げられます。

Q. Googleスプレッドシートでも同じ式は使えますか?

A. 基本使えます。

 WORKDAY・EOMONTH・WEEKDAYはスプレッドシートにもあり、考え方は同じです。ただし関数の引数区切りや祝日範囲の指定など、細部の挙動が異なる場合があります。実際の表で一度動作確認することをおすすめします。

Q. WORKDAYとWEEKDAY、どちらを使えばいいですか?

A. 目的次第です。

 祝日まで避けたいならWORKDAY+祝日リスト、土日だけでよく手軽さを優先するならWEEKDAY式が向いています。
どちらが正解という話ではなく、必要な精度で選ぶのが良いと私は考えています。


参考文献

※内閣府CSVは過去にファイル名(syukujitsu/shukujitsu)や文字コード(Shift-JIS)まわりの仕様変更例があり、収録範囲・リンク名も毎年更新されます。利用時は最新の配布ページから取得してください。


※本記事は情報提供を目的としたものであり、特定の操作結果や業務上の成果を保証するものではありません。数式やマクロの動作は、お使いのExcelのバージョン・言語設定・地域設定によって異なる場合があります。重要な業務にご利用の際は、必ずご自身の環境でテストのうえ、最終的なご判断はご自身の責任で行ってください。本記事の内容により生じたいかなる損害についても、当ブログは責任を負いかねます。

コメント

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