なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

Power Query:翌営業日の日付を返す(WORKDAY関数もどき)

土日祝日を除外した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)」に変更すればいい。