カレンダーテーブルは昔いろいろ調べて、なんとなくよさそうなのを使っていたんですがちゃんと理解しといたほうがいいなと思ったのでカレンダーテーブル改修がてらもう一回作ってみようと思います。

風場 輝
適当に作ったダミーデータでPower BI練習中。バージョンによっては画面がかなり変わることもあるのであしからず。
この記事作成時のPower BI Desktopバージョンは「2.143.1204.0 64-bit (2025年5月)」
そもそもカレンダーテーブルとは何か?なんですがすごくざっくり言うと、連続した日付データが入っているデータ一覧です。これがあると、日付スライサーが使いやすくなったりDAX関数に使えたり色んな日付単位でグラフに表示できたりします。
ここからはすでにPower BIに何かしらのデータを取り込んでいて、さらにそのデータに日付列がある前提で話していきます。

カレンダーテーブルを作らなくてもグラフ自体は作れるけど、Power BIを使っていくなら絶対作っておいたほうがいいよ
【結論】コピペできるカレンダーテーブルはここをクリック
カレンダーテーブル = ADDCOLUMNS( CALENDARAUTO (),
"年", YEAR([Date])&"年",
"月", MONTH([Date])&"月",
"日", DAY([Date])&"日",
"曜日", FORMAT([Date],"aaa"),
"年&月", FORMAT([Date],"yyyy年MM月"),
"月&日", FORMAT([Date],"MM月dd日"),
"日(曜日)", FORMAT( [Date],"dd(aaa)"),
"年度", FORMAT(YEAR([Date]) - IF(MONTH([Date])<4,1,0),"0年度"),
"四半期", SWITCH(TRUE(),MONTH([Date])<4,"第4四半期",MONTH([Date])<7,"第1四半期",MONTH([Date])<10,"第2四半期","第3四半期"),
"上期下期", SWITCH(TRUE(),MONTH([Date])<4,"下期",MONTH([Date])<10,"上期","下期"),
"並替_月", MONTH([Date]),
"並替_曜日", WEEKDAY([Date], 1)
)
日付の取得範囲を決める
カレンダーテーブルを作るときに連続した日付データをどこからどこまで作るかを決めることができます。私は普段CALENDARAUTOばかり使っていたので、もいっかい調べなおしてみました。
CALENDAR関数で取得する日付範囲を指定する
CALENDAR関数を使えば、ここからここまでの連続した日付データを作ってくださいね~と細かく指定することができます。日付データが存在していない未来の日付も作りたいときはこれがいいかもしれません。
例えば、2025/4/1~2025/9/31までの範囲の連続した日付データを作りたいときは以下のように書きます。
Power BIの「新しいテーブル」をクリックして以下のDAX関数を入れてみてください。
カレンダー(CALENDAR) = CALENDAR(DATE(2025,4,1),DATE(2025,9,31))

日付を指定できますが、範囲が変わるときは手動で直さないといけないのでそこだけ注意ですね。
CALENDARAUTO関数で自動的に日付範囲を取得する
手入力でいちいち指定するのがめんどい場合はCALENDARAUTO関数がおすすめです。CALENDARAUTO関数はPower BIで読み込んでいるデータ内のすべての日付列を参照し、最も古い日付と最も新しい日付の間の連続した日付データを作成します。
DAX関数の書き方は以下です。超シンプルですね。
カレンダー(CALENDARAUTO) = CALENDARAUTO()

ちなみに、私が今操作しているPower BIには別テーブルに「売上日」という日付データが入っていて、売上日列に入っている一番古い日付が2025/1/1なので、その日から連続した日付データが作られています。
CALENDARAUTO関数はすべての日付列を参照するので、もし売上日以外に発送日とか入力日とかいう列があればそれらもすべてひっくるめて一番古い日付と一番新しい日付を引っ張ってきます。

なんかたまに1800年代とかすごく古い日付が出てくるときあるんだよね

日付列なんて複数あることも多いし、どこからその日付が出てきたのか混乱するときはある
CALENDAR関数で指定した列の日付範囲を動的に取得する
カレンダーテーブルを作ったら元々読み込んである日付列とリレーションを組むことになるのですが、基本的に一つのカレンダーテーブルに一つの日付列をリレーションします。つまり、一つのカレンダーテーブルを売上日と発送日に結び付けて使うことはしません。それに、データとしては入っているけど正直あまり使わない日付列があるときもあります。
CALENDARAUTO関数を使うと、たまにどっから出現したんだ?っていうような日付から作成されることがあります。そういう時にはこの方法を使うとよさそうです。
ということでCALENDAR関数を使って、どの日付列の日付範囲を取得するのか指定したいと思います。
カレンダー(CALENDAR_動的) = CALENDAR(
MIN('2025_売上'[売上日]),
MAX('2025_売上'[売上日])
)


「売上日」列の最も古い日付と最も新しい日付を取っているカレンダーだって分かりやすいね
個人的にはこれが一番使いやすそうで好きです。これからはこの書き方にしようかな…
可視化で使いやすいように表示形式を指定しよう
カレンダーテーブルを作る関数が分かったのはいいんですが、上で紹介した関数で作った日付列って年月日がくっついた2025/01/01の表示形式しかないんですよね。もう少し正確に言うと、グラフに入れたら下の画像みたいに「年」「四半期」「月」「日」で分解できるんですが、年は2025のみですし、四半期は4月始まりじゃなくて1月が1Qですし、月なんて英語ですし(英語できないので)正直使いづらいです。


ちなみに、yyyy/MM/ddで表示したいときはDateの右横の▽を押して「日付の階層」ではなく「Date」を選んでみて

さて、グラフで表示するときは色々な区切りで見えたほうがいいですよね。ということでここからは以下の単位でグラフに表示できるようにしたいと思います。
・年(例:2025年)
・月(例:1月)
・日(例:1日)
・曜日(例:火)
・年&月(例:2025年1月)
・月&日(例:1月1日)
・日(曜日)(例:1日(月))
・年度(例:2025年度)
・四半期(例:1期)
・上期下期(例:上期)
カレンダーを作るための関数の下に、どんな表示をしたいのか関数を入れていきます。今回はとりあえずCALENDARAUTO関数を使っていきますが、ここからは列をどんどん追加していきたいのでADDCOLUMNSも使用します。
列の追加方法ですが、CALENDARAUTO関数を使うと自動的にできる「Date」列から使いたい部分だけ抜き出して、使いたい表示形式にするイメージです。

とりあえずやってみよ~
「20XX年」と表示できる列を作る
追加するDAX関数の意味としては「Date列の年に当たる部分を抜き出して20XX年と表示する」という感じです。
カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"年", YEAR([Date]) & "年"
)

最初の赤文字の”年”は列の名前になります。YEAR()はDate列から年の部分だけ抽出してくれます。「&”年”」を加えることで抽出した年の数字の後ろに「年」という文字をくっつけることができます。これで「2025」だけではなく「2025年」と表示させることができるようになりました。

この感じでどんどん作ろ
「X月」と表示できる列を作る
カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"月", MONTH([Date]) & "月"
)


上で作った年に加えて追加したい場合は年の後ろに「,」を入れてから追加するんだよ

このままグラフに使うと月の順番がごちゃごちゃになっちゃう

それはこの後の並び替えで解決しよう
「X日」と表示できる列を作る
カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"日", DAY([Date]) & "日"
)

曜日を表示できる列を作る
今度はFORMAT関数を使っていきます。Date列は日付列として入っているんですが、FORMAT関数を使うとこれを文字列として指定した形式に変換してくれます。aaaは曜日を表します。
カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"曜日", FORMAT([Date],"aaa")
)

カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"曜日", FORMAT([Date],"aaa曜日")
)

年&月 / 月&日 / 日(曜日)を表示できる列を作る
カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"年&月", FORMAT([Date],"yyyy年MM月")
)

カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"月&日", FORMAT([Date],"MM月dd日")
)

カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"日(曜日)", FORMAT( [Date],"dd(aaa)")
)

画像だとDDって書いちゃってるんですがddのほうがいいみたいです。
年度を表示できる列を作る
2025年の場合、2025年1月~3月は「2024年度」、2025年4月~2026年3月までは「2025年度」と表示できるようにしたいです。
カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"年度", FORMAT(YEAR([Date]) - IF(MONTH([Date])<4,1,0),"0年度")
)

カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"年度", "FY" & RIGHT(FORMAT(YEAR([Date]) - IF(MONTH([Date])<4,1,0),"0000"),2)
)

先にIFのところから解説します。IF()に書いてある内容は「もし月が4月未満(=1月~3月)だったら1、それ以外(=4月~12月)なら0を返す」という意味です。FORMATの後ろにある式は「(年)ー(IFの結果)」なので、もし月が4月未満だったら「2025 – 1 = 2024」、4月以降なら「2025 – 0 = 2025」が返ってきます。それに「年度」をくっつけるので、2024年度もしくは2025年度の文字列が列に入ってくるというわけです。
二つ目の式はRIGHT関数で、2025の右側2文字だけ抜き出して頭にFYって付けて~ってやっています。

年度表示できるの助かる~
四半期を表示できる列を作る
四半期はSWITCH関数を使ったやり方にしました。
カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"四半期", SWITCH(TRUE(),
MONTH([Date])<4,"第4四半期",
MONTH([Date])<7,"第1四半期",
MONTH([Date])<10,"第2四半期",
"第3四半期")
)

上から優先的に適用されます。<4(1月~3月)は第4四半期、<7(3月まではすでに第4四半期と指定してあるので残りの4月~6月)は第1四半期、<10(6月まではすでに第1四半期と指定してあるので残りの7月~9月)は第2四半期、最後に残った10月~12月は第3四半期っていう感じです。
上期下期を表示できる列を作る
四半期と同じ感じで作ってみます。
カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"上期下期", SWITCH(TRUE(),MONTH([Date])<4,"下期",MONTH([Date])<10,"上期","下期")
)

表示形式の並び替えを指定する
実は上で作った月の列をそのままグラフに使うと、月の順番がおかしくなってしまうんですよね。


文字列として認識されているから頭に1が付いている10月11月12月1月が先頭に並び替えされるんだよね

どうしたらいいの?

順番を指定できる列を用意する必要があるね
というわけで、1月~12月の順番で並ぶように、1月は「1」という並び替え用の列を作っていきたいと思います。
並び替え用の列を作ったら、並び替えの指示をPower BIにしなければなりませんが、その方法は一番下に記載するのでそっちも忘れずにご覧ください。
「月」の並び替えを指定するための列を作る
分かりやすいように、月の列と一緒に並び替え用の列を作成しています。並び替え用の列は整数列になっています。
これで1月は1番目という対応した列ができます。
カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"月", MONTH([Date])&"月",
"並替_月",MONTH([Date])
)

「曜日」の並び替えを指定するための列を作る
曜日も同じように並び順がおかしなことになっていると思うので、指定できる列を作っていきます。
日曜日から並べたい場合 ▼
カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"曜日", FORMAT([Date],"aaa"),
"並替_曜日", WEEKDAY([Date], 1)
)

月曜日から並べたい場合 ▼
カレンダーテーブル = ADDCOLUMNS(CALENDARAUTO(),
"曜日", FORMAT([Date],"aaa"),
"並替_曜日", WEEKDAY([Date], 2)
)


WEEKDAYの後ろに1か2を入れることで並び始めの曜日を指定できるんだね!
並び替え列を使って表示並び替えを指定する
上で並び替え用の列を作りましたが、列を作っただけだと並び替えできません。そこでテーブルビューに行ってこの列の順番で並び変えてねと教えてあげる必要があります。

今回は「月」と「曜日」の並び替え用の列を作ったのでそれの指定をしていきます。
まずは「月」列を選択してください。列を選択すると「列ツール」タブが出現します。その中に「列で並び替え」という項目があるのでクリックして「並替_月」を選択してください。


これで「月」の文字列を「並替_月」列で並び替えるっている指定ができたね

曜日も同じように指定してあげればいいんだね
並び替え指定前 ▼

並び替え指定後 ▼

リレーションも忘れずに!

Power Queryでのカレンダー作成はこちら