いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Excel)日付が土日・祝日なら直前(直後)の平日を求める方法

 Excelで、ある日付が平日であればそのままの日付を、そして土日・祝日だったらその直前の平日(直後の平日)を求める方法についてです。つまり前営業日や翌営業日を求める方法ともいえます。
  • WORKDAY関数を使って、指定した日付が土日や祝日であるときにその直前の(直後の)平日の日付を求めることができます。

手順

土日・祝日なら直前の平日を求める例

f:id:accs2014:20200922075232p:plain:right:w450

 画像では、B列に基準となる日付が入力されています。
 これらの日付について、平日であればそのままの日付を、土日・祝日であればその直前の平日の日付を求めるものとします。
 なお「2020/9/19」は土曜、「2020/9/20」は日曜です。さらに「2020/9/21」と「2020/9/22」は祝日です。

 

f:id:accs2014:20200922075237p:plain:right:w450

 まずはこの期間中の2つの祝日の日付をE3,E4セルに入力しておきます。
 後で見るように平日の日付は関数で取得するのですが、日付が祝日かどうかを自動判定する機能はなく、ユーザーが祝日を指定する必要があるためです。

 祝日については手入力するのではなく外部から取得するのがスマートと言えそうですが、それについては別の機会にしたいと思います。

 

f:id:accs2014:20200922075242p:plain:right:w450

 そしてC3セルに次のような式を入力したところです。
 シリアル値になっていますが、これで求めたい日付が求められています。

 E3セル

=WORKDAY(B3+1,-1,E3:E4)

 WORKDAY関数は土日・祝日を除いた日付を返す関数で、まさにこの目的のための関数です。
 ただ引数の与え方が難解というか巧妙です。第1引数(開始日)は本来の基準日の翌日を意味する「B3+1」とし、第2引数(日数。何日後の平日か)はその1つ前の平日を返すよう「-1」と設定する必要があります。「=WORKDAY(B3,0,E3:E4)」などとすると、常に第1引数と同じ日付が返ってくるような意味のない結果しか得られません。
 なお第3引数の「E3:E4」は2日ある祝日を指しており、これらの日付を除いた日付が返されます。
 

f:id:accs2014:20200922075246p:plain:right:w450

 セルの書式設定で表示形式を「日付」に変えると「2020/9/15」という日付の形式で表示されました。
 B3セルの「2020/9/15」はもともと平日ですからこれは当然の結果です。

 

f:id:accs2014:20200922075251p:plain:right:w450

 そこで式中の第1引数を「B3:B12+1」に変えると(式は下記のようになります)、すべての日付に対する欲しい結果が得られました。
 19日から22日までの4つの日付(いずれも土日・祝日)に対しては直前の金曜日である「2020/9/18」という日付が返っているのがわかります。

 E3セル

=WORKDAY(B3:B12+1,-1,E3:E4)

土日・祝日なら直後の平日を求める例

f:id:accs2014:20200922075255p:plain:right:w500

 進め方は上記例とほぼ同じで、異なるのは関数の引数だけですので結果のみ示します。
 WORKDAY関数の第1引数を、本来の基準日の前日を意味する「B3:B12-1」とします。そして第2引数を、1つ後の平日を返すよう「1」とします。
 19日から22日までの4つの日付(いずれも土日・祝日)に対しては直後の水曜日である「2020/9/23」という日付が返っており、欲しい日付が求められているのがわかります。

 E3セル

=WORKDAY(B3:B12-1,1,E3:E4)