タグ別アーカイブ: Power Query
上級編1回目サンプルPDFファイル
中級編9回目サンプル
クエリの関数化事例~複数シートを一括で編集する
【一度作成したクエリを関数化して複数シートに使いまわし、結果的に一括処理する】
エクセルファイル内で複数シートに分かれていると、一括処理ができなくて困ることがあります
一番、困るのは各シートにヘッダーデータがあるようなケースです

このような場合はまずは1シートを処理するクエリを作成します
そして、そのクエリを関数化します
関数化するということは、Y=2X+1のような式で表せるということです
こちらのXには複数シート名を入れて使いまわせるようにします
SUM関数/SUM()では()の中身を変えれば、それぞれの合計が出力されます
今回は、()の中身が次から次へと格納されて、連続的に出力されるイメージになります
使用データ
前述のように各シートにはヘッダーデータがあります
その下に欲しい一括処理したいデータがあります

そして、上記のようなシートがファイル内に複数あります

各シートの開始行などは一致している前提です

上の画像は東京のシートですが、次の画像は大阪のシートです

関数化するクエリの作成
まずは1シートを処理するクエリを作成します
こちらのクエリを前述のように関数化します
今回はテーブル化からはじめず、ファイルからデータを取得します

指定するファイルは「今処理しているファイル」です
ファイルを指定したら、ナビゲーター画面が開きます

こちらでは1つのシートを指定し「データの変換」をクリックします
ここでクエリは複製しておきます(1つは関数を作成した後に、関数を適用するクエリになります

下の画像がPower Queryエディタを開いた状態です

必要なのは11行目から下です
こちらは「行の削除」アクションで10行削除します

ここからもう1アクションあります

変換タブで「1行目をヘッダーとして使用」アクションを使用して、見出しを整えます

これで関数化のもとになるクエリは完成です
関数化
関数化は詳細エディタで行います

具体的に関数化する箇所は「可変の箇所」、シート名の箇所です

ここでソースステップの内容を確認しておきましょう

要はファイル内の複数シートを取得しています
ここからナビゲーション画面で1つのシートを選択しています
ですので、作成した関数を適用する場合は「東京、大阪、名古屋」と関数化した箇所に連続して格納されるようにすればいいのです
では実際に記号Xを埋め込んでみましょう

(X)=>はXを記号として使用するという合図になります⇒詳細
ここまで行うとクエリが関数に変ります

関数は「myFunction」と名前を変えておきましょう

ここでパラメーターに「名古屋」と入れてみましょう

これで名古屋のシートデータが変換されて出力されます
関数の適用
ここで関数の複製元のクエリを選択し直します

その後は、適用したステップでソースデータを残して後は全て削除します

ここから列の追加タブで作成済みの関数を呼び出します

関数のXに入るのは「Item」になります

これでXに東京、大阪、名古屋と値が格納され、クエリが作成されていくことになります

結果、次の画像のようになります

ここからmyFunctionを展開すれば完成です

次の画像が展開した後のものです

<まとめ>
今回は、ヘッダー行がある複数シートを、クエリの関数化を使用して一括処理しました
クエリの関数化のポイントは可変の箇所を見つけることです
今回は、1度作成したクエリから可変の箇所を見つけました
そうはいっても、なかなか最初は慣れないかと思いますが、次第にツボが見えてくると思います
もう少し詳しく「クエリの関数化」について知りたいという方はぜひUdemy講座(動画)もご利用ください
期間限定で「4,800⇒1,200」の割引クーポンが利用できます
Power Queryならではのカレンダーテーブル活用~経過営業日の算出
【M言語独自のリスト作成を通じて、経過営業日を自由自在に算出する】
エクセルのワークシートには経過営業日を計算してくれる便利な関数があります。Power Queryではその手の関数はないですが、独自のカレンダーテーブル活用により自由自在に計算方法をカスタマイズできます

上の画像のような連続した値を作成する方法は過去の記事でも紹介しています
今回の記事ではこういったPower Query・M言語独自のテクニックが詰まった内容になっています
ポイント
今回のポイントは関数などで一律に計算するのではなく、日付を並べたうえで計算を行います

上の画像のように該当する日付を並べて、曜日に変換し「0,1」を並べます
そして、最後に「0,1」の列を合計します
この合計が経過営業日です
ですので、後から条件式の追加などが容易です
上の画像では祝日が考慮されていませんが、祝日の考慮はもちろん、その他の条件の考慮も容易に行えます
カレンダーテーブルの作成
カレンダーテーブルの作成はリスト作成⇒テーブルに変換の流れで作成します
「..」を使用すると連続した値のリストが作成できます

この仕組みを利用して、他クエリからまずは連続した日付のリストを作成します
他のクエリとは下の画像のような2つの日付を記したクエリになります

こちらのクエリの各列の1行目を参照して、空のクエリでリストを作成します
*{0}で1行目を参照します

ここではNumber.From関数で一旦数値に変換しています
= {Number.From(期間単数[期間A]{0})..Number.From(期間単数[期間B]{0})}
連続した数値を作成した後は、テーブルに変換します

後は日付形式に変換を行います

曜日への変換
曜日への変換は「Date.DayOfWeekName関数」を使用します

曜日だけではなく、祝日も考慮が必要です
祝日については別途テーブルを作成しておく必要があります

こちらは作成した空のクエリのマージします

そして、曜日との集約を「条件列」で行います

これで「0,.1」を並べる列を作成する準備ができました

0,1列の作成及び合計
0,1を並べる列はカスタム列作成画面でif関数を使用して作成します

これで0,1が並ぶ列/Digitを作成することができました

尚、上記の式ですと「起算日の曜日」が休日でない場合には自動的に計算に含まれています
それでは本題に戻りますが、最後にこちらのDigit列を対象にして、変換タブから合計処理を行います

これで経過営業日を算出できました

ちなみに祝日クエリをマージした時に、日付の並びが変わってしまいますので、並び替えを行っておくと計算過程が分かりやすいです

計算方法の調整
起算日には曜日・祝日に関わらず計算に入れる(0を立てる)、もしくは計算に入れないなどの調整にはインデックス列を使用します

上記の画像のように、起算日の行になるのは「インデックス列」の1になります
ですので、if式をインデックスが1の時には値が0(もしくは1)になるように修正します

逆に計算の終点の日を曜日・祝日に関わらずに計算に入れる場合にはLis.Max関数を使用します

複数行計算する場合
複数行にて計算する場合には、カスタム関数を使用します
前述のクエリの詳細エディタを開き、コードに記号を埋め込んで関数化します
={Number.From(myDate[起算日A]{0})..Number.From(myDate[起算日B]{0})}
⇒{Number.From(A)..Number.From(B)},

上の画像のAとBの記号が、下の画像の各列と対応します

そして、記号を埋め込んで完了ボタンを押すと、関数は完成です

こちらの関数を複数行あるクエリで呼び出します

この際、前述の記号に各該当列を割り当てます

これで、各行に関数が割り当てられます

後は関数で作成した列を展開して終了です
<まとめ>
今回は経過営業日をPower Query独自のカレンダーテーブルにより算出する方法を解説しました
もしかしたら、上記の内容で「この画像の起算日の計算式は?」という内容もあるかもしれませんが、ご容赦頂ければと思います
今回の方法ですと、ワークシート関数で一律に計算するより、分かりやすく、カスタマイズしやすいです

ぜひ、手を動かしながら試してみて頂きたいと存じます!
(無料期間終了)Udemy講座のリニューアル及び無料クーポンのプレゼントについて
昨年、Udemyにて「Power Queryのメニューにはない裏技ができる! M関数を学んで使えるようになる講座」をリリースしました。但し、多くの意見・指摘が寄せられたため今回、全面的に動画を撮り直しました
この機会に無料クーポンをこのブログ読者の皆さんにプレゼントしますので、ぜひレビュー投稿をお願い致します
頂いた意見・指摘
これまで多くの意見・厳しい御指摘が寄せられました
一方で、それだけこのテーマについては期待が高かったことを認識するとともに、期待を大きく裏切り大変申し訳ないことをしたと反省しております



これらの指摘・意見を参考にしてほぼすべての動画を撮り直しています
リニューアルポイント
動画の本数は以前と変わりませんが、動画は一から撮り直しました
動画によっては3倍の長さで撮り直しています
動画撮影にあたってはとにかく「間」を取りながら、動画のメリットをだせるように最新の注意を払いました
・作成するクエリの内容を丁寧に説明する
・前段でポイントとなる箇所を図で解説する
・操作動画は事前アナウンスをしながらゆっくりPC操作を行う
こちらがサンプル動画です
レビュー投稿をお願いします!
講座の内容としては他ではなかなか学べない「Power QueryのM言語、M関数を実践的に使うためのテクニック」が詰まった内容となっています
しかも、コードを一から書くわけではないのでそれほど難しくはありません
この講座が終了した時には、Power Queryの凄さや面白さを体感して頂ける内容だと自負しています
こちらが講座の無料クーポンとなります⇒お申込み
ぜひ、講座をご覧いただきレビュー投稿をお願いします
すぐにではないですが、頂いた意見は次に活かしていきます
尚、無料期間は突然終了する可能性がある点は予めご了承ください
グループ別に合計や平均に加えて標準偏差を抽出する方法
【数字は平均だけではよく分かりません。グループ化機能を更に深堀し、分析用の列に標準偏差も加えましょう!】
グループ化機能はとても便利です!グループ毎の集計を簡単に行いつつ、集計した数値を並べることができます

但し、グループ化の集計メニューには「標準偏差」が足りません
平均値を集計しても、バラツキが大きいのか、バラツキが小さいのかで平均値の解釈が違ってきます

例えば、上のグラフにはA~Cという3つのグループがあります
いずれも平均は150です
ただ明らかにグループBとグループCでは平均値150の解釈が違ってきますよね

今回はグループ化のラインナップに標準偏差をサクッと加える方法を解説します
グループ化の基本
グループ化を行う際、「基本」ではなく「詳細」を選択すれば複数の集計を行うことができます

今回は「合計」「人数」「平均」を集計した後に「すべての行」を集計に加え、後で集計結果を標準偏差に集計し直します

すべての行によるグループ化
「すべての行」のグループ化により、グループ別にテーブルが作成されます

この各テーブルが配置された列を使用してカスタム列を作成します

カスタム列内では「List.StandardDeviation」というM関数を使用します
使用できる列には「標準偏差」を集計する対象の「点数」の列がありません

ただ「標準偏差」の列は各テーブルの集合ですので、⇒標準偏差列⇒テーブル内の「点数」という流れで列を指定します

上の画像の「点数列」は手動で角括弧:[を使用して作成します
これでグループ別に標準偏差が集計されます

<まとめ>
今回はグループ別に標準偏差を集計する方法を解説しました
グループ化/すべての行とM関数の組み合わせにより、簡単に標準偏差を集計することができます
ワークシート関数と違い、グループ別に分けて集計する必要もなく、ピボットテーブルと違って直接テーブル化を行えるのでとても便利です
今後もPower Queryの便利術を発信していきます
パワークエリ記事一覧
M関数逆引き辞典はこちらから!
初級編
タイトル | 内容 |
---|---|
Power Queryで操作はどう変わる?~初級講座1回目 | パワークエリとはなにか?そのメリットをスマホに例えて解説します |
シートからデータ取得~ 初級講座2回目~ | 別シートのデータをテーブル化して取得する方法を解説します |
ファイルからデータ取得 初級講座3回目 | 別ファイルのデータをテーブル化して取得する方法を解説します |
フォルダから複数ファイルデータを一括取得~初級講座4回目 | フォルダ内にある複数のファイルからデータをまとめて取得する方法を解説します |

中級編
タイトル | 内容 |
---|---|
複数データの組み合わせ/クエリのマージ~中級編1回目~ | クエリのマージ技術の概要について解説します |
クエリのマージ/項目追加~中級編2回目~ | 複数のクエリをマージする方法について、実際のデータで解説します |
クエリのマージ/計算処理~中級編3回目~ | マージした項目を活用して計算処理を行う方法を解説します |
クエリの追加作成~中級編4回目~ | 同じ項目のクエリを追加して結合する方法を解説します |
クエリの追加・結合~中級編5回目~ | クエリの追加をピボットテーブルと連携して行う方法を解説します |
ピボット解除/縦横並びの変換処理~中級編6回目 | 縦横の使いにくいデータを、使いやすい並びに変える方法を解説します |
セル分割他・変換処理~中級編7回目 | 複数のデータが1つのセルに入っている場合に分割する方法を解説します |
セル分割他・変換処理2~中級編8回目 | 前回の内容を使いやすい形式にして出力する方法を解説します |
エディター内のやり直し操作~中級編9回目~ | ワークシートにおけるCtrl+Zに相当する処理の方法を解説します |
変換した列の追加~中級編10回目~ | 連番、条件列(IF関数に相当)及び列削除・移動他を解説します |
グループ化1~中級編11回目~ | データを階層化して集計する方法を解説します |
複数条件でグループ化~中級編12回目~ | データを複数の条件で階層化する方法を解説します |
上級編
タイトル | 内容 |
---|---|
行削除とヘッダー行の調整~上級編1回目~ | 見出し行/ヘッダーがおかしい場合の対処方法を解説します |
セル結合により見出しが2行の表をデータ活用1~上級編2回目~ | セル結合された使いにくいデータを使いやすくする方法を解説します |
セル結合により見出しが2行の表をデータ活用2~上級編3回目~ | セル結合された使いにくいデータを使いやすくする方法を解説します |
各種集計/合計から四捨五入まで~上級編4回 | 四則演算の計算から四捨五入まで、様様な集計方法を解説します |
エラー修正_処理ステップエラー~上級編5回目 | ファイル保存先変更などに伴うエラーの対処方法について解説します |
途中のステップを削除した場合のエラー修正処理~上級編6回目 | 途中のステップを削除した場合のエラー対処処理について解説します |
エラー修正_データ自体のエラー~上級編7回目 | データ自体がエラーになっている場合の対処方法について解説します |
カスタム関数を自身で登録して使い回す~上級編8回目 | ユーザーが独自で作成するカスタム関数の作成方法を事解説します |
カスタム関数を自身で登録して使い回す2~上級編9回目 | 作成したカスタム関数を呼び出して活用する方法を解説します |
IF式を組み合わせて列作成~上級編10回目 | 条件付きカスタム列を作成する方法を解説します |
「例からの列」にて変換パターン自作~上級11回目~ | 入力した変換例を汲み取って変換を行う方法を解説します |
「 例からの列」による桁数が規則列への対応~上級12回目~ | 「例からの列」による変換方法の応用方法を解説します |
エディタを開かずにソース変更処理~上級13回 | 「パラメーター」機能を使用してデータソースを変更する方法を解説します |
シート上からデータソースを変更する方法~上級編14回目 | シート上の入力を変更するだけでデータソースを変更する処理を解説します |
セルの値を変更するだけで読み込みを変更する方法~上級編15回 | セルの変更内容をクエリに組み入れて、クエリの内容を変更できるようにする方法を解説します |
クエリのコピー・バックアップ・削除他~上級編16回 | クエリのコピーやバックアップ及び削除、その他グループ化などの方法を解説します |
文字列の抽出~上級編17回 | RIGHT関数やLEFT関数、MID関数に相当する内容に加え、特定の文字列を抽出する裏技を解説します |
文字列の追加、置換~上級編18回 | 前回の特定の文字列の抽出に加え、文字列の追加や置換方法について解説します |
エラー発生の予防/列のデータ形式変更と削除について~上級19回~ | エディタ内の操作のちょっとした工夫で、エラー発生を予防する方法を解説します |
M言語編
タイトル | 内容 | 使用するM関数 |
---|---|---|
M言語に慣れる_1回目~コード構造の把握~ | Mコードの基礎的なルール/文字の色、大文字の区別、ステップの参照について解説します | List.Average/平均値・計算 |
M言語に慣れる_2回目~カスタム列~ | カスタム列・作成画面でM関数を使用して新たな列を作成する方法を解説します | Text.From/文字列への変換 |
M言語に慣れる_3回目~ダイナミックフィルタリング~ | セルの変更内容をフィルタイングの内容に反映する方法を解説します | List.Max/最大値の計算 |
M言語に慣れる_4回目~特殊テンプレート作成~ | 2つのクエリを組み合わせて、1担当者に対して複数の勤務日がある表を作成する方法を解説します | – |
M言語に慣れる_5回目~M関数を検索する方法~ | ワークシート内の関数のように、M関数を参照する方法を解説します | Text.PositionOf/特定の文字列の位置抽出 |
M言語に慣れる_6回目~3種類の括弧~ | 丸括弧と角括弧そして波括弧とテーブル、リスト、レコードの関係を解説します | – |
M言語に慣れる_7回目~空のクエリからテーブル作成~ | 空のクエリから、リストやレコード、テーブルを作成する方法解説します | #table/テーブル作成、Table.RenameColumns/列名変更 |
M言語に慣れる_8回目~eachを使いこなしてM関数作成~ | 数式バーに良く出てくる「each」の用法について解説します | Table.SelectRows/テーブルから特定の行を抽出、List.Select/リストから特定の値を抽出 |
M言語に慣れる_9回目~複数シートをコード1行で結合~ | ファイル内のシートからデータをまとめるクエリを作成する方法を解説します | Excel.CurrentWorkbook/ワークブックの内容を一括抽出 |
M言語に慣れる_10回目~グループ毎に連番作成~ | 「グループ化の操作/全ての行」を活用してグループ毎に連番を作成する方法を解説します | Table.AddIndexColumn/連番作成 |
M言語に慣れる 11回目~前行を参照して計算~ | 連番と波括弧:{}を組み合わせて活用して前行を参照する方法を解説します | – |
M言語に慣れる~12回目例外処理 | エラーが発生した際の対処処理を行う方法を解説しています | – |
M言語に慣れる13回~ダイナミックに連続した日付作成 | ワークシート内にある連続性のない日付から、連続する日付を作成した後、他データも紐づける方法を解説します | #date/「年、月、日」から日付を作成、#duration/「日、時間、分、秒」から期間値を作成します、List.Dates/「開始日、リスト個数、増分」から日付のリストを作成、Number.From/値を数値型式にして返します |
M言語に慣れる14回目~複数行を1つのセルにまとめる | グループ毎のテーブルを作成後、グループ別に1つのセルにテーブルの内容をまとめる方法を解説します | – |
M言語に慣れる15回目~TEXT関数/文字列関数 | テキスト関数の事例について解説します | Text.Contains/文字列の有無を判定、Text.Replace/文字列の置換 |
M言語に慣れる16回目~List関数 | リスト関数の事例について解説します | List.Max/最大値の計算 |
不規則に散らばっているデータを一括取得~M関数~ | 見出し行/ヘッダーがそれぞれ違うシートの内容を一括でまとめる方法を解説します | List.PositionOf/リストの中から特定文字列のリスト内位置を抽出、Table.RemoveFirstN/テーブルの先頭から指定行数を削除します、Table.PromoteHeaders/先頭行を新しい列見出しにします |
参照先バッファー化によるパフォーマンス向上~M関数~ | クエリのパフォーマンスを向上させる方法を解説します | Table.Buffer/参照テーブルのバッファー化 |
クエリの列名をダイナミックに変更する~M関数使用~ | 入れ子のリストを使用して、ワークシート上の内容でクエリの列名を変更する方法を解説します | Table.RenameColumns/列名変更、Table.ToColumns/テーブルからリスト(入れ子)作成 |
Power Queryエディタ上で複数条件付き合計処理~M関数使用 | M関数を組み合わせて「SUMIFS関数」と同様の計算をエディタ上で行う方法を解説します | Table.SelectRows/条件に合う行のみを抽出、List.Sum/合計値を抽出 |
指定した範囲の値を使用してフィルタリング | M関数を利用して、ワークシート上の表にある値に一致するもののみをフィルタリングする方法を解説します | List.Contains/リストに指定の値が入っているかを判定 |
複数リストを1対1の関係でうまく組み合わせる | 1行に複数の値を持つリストを複数組合わせる場合に、リスト間で1対1の関係になるようにします(例:8月2日/月、火、水➡8月2日/月) | Table.FromColumns/複数のリストからテーブルを作成 |
列名をダイナミックにしたピボット解除を行う | 新たな列を追加した場合でも、並べ替える列とそうでない列をコントロールできるようにする | Table.ColumnNames/列名リストを作成 |
PDF変換の応用~フォルダに入れた複数PDFから都合良くデータを切り取る方法 | 複数のPDFファイルから都合よい箇所だけデータを一括抽出できるようにする | Table.RemoveFirstN/指定行から上の行を削除 List.PositionOf/リストの中から特定文字列のリスト内位置を抽出 |
【POWER QUERY裏技】フォルダにある複数ファイルから特定のシートのみを可変で取得する方法 | フォルダ内のファイルを一括で取得する際に、パラメーターを使用して取得するシートを可変にします | Excel.Workbook/Excel ブックの内容を返します。 |
M関数を使用して、可変で出現する特定文字の下の行を切り捨てる | 特定文字列の下の行を可変で削除します | List.PositionOf/リストの中から特定文字列のリスト内位置を抽出 |
置き換えのIF式を簡略化する方法~リスト活用、列削除省略~ | メンテナンスが面倒なIF式を簡略化する方法を解説します | List.Contains/リストに特定の値が含まれていればTRUEを、そうでなければFALSEを返します |
POWER QUERYならではのカレンダーテーブル活用~経過営業日の算出 | M言語独自のリストの活用により、経過営業日の算出を自由自在に行えるようにします | Day.DayOfWeekName/曜日変換 |
クエリの関数化事例~複数シートを一括で編集する | ヘッダーデータがある複数シートを一括処理します |
分析編
タイトル | 内容 |
---|---|
POWER QUERYで手軽にABC分析 | パワークエリのM関数をうまく組み合わせれば、ABC分析も行うことができます |
RFM分析の「R」を集計する | 注文データから注文者(会員) 別に最終注文データを集計できるようにします |
RFM分析の「F」を集計する | 注文データから注文者(会員) 別に注文頻度を集計できるようにします |
RFM分析の「M」を集計してまとめる | 注文データから注文者(会員)別に注文金額を集計できるようにします |
コラム
タイトル | 内容 |
---|---|
【パワークエリ・チャレンジ】グループ別の小計と合計を表示する | 今回は本来は一律処理のPower Queryに行挿入を行います |
【パワークエリ・チャレンジ】列数が可変の表を組み合わせて計算する | List.Accumulate関数を他のM関数と組み合わせて使用します |
POWER QUERYをクラウドで活用する方法~POWER AUTOMATE使用~ | DataverseとPower Automateを組み合わせて、Power Queryをクラウドで活用します |
(続編)2つの表にてどの行が追加、削除されている? ⇒どの列が変更になっている? | ピボット解除と複合キーを活用して2つの表を比較しやすくします |
どの行が追加、削除されている?~結合の6種類~ | 結合の各種類をつかいこなせば、行の追加や行の削除の状況が一目でわかります |
【パワークエリ・チャレンジ】セル結合が行列にある表をテーブル形式に変換 | 行列双方向にセル結合がある表をテーブル形式に直します |
【パワークエリ・チャレンジ】行ではなく、列方向でフィルター・置き換えを行う方法 | 実は行列の入れ替えを行えば、列方向でのフィルター処理が可能です |
【パワークエリ・チャレンジ】1列のデータから複数列のテーブルデータを作成する | 余りの計算とピボット機能を組み合わせて1列のデータから複数列のテーブルデータを作成します |
【M言語実践】グループ別に累計を集計する方法 | グループ別に累計値を集計する方法を解説します |
【M言語実践】顧客の2回目のリピート率を分析する方法 | 通常のエクセル処理であれば相当煩雑な分析処理をM言語を活用して簡略化します |
M言語実践】グループ別にIDを設定 | グループ別に連番を採番した上で桁数を揃えてIDを作成します |
マスタデータの履歴管理を行う方法 | マスタデータが重複している場合に、日付が最新のもののみを表示する方法を解説します |
POWER QUERYのステップ数を減らす3つの工夫 | 「変更された型」のステップを減らすなどの工夫を解説します |
エディタからデータ入力してクエリ作成 | エディタ上で直接データを入力する方法を解説します |
【豆知識】どこの行が変わったかを調べる方法 | クエリのマージの仕方を工夫しつつ、条件列を組み合わせて、元データと修正があった箇所を特定する方法を解説します |
【豆知識】ピボット/縦縦並び⇒縦横に並び替え集計 | ピボット解除と別な方向で並べ替える方法を解説します |
【豆知識】ピポット解除時の空欄の扱い | グループ化 |
【分析作業用】大量データを1目で把握する | パワークエリの表示タブでは大量のデータを1目で分かるようにする為の工夫がありますので、そちらを解説します |
【分析作業用】グループ毎の平均と個の平均の差を自動集計する方法 | グループ化機能を2段階で行うことで、グループ単位の集計と個々の集計とを同時に行う方法を解説します |
クエリの複製、参照、そしてコピーとの違い~ | クエリを右クリックした時に出てくる「複製」「参照」「コピー」の違いについて解説します |
POWER QUERYって何?~エディタ上でのショートカットキー | エディタと他ファイルを並行して開く方法も含めて、操作を早く行う方法を解説します |
POWER QUERYって何??~時刻を曜日と日付に変換 | 時刻データを曜日や、日付データに変換する方法を解説します |
POWER QUERYって何??~経過時間を一括で計算する | ワークシート関数では、直接計算できない経過時間を簡単に計算する方法を解説しています |
POWER QUERYって何??~日付を月や四半期単位に変換~ | 日付データを簡単に月や四半期単位に変換する方法を解説します |
POWER QUERYって何??~読込んだデータに行番号追加~ | シートに読込んだクエリに行番号を追加する方法を解説します |
文字列を記号毎に分割し、行方向に展開する方法 | コンマなどの記号をもとにして文字列を分割しつつ、列方向ではなく、行方向に展開する方法を解説します |
POWER QUERYって何~既存クエリのステップを一括で削除する方法 | 適用してステップの欄で一気に複数ステップを整理する方法を解説します |
POWER QUERYって何?12~重複のないリストを一瞬で作成 | 一気に重複を排除したリストを作成する方法を解説します |
POWER QUERYって何??11~ユニークな数の集計~ | パワークエリならではの集計方法を1点だけ解説します |
POWER QUERYって何?~ピボット解除(縦横並び替え)と入れ替えの違い~ | 紛らわしい「ピボット解除」と「行列の入れ替え」の違いについて |
POWER QUERYって何??9~WEBページからデータ取得~ | Webページからエクセルデータを直接取得する方法を解説します |
POWER QUERYって何8???~PDFファイルをエクセルに変換~ | PDFファイルからエクセルデータを直接取得する方法を解説します |
POWER QUERYって何?~列の結合/複合キー活用~ | 複数の列を結合して複合キーを作成・活用する方法を解説します |
文字列から空白を取り除く_POWER QUERY | 文字列の前後や、文字列間に入り込んでいる空白を取り除く方法を解説します |
パワークエリエディターで行コピーを行う方法 | M関数を使用して行をコピーして複数にする方法を解説します |
MICROSOFT POWER QUERY~ACCESSとEXCEL連携~ | 特殊な方法でAccessと連携する方法を解説します |
POWER QUERYって???合計を計算する | グループ化による合計金額の計算方法を解説します |
POWER QUERYって何???連番作成 | 連番を作成する方法を解説します |
POWER QUERYって何??パワークエリの使用メリット | パワークエリを使うメリットの一つは履歴の管理が便利な点があげられます |
POWER QUERYって何???~ACCESSとエクセルの連携~ | 通常の方法にてAccessと連携する方法を解説します |
ピボット解除を複数列を軸にして実行する | 複数列を軸にして縦縦並びを縦横並びに変える方法を解説します |
IF 式の中でOR条件とAND条件を使う方法~POWER QUERY~ | ANDとORの指定を小文字で行うのがポイントです |
【パワークエリ・チャレンジ】グループ別の小計と合計を表示する
【通常は一律で処理するPower Queryですが、M関数を使えば小計と合計を列に追加・挿入することができます】
M関数をうまく活用することで、通常では考えられないような表を作成することができます

今回は上のGIF画像の左の表から、グループ別の小計と全体の合計を自動的に挿入します
上記の内容ではM関数を使用しますが、その前に大事なのはレコードやテーブルとは何か?どのように作成できるか?ということです
まずは、空のクエリからレコードとテーブルを作成してみます
レコードとテーブルの作成
レコード
レコードは角括弧:[]を使用することで空のクエリから作成することができます

テーブル
こちらはM関数:#tableを使用します

関数内では波括弧:{}を組み合わせて、列名と行の値を指定します
行の値は2重の波括弧:{{}}で指定する点にご注目ください
グループ別の小計の挿入
まずは、小計を行う単位:部門でグループ化を行います

操作は「すべての行」を指定します

すると数式バーの中身は次のようになっています
= Table.Group(ソース, {“部門”}, {{“ALL”, each _, type table [部門=text, 商品=text, 金額=number]}})

こちらの数式バーを修正する形で小計を追加します
まず,type tableから]の部分は列の形式を指定しているだけなので、今回は消去しておきます
消去すると次の形となります
= Table.Group(ソース, {“部門”}, {{“ALL”, each _}})
上記の数式の中で「each _」は各テーブルの中身・各行を借り受けしています
こちらに各小計を追加します
小計はテーブルを追加する形で行います
追加なので&からはじめます
= Table.Group(ソース, {“部門”}, {{“ALL”, each _ & }})
&に続くのは、前述のM関数#tableになります
= Table.Group(ソース, {“部門”}, {{“ALL”, each _ & #table(Table.ColumnNames(_),}})
今回は列名を指定するのに波括弧:{}を使用ぜず、Table.ColumnNames関数を使用します
Table.ColumnNames関数を使用することで、列名のリスト:{“部門”,”商品”,”金額”}を代用して指定します
次にテーブルの行の値①②③を指定し、#table関数の右括弧)を付け加えます
= Table.Group(ソース, {“部門”}, {{“ALL”, each _ & #table(Table.ColumnNames(_),{{①[部門]{0}&”小計”,②””,③List.Sum([金額])}})}})
①は部門列に対応します
{0}と指定することで、各テーブルの部門列の1行目を指定しつつ、”小計”を組み合わせることで「部門名+小計」の文字列を追加します
②は空欄を指定します
③は各テーブルの金額列の小計を指定します
ちなみに上記の数式の右から2番目の)が#table関数の)です
これで小計が追加できました

後は展開処理を行い、ステップ名を「mySubTotal」とします


合計の挿入
まず、ステップを追加します

次に追加したステップの数式にてレコードを追加します

尚、追加したレコードは後で呼び出して本来のテーブルの最後に追加します
レコードは前述のような形で次のように指定します

ステップ名はmyTotalとしておきます
ここからステップを再び追加します
次に最終処理として数式にTable.InsertRows関数を指定し、mySubTotalにmyTotalレコードを追加する形にします
Table.InsertRows関数の文法は次の通りとなります
=Table.InsertRows(①テーブル,②挿入行の位置,③追加するリスト)
今回の①はmySubTotalを指定します
②の挿入行の位置の指定は、TableRowCount関数を使用します
③はmyTotalを使用しますが、リスト化するために波括弧:{}でくるみます
= Table.InsertRows(mySubTotal,Table.RowCount(mySubTotal),{myTotal})
これで完成です

<まとめ>
今回はM関数を組み合わせて小計と合計を追加する方法を解説しました
Power Queryは列単位では一律に処理するので意外と感じられる方も多かったのではないでしょうか?
今回の内容はレコードとは何か?テーブルとは何か?そしてM関数とは何か?について学べる内容になっています
ぜひ手を動かして試してみてください
【パワークエリ・チャレンジ】列数が可変の表を組み合わせて計算する
【M関数を利用することで、数式の修正しなくても列数が可変の表を組み合わせて計算できるようにします】
値を別表で作成した上で計算を行うケースはよくあると思います

上の画像のケースでは、ボーナスを計算するのに基礎となる評点を作成した上で各ポイントをクリアしていれば「ポイント別」に加算点を計算しています
例えば、上の画像で言えば田中さんはポイント1と2をクリアしているので、80*9%と80*10%が加算点の合計点になります


上記では関数で計算していますが、問題はポイント数が変わった場合です
ポイント数が変わるたびに関数を変更しなくてはなりません
今回の記事では、いくつかのM関数を組み合わせたカスタム列を作成することで、計算の対象列数が可変でも計算が正しくできるようにします

使用するデータ
2つのテーブルを使用します

上の画像は「tableMatrix」です
こちらのテーブルを読み込んだクエリでカスタム列を作成します

上の画像は「tablePoint」です
こちらもカスタム列内で使用します
最終的に作成するカスタム列
今回の記事で最終的に作成するカスタム列は次の通りとなります

一見複雑ですが、List.Accumulate関数の箇所を紐解けば一気に理解のハードルが下がります
List.Accumulate関数
次のリスト:myAccumulateを基にしてList.Accumulate関数でリストの合計値を計算してみます

変数:state,currentが出てくるので一見ややこしいです

= List.Accumulate(myAccumulate,0,(state,current)=>(state+current))
文法は次の通りとなります
=List.Accumulate(リスト名,計算の最初の値,計算式)
話を分かりやすくするために、実際にList.Accumulate関数の計算履歴を追ってみたいと思います
計算式1 ⇒state:0(計算の最初の値)+current:1 ⇒1
計算式2 ⇒state:1(計算式1)+curernt:2 ⇒3
計算式2 ⇒state:3(計算式2)+current:3 ⇒6
つまり、リストの中身を変数を使用した計算式にて順次計算して累計処理をしているわけです
では、最終式のList.Accumulate関数の中身を実際に分解していきたいと思います
Table.ColumnNames関数

List.Accumulate関数の第一引数はステップ名:myPointです
myPointはTable.ColumNames関数で算出された値です
Table.ColumnNames関数はテーブルの列名をリスト化します
今回はポイントを設定したtablePointクエリの列名をリスト化します

関数の引数はリスト名を指定するだけでOKです

このリストがList.Accumulate関数の第一引数になるということは、計算式(state+current)内の変数:currentには「ポイント1・・・」などのテキストが繰り返し代入されるとこになります
どうやって計算が行われるのか?と不思議になる読者の方もいらっしゃると思います
この点は次のRecord.Field関数の箇所で解説します
Record.Field関数
Record.Field関数は特定のレコード中から特定のフィールドの値を抽出します

ちなみに、上の画像のtablePoint{0}*はtablePointテーブル/クエリの1行目のレコードになります

今度は第二引数を”ポイント2″を指定してみます

ポイント2のフィールドの値が抽出されます
List.Accumulate関数内では「ポイント1,2・」が繰り返し変数:currentに入ります
この変数:currentはRecord.Field関数の第二引数に設定され、数値が抽出されます
計算式の追跡
では、ここでList.Accumulate関数の計算式を追跡してみましょう
(state,current)=>①state+②Record.Field(tablePoint{0},current)*③Record.Field(_,current)*④[評点]
追跡するのは次の行/レコードです

計算式1:state/0(計算の最初の値)、current/”ポイント1″
①:0(計算の最初の値・第二引数)
②:Record.Field(tablePoint{0},”ポイント1″)=0.09
③:Record.Field(_,”ポイント”)=1
④:[評点]=80
①+②*③*④の計算式により7.2が算出されます
ここで注意点です
③の_はカスタム列を作成しているクエリのレコードをそのまま受け継ぎます
今回の場合は次の画像のレコードを受け継ぎます

計算式2:state/7.2(計算式1の値)、current/”ポイント2″
①:7.2
②:Record.Field(tablePoint{0},”ポイント2″)=0.1
③:Record.Field(_,”ポイント”)=1
④:[評点]=80
①+②*③*④の計算式により7.2+8=15.2が算出されます
計算式3:state/15.2(計算式2の値)、current/”ポイント3″
①:15.2
②:Record.Field(tablePoint{0},”ポイント3″)=0.12
③:Record.Field(_,”ポイント”)=0
④:[評点]=80
①+②*③*④の計算式により15.2+0=15.2が算出されます
一見、数式は複雑そうですが、List.Accumulate関数の変数の中身を紐解くとそれほど難しくないことが分かります
<まとめ>
今回は列数が可変の複数の表を組み合わせて計算する方法を解説しました
M関数を組み合わせることで、列数を可変にした計算が可能になります
最後に注意点です
let式を使用していますが、「,」を付ける位置を注意する必要があります

inの前、letの最後は「,」を付ける必要がありません
逆にそれ以外のステップは「,」が必要となります
参考までに使用したファイルを添付します