土日祝日を除外したn営業日後の日付を返したい場合、M言語だとワークシート関数の WORKDAY関数に該当するものがないので、それなりに苦労するかもしれない。
とはいえ、「年間(別に何なんでもいいけど)のリスト」を用意して「規定の曜日」と「国民の祝日」を省けば「営業日リスト」は作れる。
まずは祝日一覧。これについては年を指定して WebAPIを利用すれば、Web上から読み込める。
祝日リスト
年 = 2022,
祝日リスト = [
URL = "https://holidays-jp.github.io/api/v1/★/date.json",
ソース = Web.Contents(Text.Replace(URL, "★", Text.From(年))),
祝日リスト = Record.FieldNames(Json.Document(ソース)),
型の編集 = List.Transform(祝日リスト, Date.From)
][型の編集]
これで完成。何年分かまとめて作りたい場合はカスタム関数にして、年リストから読み込んだ結果を結合すればいい。
次は年間の日付リストを作る。これはどんな作り方でもいい。
年間リスト
年間リスト = [
年始 = #date(年,1,1),
年末 = Date.AddDays(#date(年+1,1,1), -1),
リスト1 = {Number.From(年始)..Number.From(年末)},
リスト2 = List.Transform(リスト1, Date.From)
][リスト2]
ひとまずこれで一年分のリストになる。
後は年間リストから祝日の日と指定曜日(例えば土日)を抜けばおしまい。
営業日リスト
祝日除外 = List.Difference(年間リスト, 祝日リスト),
土日除外 = List.Select(祝日除外, each not List.Contains(
{"土曜日", "日曜日"}, Date.DayOfWeekName(_)
)),
テーブルに変換 = Table.FromList(
土日除外, Splitter.SplitByNothing(), type table [日付=date]
)
シートに読み込もうと思ったので最後はテーブルに変換したけど、他で利用するならリストのままでいいと思う。
まとめるとこうなる
営業日リスト
let
年 = 2022,
祝日リスト = [
URL = "https://holidays-jp.github.io/api/v1/★/date.json",
ソース = Web.Contents(Text.Replace(URL, "★", Text.From(年))),
祝日リスト = Record.FieldNames(Json.Document(ソース)),
型の編集 = List.Transform(祝日リスト, Date.From)
][型の編集],
年間リスト = [
年始 = #date(年,1,1),
年末 = Date.AddDays(#date(年+1,1,1), -1),
リスト1 = {Number.From(年始)..Number.From(年末)},
リスト2 = List.Transform(リスト1, Date.From)
][リスト2],
祝日除外 = List.Difference(年間リスト, 祝日リスト),
土日除外 = List.Select(祝日除外, each not List.Contains(
{"土曜日", "日曜日"}, Date.DayOfWeekName(_)
)),
テーブルに変換 = Table.FromList(
土日除外, Splitter.SplitByNothing(), type table [日付=date]
)
in
テーブルに変換
ここまで準備ができたらN営業日後を計算するのは簡単。テーブル1に日付型の「日付」列があるものとして
翌営業日列を追加
加算日数 = 1,
N営業日後列の追加 = Table.AddColumn(テーブル1, "N営業日後", each [
日付 = [日付],
営業日 = List.Buffer(営業日リスト[日付]),
選択 = List.Select(営業日, each _>日付),
抽出 = List.FirstN(選択, 加算日数),
該当日 = List.Reverse(抽出){0}
][該当日]),
日付列の削除 = Table.RemoveColumns(N営業日後列の追加, {"日付"})
以上。もし当日を含めて計算したい時は、「日付 = [日付]」を「日付 = Date.AddDays([日付], -1)」に変更すればいい。