M言語に慣れる_4回目~特殊テンプレート作成~

【M言語は難しくない!】今回はカスタム列の隠れた裏技を使用して、特殊なテンプレートを作成します。今回は次の画像のように、「1対多」の関係の結合を「コードを1つ追加する」だけでサクッと行います

この処理は、従来であればVBAなどを覚えないとできない処理でした

M言語の仕組みを使えば、カスタム列・作成画面にて本当にサクッと作成できます

M言語の魅力のうちの一つといってもいい処理かもしれませんね!

今回作成するテンプレート

次の画像のように「担当者名のリスト」と「勤務日のリスト」から、各担当者別の勤務表を作成します

勤務表

上の画像の右側/E列とF列の表のように、担当者1人に対して、複数の勤務日を結合します

勤務表は、最終的には勤務日の右に「勤務開始時刻」や「勤務終了時刻」などを追加して使用するイメージです

*****Sponsered Link***** ************************

 解説は、シート上の「担当者名のリスト/」と「勤務日のリスト/」から次の2つのクエリを作成した上で、Power Queryエディタ(以降エディタ)で操作を開始するところからはじめます

・担当者名のリスト ➡ Namesクエリ

・勤務日のリスト ➡ TimeTable

次のファイルに含まれる演習用の元データは、クエリを作成する前の状態になっています

目次

今回のポイント

データ形式の事前調整

各行に日付テーブル作成

作成テーブルの展開

条件式の追加による調整

シートへの読み込み処理

<まとめ>

今回のポイント

今回の「カスタム列」では、前述の通り「1対多」の関係で結合を行います

次の画像のように「」ではなく「テーブル」を結合します

この「テーブル」を結合するの点が、今回の解説の最大のポイントになります

今回作成する内容とポイントを確認したところで、本格的な解説をはじめます

データ形式の事前調整

前述の通り、解説はエディタ内に2つのクエリがある状態から開始します

・担当者名/列のリスト ➡ Namesクエリ・勤務日/列のリスト ➡ TimeTable

過去の記事で解説した通り、「データの構造化」が行われた結果、データ形式の変更が必要な箇所が1点でてきますので、まずはそちらを変更します

下の画像の勤務日を「時刻」から「日時」に変更します

データ形式の変更は、上の画像の左上の黄色の印から行えます

上のGIF画像のように、日付を指定した後は次の画面が開きます

「現在のものを変換」をクリックすれば、下のGIF画像のように型式変更が行われます

各行に日付テーブル作成

では、「Names」クエリをエディタ画面の左から開いてください

次に「列の追加タブ」から「カスタム列」をクリックしてください

カスタム列の作成画面が下の画像のように開いたら、「新しい列名」を「勤務日」と指定してください

ところで、上の画像の右に「使用できる列」の欄があります

こちらには「担当者名」しか使用できる列がありません

挿入したいのは、勤務日であり、しかも担当者1人につき「1対多」の関係で結合する必要があります

ここからはM言語の出番です

M言語を書くといっても、実は、下の画像のようにクエリ名を指定するだけです

しかも、クエリ名を途中まで入力したところで、「入力補助」機能が働きます

クエリ名を指定したら、カスタム列作成画面の右下にあるOKボタンをクリックします

すると、記事の冒頭の「今回のポイント」で紹介した、テーブル結合が行われた画面になります

作成テーブルの展開

ここからは、中級編で解説したテーブル結合時の「展開処理」と一緒です

勤務日の右上のマークをクリックすれば、TimeTableクエリの内容が展開します

実際に上の画像のマークをクリックすると、実際には、下のGIF画像のように展開内容を指定する画面が開きます

こちらの画面では、展開項目として「勤務日」を指定するのはもちろんのこと、「元の列名をプレフィックスとして使用します」のチェックは外しておきます

こちらのチェックを外しておかないと「元のクエリの列名」も入ってしまいます

「元の列名をプレフィックスとして使用します」 のチェックを外したところで、画面下のOKボタンを押します

条件式の追加による調整

前述のテーブル展開を行った状態だと、下の画像のように、厳密には担当者名と勤務日が「1対多」の関係になっていません

上の画像の黄色に印をつけた箇所が、空欄になっていないといけません

こちらについては、黄色の箇所が空欄になる条件列を挿入します

勤務日は「2021/03/01」~「2021/03/03」の並びを繰り返しています

ですので、条件列は次の2つの内容になります

・勤務日が「2021/03/01」 ➡ 担当者名

・勤務日が「2021/03/01」以外 ➡ null(空欄)

では、上の2つの内容を、実際の条件列・作成画面に反映させます

条件列は、「列の追加」タブから「条件列」をクリックして作成画面を開きます

開いた作成画面に、前述2つの内容を設定していきます

まずは勤務日が「2021/03/01」の時の内容です

条件部分の「値」は「2021/03/01」を手入力します

あるいは、カレンダーから日付を選択することもできます

上の画像右の出力の箇所は、「列名」を選択できように、下の画像の「列の選択」を指定するのを忘れないようにしてください

次は 勤務日が「2021/03/01」以外の時の内容です

2点の内容を設定してOKボタンを押すと、エディタ内に新たな列が追加されています

シートへの読み込み処理

エクセルシートに読込む際には元の担当者名の列は削除し、追加した条件列を一番左に移動しておきましょう!

また、上の画像の「勤務日.1」の列は列名を「勤務日」にし、データ形式も「任意」/下画面から「日付形式」/下画面に変更しておきましょう!

では、実際にエクセルシートに読み込み処理を行います

<まとめ>

 今回は、M言語を1つ入力するだけで特殊なテンプレートを作成する方法について解説を行いました

 カスタム列の作成画面にて、クエリ名/TimeTableを指定するだけで「1対多」の関係によるデータ結合が行えました

画像に alt 属性が指定されていません。ファイル名: image-12.png

その後は、通常のデータ結合時と同じように結合内容を展開しました

画像に alt 属性が指定されていません。ファイル名: Translate-TO-Table2.gif

今回は、上記の仕組みを使用して「担当者名」と「勤務日」のリストから勤務表を作成しましたが、他にも活用できる場面があるはずです

何より、M言語の威力を肌で感じて頂けたら幸いです

今回の解説は以上です!!

長文に最後までお付き合い頂き、誠にありがとうございました

参考までに今回使用したファイルを添付します

次回は、M関数の参照機能について解説します

にほんブログ村 資格ブログ ビジネススキルへ
にほんブログ村 IT技術ブログ VBAへ


にほんブログ村

*****Sponsered Link***** ************************

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です