オフィスのキャパシティ/出社人数の観測など、土日祝を除いて計算をしたい場合がありますが、稼働日数を簡単に計算してくれるNETWORKDAYS関数があることを知り、使い方を確認しました。
私の所属会社の基本の休日は土日祝です。
NETWORKDAYS関数を知る前までは、まずは日付テーブルと祝日テーブルを用意し、①日付テーブルにて曜日列が1(日曜日)または7(土曜日)であるかどうか、またLOOKUPVALUE関数を使い、日付テーブルが祝日テーブルの祝日に存在するかどうかをみて、稼働日かどうかを0(=非稼働日)と1(=稼働日)で示す列(下図の"IsWorkingday"列)を追加し、その上で、②その列の値を加算することで稼働日を計算をしていました。
※以下の日は非稼働日なので"0"を指定
2024年1月1日:祝日(元日)
2024年1月6日:土曜日
2024年1月7日:日曜日
2024年1月8日:祝日(成人の日)
NETWORKDAYS関数とは
NETWORKDAY関数は指定された日の間で稼働日を返す関数です。週末の除外、祝日の除外を関数内で簡単に行えます。
週末が必ずしも土日ではない場合も想定されており、簡単にカスタマイズできるようにオプションが用意されています。
祝日も祝日用テーブルを用意すれば簡単に稼働日から除外することができます。
NETWORKDAYS(<start_date>, <end_date>[, <weekend>, <holidays>])
実際に使ってみた
以下は実際に記述したメジャーです。
※事前に日付テーブル(Calendar)と祝日テーブル(Japan Holidays)を用意しておきます。
WorkingDays_2 =
var _StartDate = MIN('Calendar'[Date])
var _EndDate = MAX('Calendar'[Date])
RETURN
NETWORKDAYS(
_StartDate,
_EndDate,
1,
DISTINCT('Japan Holidays'[Date]))
指定した期間の稼働日を計算するので、期間の始まりと終わりを_StartDate(=始まり)、_EndDate(=終わり)として定義しました。
前述のとおり、私が所属している会社は土日が非稼働日なので、3つ目の引数(weekend)には"1"を指定しました。
祝日テーブルは下記のような感じで用意していましたが、実際に必要なのはDate列のみになります。DISTINCT関数を使って、Date列の内容のみを指定しました。
結果、従来のやり方と同じように、問題なく動作することを確認しました。
NETWORKDAYS関数を使うとこれまで2ステップで行っていた稼働日計算を1ステップで行えるし、なんだかスマートな気がしています!
WorkingDays_1:従来のやり方で算出した稼働日数
WorkingDays_2:NETWORKDAYS関数を使って算出した稼働日数
以上