Excel Power Query List.Accumulateの使い方

Power Queryの繰り返し処理、諦めてませんか?

Power Queryでデータ加工をしていると、こんな場面に出会いませんか?

「このリストにある値の数だけ、列を追加したいんだけど…手動でやるの?😭」

私、最初にこの課題にぶつかったとき、手動で列を追加してました。リストに5個しか値がないならまだしも、10個、20個あったら…想像したくないですよね。

でも大丈夫!List.Accumulateという強力な関数があるんです。

最初の反応:「なにこれ、難しそう…」

正直に言います。私も最初にList.Accumulateを見たとき、「無理!」って思いました。

公式ドキュメント見ても、accumulatorとかseedとか、なんだか呪文みたいで…避けて通ろうかと思ったくらいです😅

でも実際に使ってみたら、「あっ、こういうことか!」って。今では「最初から知ってればよかった…」って思う関数の一つです。

List.Accumulateって何?

一言で言うと:
「リストの各値を使って、何かを繰り返し処理する関数」です。

料理で例えると:
– リスト = 使う材料のリスト(人参、玉ねぎ、じゃがいも)
– 処理 = それぞれの材料を切って鍋に入れる
– 結果 = 全部の材料が入ったカレー鍋✨

一つずつ材料を処理して、最終的に一つの結果を作る。それがList.Accumulateです!

基本の書き方を理解しよう

List.Accumulateは3つの材料が必要です:

List.Accumulate(list, seed, accumulator)

1. list (リスト)

繰り返し処理の対象

「何に対して処理を繰り返すか」を指定します。

{"A", "B", "C"}  // これらに対して処理を繰り返す

2. seed (シード/初期値)

処理の出発点

「どこから始めるか」を指定します。
テーブルを作るなら、最初のテーブルの形がこれ。

#table({"基本列"}, {{1}, {2}})  // 「基本列」という列を持つテーブルからスタート

3. accumulator (アキュムレーター/処理内容)

各値をどう処理するか

「リストの各値を使って何をするか」を指定します。

(現在の状態, リストの値) => どう変化させるか

実際のコード例で理解しよう!

例:リストの値を使って列を自動追加

やりたいこと:
{"A", "B"}というリストがあって、その値の数だけ列を増やしたい。

コード:

let
  list = {"A","B"},                                    // ①処理対象のリスト
  seed = #table({"テーブル"},{{1},{2}}),               // ②初期テーブル
  accumulator = (s,c) => Table.AddColumn(s, c, each c), // ③各値で列追加
  result = List.Accumulate(list, seed, accumulator)     // 実行!
in
  result

コードの読み解き方 🔍

①list =

「A」と「B」という2つの値に対して処理を繰り返します。

②seed = #table({“テーブル”},{{1},{2}})

最初の状態として、「テーブル」という列に1と2が入ったテーブルを用意。

テーブル
1
2

③accumulator = (s,c) => Table.AddColumn(s, c, each c)

ここが肝心!

  • s = 現在のテーブル(state)
  • c = リストから取ってきた値(current value)
  • Table.AddColumn(s, c, each c) = テーブルsに、列名cで、値もcの列を追加

具体的な動き:

1回目: リストから”A”を取得
– 現在のテーブルに「A」という列を追加
– 各行の値は”A”

テーブル A
1 A
2 A

2回目: リストから”B”を取得
– さらに「B」という列を追加
– 各行の値は”B”

テーブル A B
1 A B
2 A B

完成! ✨

実際にやってみよう!

ステップ1: Power Queryエディターを開く

  1. Excelで「データ」タブ → 「データの取得」
  2. 「その他のソースから」→「空のクエリ」を選択

ステップ2: コードをペースト

詳細エディターに上記のコードを貼り付けます。

ステップ3: 実行して確認!

「完了」をクリックすると…

List.Accumulate実行結果

テーブルに2つの列(AとB)が自動で追加されました!🎉

実際の使い道は?

使用例1:月ごとの列を自動生成

// 1月〜12月の列を自動で作る
let
  months = {"1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"},
  baseTable = #table({"商品"}, {{"商品A"}, {"商品B"}}),
  addMonthColumns = (tbl, month) => Table.AddColumn(tbl, month, each 0),
  result = List.Accumulate(months, baseTable, addMonthColumns)
in
  result

結果:商品ごとに1月〜12月の列が自動生成!

使用例2:カテゴリごとの集計列を追加

リストで定義されたカテゴリの数だけ、集計列を自動で追加できます。

よくある疑問 Q&A

Q1: seedって何を設定すればいい?

A: 「処理を始める前の初期状態」です。

  • テーブルに列を追加するなら → 最初のテーブル
  • 数値を合計するなら → 0
  • リストに追加するなら → 空のリスト{}

Q2: accumulatorの書き方がわからない

A: (現在, 次の値) => 変化後の形で書きます。

パターン例:

// テーブルに列追加
(tbl, colName) => Table.AddColumn(tbl, colName, ...)

// 数値を足していく
(sum, num) => sum + num

// リストに追加
(list, item) => list & {item}

Q3: エラーが出る…

A: よくあるエラー:

「Expression.Error」
→ accumulatorの関数が間違ってます。(s, c) =>の形になってるか確認!

「型が合わない」エラー
→ seedの型とaccumulatorの戻り値の型が合ってるか確認しましょう。

まとめ:List.Accumulateを使うと…

繰り返し作業が自動化できる
リストの値の数だけ、自動で処理が走る!

コードが短く、メンテが楽
手動で10列追加するコードより、List.Accumulateで自動化する方がスッキリ。

柔軟性が高い
リストの中身を変えるだけで、処理内容が自動で変わる。

最後に

List.Accumulate、最初は難しそうに見えますよね。私もそうでした😊

でも一度使ってみると、「あ、こういうことか!」って腑に落ちる瞬間が来ます。

ポイントは:
1. list – 何に対して繰り返すか
2. seed – どこから始めるか
3. accumulator – 各値で何をするか

この3つを押さえれば大丈夫!

まずは今日の例をそのまま試してみてください。
動いたら、リストの値を変えたり、処理内容を変えたりして遊んでみましょう。

「こういう使い方できないかな?」って疑問があったら、コメントで教えてくださいね!
一緒に考えましょう✨


参考リンク:
M言語公式ドキュメント – List.Accumulate

関連記事:
– Power Queryの基本 (coming soon!)
– M言語の関数一覧 (coming soon!)

次のステップ:
List.Accumulateが使えるようになったら、List.Generate にも挑戦してみましょう!もっと複雑な繰り返し処理ができるようになりますよ🎯

コメント

タイトルとURLをコピーしました