【M言語は難しくない】今回は、M関数を使用して連続した日付を作成する方法を解説します。2つ連続した日付を作成する方法を解説した後に、ダイナミックに日付を作成する方法を解説します。下のGIF画像のように、ある表の最小・最大日と連動させて、連続した日付が入った表を作成する方法を解説します。
上のGIF画像では、画像左の最大値を「2021/04/04」から「2021/04/06」で入力し直しています
その後、「更新処理」を行います
すると、画像右にある表の最終行が「2021/04/04」から「2021/04/06」に拡大します
この回は、過去の記事で解説した波括弧:{}を使用した「連続データを作成する技術」をフルに活用します!
目次
今回のポイント
今回も前述のように、過去記事で紹介した括弧の使い方が最大のポイントになります
後、これまで紹介してこなかったM関数も使用します
括弧の使い方
過去記事にて、1から10まで連続した数字を空のクエリに作成する方法を解説しました
今回はこの波括弧 / {}(最小..最大)から作成される連続データを使用して、連続した日付を作成します
フィルタリング
日付が入ったテーブルは下の図のようにフィルタをかけて、最小日と最大日は特定できるようにしておきあす
上の図のようにフィルタリングを行うと、下の図のようなテーブルができます
1行目が最小日、2行目が最大日です
こちらは、連続した日付を作成するときに使用します
M関数
今回使用するM関数はこちらです
事前に概要を紹介しておきます
#date
「年、月、日」から日付を作成します
#duration
「日、時間、分、秒」から期間値を作成します
List.Dates
「開始日、リスト個数、増分」から日付のリストを作成します
#dateと#durationと組み合わせて作成します
Number.From
値を数値型式にして返します
今回使用するデータ
今回は、記事の冒頭でも前述したように、まずは2つ連続した日付を作成する方法を解説します
その後、次の画像のデータを使用します
上の画像の「最小と最大の日付」を変えたら、連動して連続した日付を入れた表が作成されるようにします
M言語に慣れる13回目_演習
連続した日付の作成
これから2つ作成方法を解説しますが、どちらもまずは空のクエリから作成します
エクセル画面の上にある「データタブ」➡「データの取得」の順でクリックします
その後、下の画像にて黄色に印をつけた箇所を上から順にクリックします
そして、下の画像にある「空のクエリ」をクリックします
するとエディタが開き、空のクエリが立ち上がります
M関数 / List.Datesで作成する方法
既に今回のポイントで解説済みの内容になります
前述の通り、#dateと#durationを組み合わせて作成します
では、以下の条件で連続データを作成してみます
・開始日 / 2021/05/01
・個数 / 5個
・増分 / 7日
関数は次のように記述します
=List.Dates(#date(2021,5,1),5,#duration(7,0,0,0))
上の関数を数式バーに入力すると、下のGIF画像のように2021年5月1日から始まる日付リストが「7日」おきに「5個」作成されます
波括弧 / {} を使用して作成する方法
前述の通り、波括弧 / {}(最小..最大)から作成された連番を利用して連続した日付を作成します
この方法の場合には、作成した連番を一旦テーブル形式に変換した後、日付形式に直すのがポイントです
ちなみに、エディタ画面からも「空クエリ」は作成できます
まず、下の画像のようにエディタ画面の左で右クリックします
その後に、上の画像の「新しいクエリ」右横にある▶マークをクリックします
すると「空のクエリ」を選択する画面がでます
さて、話を連続データの作成に戻します
まずは、次のように数式バーに入力して連続データを作成します
= {Number.From(#date(2021,4,1))..Number.From(#date(2021,4,30))}
数値型式を返す「Number.From関数」の中は、「#date関数」にて日付を作成しています
上の数式を入力した段階では、ただの「値」の羅列になっています
こちらはあくまで「リスト型式」なので、このままだと日付形式に変換できません
ですので、こちらをテーブルに変換します
すると次の画面のようになり、データ形式を指定できるようになります
こちらの画面で列名と合わせて、データ形式を直します
これで、連続した日付が作成できました
こちらのクエリは、後で表と連動させますので、クエリ名を「連続日付2」として保存します
この連続したデータを作成する方法の「2つ目」として解説した方法は、次の数式を空のクエリの数式バーに入力するところからはじめました
={最小日..最大日}
この数式は表と連動させてダイナミックに連続データを作成する際、応用して活用します
ダイナミックに連続データを作成
過去の記事にて、ダミーの値でフィルタリングしてステップを作成した後に、ダミーの値を後から置き換えて、「ダイナミックフィルタリング」を行いました
上の画像の赤印は一度、フィルターした値を「最高値」として算出した値/変数で置き換えています
今回は全く違うアプローチを行います
日付の最小値と最大値でフィルタリングした内容を、前述の「波括弧 / {} を使用して作成する方法」で作成した数式の中に組み込みます
では、日付の「最小値」と「最大値」の2つの値でフィルタリングを行いますので、まずは下の画像の元のデータをエディタで開きます
エディタを開いたら、まずはクエリを参照して別クエリ「担当者」を作成しておきます
こちらは、後でまたクエリの結合に使用します
そして、フィルタリングを行う前に「担当者」の列は削除します
「日付」の列だけ残したところで、フィルタリングを行います
フィルタリングは「カスタムフィルター」という仕組みを利用して、2つの値を「OR条件/また」にて指定できるようにします
上のGIF画像では、「日付フィルター」を選択した後に、新たに表示された列を最後までスクロールして「カスタムフィルター」を選択しています
こちらのカスタムフィルターの画面で「また」を選択した上で、2つの値を次の画像のように「最も早い」「最も遅い」と指定します
すると日付の「最小値」と「最大値」の2行が出力されます
これで日付の「最小値」と「最大値」のフィルタリングは終了です
一旦、クエリの名前 / 最小最大_日付を設定して「接続のみ」にて読込ます
次に、前述の連続データを作成したクエリを複製します
複製したクエリの「ソース」ステップを選択すると、数式バーには連続データを作成するための「最小値」と「最大値」が指定されています
上の画像の「最小値」と「最大値」を、1つ前で作成したクエリ「 最小最大_日付 」の1行目/最小値と2行目/最大値に置き換えます
置き換える際には、角括弧 / []と波括弧 / {}を組み合わせて「クエリ名(テーブル名)[列名]{行位置}」の数式で指定します
上の画像だと分かりずらいと思いますので、以下に数式バーの部分は記述し直します
= {Number.From(最小最大_日付[日付]{0})..
Number.From(最小最大_日付[日付]{1})}
上の式で最小最大_日付クエリの1行目と2行目をそれぞれ、0と1で表現しているのは、Power Queryが「0」をベースとしているからです
これで、表の値(元データ)に応じて連続データが最終ステップに作成されています
更にここから元データのクエリ「担当者」と日付をキーにして結合を行い、「担当者」の列を追加します
こちらは上の画像のように、「空欄/null」があるので、フィル作業を行います
変換タブの「フィル」にて下の空欄を上の値で埋めます
これで完成です
元の表と最小値と最大値を連動する仕組みも組み込まれています
<まとめ>
今回は、M関数を数種類使用して連続する日付データを作成しました
日付データを作成する方法は2種類解説しました
1つ目は、List.Dates関数を使用する方法です
こちらは、List.Dates関数の中に2つの関数を更に組み込みました
2つ目は、波括弧 / {}を使用して連続データを作成する方法です
こちらは、括弧の中に最小の日付と最大の日付を指定しました
= {Number.From(#date(2021,4,1))..Number.From(#date(2021,4,30))}
こちらの仕組みは、表をもとにしてダイナミックに連続データを作成する仕組みに応用しました
元の表をエディタで開き、日付の最小値と最大値をフィルタリングして、上の数式に組み込みました
= {Number.From(最小最大_日付[日付]{0})..
Number.From(最小最大_日付[日付]{1})}
この組み込み処理により、ダイナミックな連続データが作成できるようになりました
今回はM関数が多く出て来たので、骨のある内容だったと思いますが、M関数の便利さも紹介できたと思います
ぜひ、実際に手を動かして、M関数の便利さに触れてみてください
記事を最後までお読み下さり、誠にありがとうございます
参考までに今回使用したファイルを添付します
コメントを残す