« 2025年10月 | トップページ | 2025年12月 »

2025年11月

Excelで該当する数値をカンマ区切りで連結、連続する数値は始まりと終わりをハイフンでつなぐ

前置き

Yahoo!知恵袋に次のような質問がありました。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12321961622

taihenda****さんのVBAとpietaさんのワークシート式の回答が付いています。
このLAMBDAを使うワークシート式の回答が理解できなかったので、Copilotに解説してもらいました。
また、Power Queryとメジャーの式もCopilotに作ってもらいました。
本記事では、ワークシート式、Power Query、メジャーを紹介します。VBA、ワークシート式、Power Query、メジャー(DAX)を比較してみてください。

1. 入力

左上の氏名のセルアドレスはA1です。合算は空欄です。

氏名 AMPM 合算 1 2 3 4 5 6 7 省略 29 30 31
斎藤隆 AM   1 1       1          
  PM       1 1 1         1  
佐々木裕 AM   2 1             1 1  
  PM       1   1           1

2. 出力

氏名 AMPM 合算 1 2 3 4 5 6 7 省略 29 30 31
斎藤隆 AM AM/1-2,6 1 1       1          
  PM PM/3-5,30     1 1 1         1  
佐々木裕 AM AM/2-3,30-31   2 1             1 1
  PM PM/3,5,31     1   1           1

合算を出力します。Power Queryとメジャーは、合算だけ表示し、右の日は表示しないことにします。

3. ワークシート式

手順

セルアドレスC2に次の式を入力します。そして、C2をC3:C5にコピーします。
251106join1

=LET(
数列, FILTER(SEQUENCE(, 31), D2:AH2),
結合, "," & TEXTJOIN(",",, 数列),
連結, REDUCE(
結合,
数列,
LAMBDA(x,y,
SUBSTITUTE(
SUBSTITUTE(
x,
"-" & y-1 & ",",
"-"
),
"," & y-1 & ",",
"," & y-1 & "-"
)
)
),
SUBSTITUTE(連結, ",", B2 & "/", 1)
)

式の解説

式の全体構造

=LET(
数列, ...,
結合, ...,
連結, ...,
最終出力, ...
)

LET関数で中間変数を定義しながら、最終的に整形された文字列を返しています。

🔢 ステップ1:日付列から値のある列番号を抽出

数列, FILTER(SEQUENCE(, 31), D2:AH2)

SEQUENCE(, 31) → {1,2,3,...,31} の横ベクトルを生成。
FILTER(..., D2:AH2) → 対応するセル(D2:AH2)に値がある列だけを抽出。
例:D2=1, E2=1, F2=空, G2=空, H2=1 → {1,2,5}

🔗 ステップ2:数列をカンマで連結

結合, "," & TEXTJOIN(",",, 数列)

TEXTJOIN(",",, 数列) → "1,2,6" のような文字列に変換。
先頭にカンマを追加 → ",1,2,6"(後の置換処理のため)

🔁 ステップ3:連続する数値を範囲に変換

連結, REDUCE(
結合,
数列,
LAMBDA(x,y,
SUBSTITUTE(
SUBSTITUTE(x, "-" & y-1 & ",", "-"),
"," & y-1 & ",", "," & y-1 & "-"
)
)
)

この部分が連続範囲の検出と変換のコアロジックです。
仕組み:
REDUCEで数列を1つずつ処理。
直前の数(y-1)が "-,y," または ",y," の形で存在する場合、それを "-,y" や "y-" に置換。
これにより、たとえば ",1,2,3,6" → ",1-3,6" に変換されます。

🔁 REDUCE の構造

REDUCE(
    初期値(結合文字列),
    数列,
    LAMBDA(x, y, ...置換処理...)
)

🧪 REDUCEの1ステップごとの変化の例

🔹 初期値

x = ",1,2,3,6,7,9"

🔹 y = 1

y-1 = 0 → "-0," や ",0," は存在しない → 変化なし
x = ",1,2,3,6,7,9"

🔹 y = 2

y-1 = 1
"-1," → 存在しない
",1," → あり → ",1," → ",1-" に置換
x = ",1-2,3,6,7,9"

🔹 y = 3

y-1 = 2
"-2," → あり → "-2," → "-" に置換
",2," → なし(すでに "1-2" に変換済み)
x = ",1-3,6,7,9"

🔹 y = 6

y-1 = 5 → "-5," や ",5," は存在しない → 変化なし
x = ",1-3,6,7,9"

🔹 y = 7

y-1 = 6
",6," → あり → ",6," → ",6-" に置換
x = ",1-3,6-7,9"

🔹 y = 9

y-1 = 8 → "-8," や ",8," は存在しない → 変化なし
x = ",1-3,6-7,9"

✅ 最終結果

",1-3,6-7,9"

🧠 補足:なぜ2段階の SUBSTITUTE?

SUBSTITUTE(
SUBSTITUTE(x, "-" & y-1 & ",", "-"),
"," & y-1 & ",", "," & y-1 & "-"
)

前段:"-2," → "–" に変換 → "1-2,3" → "1-3"
後段:",2," → "1,2,3" → "1-2,3"

この2段階により、前後の連続性を検出して、範囲を拡張することができます。

🧾 ステップ4:先頭のカンマをAM/PMで置換

SUBSTITUTE(連結, ",", B2 & "/", 1)

最初のカンマ , を B2(AMまたはPM)とスラッシュ / に置換。
例:",1-2,6" → "AM/1-2,6"

✅ 最終出力例

たとえば、D2:AH2 に値がある日が 1, 2, 6 の場合:
数列 → {1,2,6}
結合 → ",1,2,6"
連結 → ",1-2,6"
最終出力 → "AM/1-2,6"

💡ポイントまとめ

ステップ 処理内容 結果例(1,2,6が入力)
数列 値のある日を抽出 {1,2,6}
結合 カンマ連結 ",1,2,6"
連結 連続範囲に変換 ",1-2,6"
出力 AM/PMを付加 "AM/1-2,6"

 

4. Power Query

データが存在する日付のみに絞り込んでソート後に連番を振り[日付]-[連番]を計算すると、連続している日付の差分が同じ値になるので、差分でグループ化して日付を結合します。

  1. データの取得
  • 集計ブックで[データ]-[データの取得v]-[ファイルから>]-[Excelブックから]でファイルを選択し[インポート]、シートを選択し[データの変換]でPower Queryエディタに取込む。
  • 右の名前を"まとめpq"に変更する。
  • 右の"変更された型"の左の×をクリックして削除。
  1. 氏名の穴埋め
    "Column1"列を選択し[変換]-[フィルv]-[下へ]。
  2. ヘッダー化
  • [変換]-[1行目をヘッダとして使用v]-[1行目をヘッダとして使用]。
  • 右の"変更された型"の左の×をクリックして削除。
  1. 日をピボット解除 ⇒ データベース形式になる
  • "氏名"、"AMPM"、"合算"列を選択し、[変換]-[列のピボット解除v]-[その他の列のピボット解除]。
  • 数式バーの"属性"を"日"、"値"を"回数"に変更。
  1. 型設定
    表を選択し、Ctrl+aで全列を選択し[変換]-[データ型の検出]。適切でない型の列を選択し、[変換]-[データ型]で適切な型を選択し[現在のものを置換]。

  2. "回数"が無い行を削除
    "回数"列の▼-[空の削除]。

  3. "氏名"、"AMPM"、"日"のソート

  • "氏名"、"AMPM"、"日"の順に▼をクリックし、[昇順で並び替え]。
  • 数式バーを次のように変更。(Table.Buffer()で囲む)
= Table.Sort(フィルターされた行,{{"氏名", Order.Ascending}, {"AMPM", Order.Ascending}, {"日", Order.Ascending}})
↓
= Table.Buffer(Table.Sort(フィルターされた行,{{"氏名", Order.Ascending}, {"AMPM", Order.Ascending}, {"日", Order.Ascending}}))
  1. "氏名"と"AMPM"のグループ化(同じ行の日をまとめる)
    "氏名"と"AMPM"列を選択し[ホーム]-[グループ化]で、次のように入力し[OK]。
    新しい列名:カウント
    操作:すべての行

  2. "日"の展開
    "カウント"列の矢印アイコンをクリックし、"日"のみチェックし、"元の列名をプレフィックスとして使用します"のチェックを外し[OK]。

  3. 連番の追加
    [列の追加]-[インデックス列v]-[0から]。

  4. 差分列の追加(連続日が同じ差分値になる)
    [列の追加]-[カスタム列]で次のように入力し[OK]。
    新しい列名:差分
    カスタム列の式:= [日] - [インデックス]

  5. "氏名"、"AMPM"、"差分"でグループ化(連続する日(差分)をグループ化⇒連続日が1行になり、日の最小と最大を開始日と終了日列にする)
    "氏名"、"AMPM"、"差分"列を選択し[ホーム]-[グループ化]-[集計の追加]で、次の様に入力し[OK]。
    新しい列名:操作:列
    開始日:最小:日
    終了日:最大:日

  6. "開始日-終了日"のように連結したカスタム列を追加
    [列の追加]-[カスタム列]で次のように入力し[OK]。
    新しい列名:カスタム
    カスタム列の式:= if [開始日] = [終了日] then Text.From([開始日]) else Text.From([開始日]) & "-" & Text.From([終了日])

  7. "氏名"と"AMPM"でグループ化(開始日-終了日のカスタムをまとめる)
    "氏名"と"AMPM"列を選択し[ホーム]-[グループ化]で、次のように入力し[OK]。
    新しい列名:カウント
    操作:すべての行

  8. 日を結合するカスタム列を追加
    [列の追加]-[カスタム列]で次のように入力し[OK]。
    新しい列名:合算
    カスタム列の式:= [AMPM] & "/" & Text.Combine([カウント][カスタム], ", ")

  9. 作業列を削除
    "カウント"列を選択し[ホーム]-[列の削除v]-[列の削除]。

  10. 型の設定
    "合算"列を選択し[変換]-[データ型]-[テキスト]。

  11. Excelに読み込み
    [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む]で"テーブル"を選択し[OK]。

日毎の列が必要であれば、ピボット解除しないクエリを作成し、上記クエリにマージします。

5. メジャー

データが存在する日付のみに絞り込んでRANKXで連番を振り[日付]-[連番]を計算すると、連続している日付の差分が同じ値になるので、差分でグループ化して日付を結合します。最初にPower Queryで入力表をデータベース形式に変換します。

  1. データの取得
  • 集計ブックで[データ]-[データの取得v]-[ファイルから>]-[Excelブックから]でファイルを選択し[インポート]、シートを選択し[データの変換]でPower Queryエディタに取込む。
  • 右の名前を"まとめm"に変更する。
  • 右の"変更された型"の左の×をクリックして削除。
  1. 氏名の穴埋め
    "Column1"列を選択し[変換]-[フィルv]-[下へ]。
  2. ヘッダー化
  • [変換]-[1行目をヘッダとして使用v]-[1行目をヘッダとして使用]。
  • 右の"変更された型"の左の×をクリックして削除。
  1. 日をピボット解除 ⇒ データベース形式になる
  • "氏名"、"AMPM"、"合算"列を選択し、[変換]-[列のピボット解除v]-[その他の列のピボット解除]。
  • 数式バーの"属性"を"日"、"値"を"回数"に変更。
  1. 型設定
    表を選択し、Ctrl+aで全列を選択し[変換]-[データ型の検出]。適切でない型の列を選択し、[変換]-[データ型]で適切な型を選択し[現在のものを置換]。

  2. Excelに読み込み
    [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む]で"ピボットテーブル"と"このデータをデータモデルに追加する"を選択し[OK]。これでExcelに戻ります。

  3. ピボットテーブルの書式設定

  • [ピボットテーブル分析]-[ピボットテーブルv]-[オプションv]-[レイアウトと書式]で"更新時に列幅を自動調整する"のチェックを外す。
  • [デザイン]-[レポートのレイアウトv]-[表形式]。[デザイン]-[総計v]-[行と列の集計を行わない]。[デザイン]-[小計]-[小計を表示しない]。
  1. メジャーの追加
    "ピボットテーブルのフィールド"の'まとめm’を右クリックし、[メジャーの追加]で次のように入力し[OK]。
    メジャーの名前:M合算
    数式:

=VAR CurrentName = MAX('まとめm'[氏名])
// ピボットテーブルのコンテキストから現在の氏名を取得
VAR CurrentAMPM = MAX('まとめm'[AMPM]) // 同様に現在のAMPM(午前・午後)を取得
VAR ValidDays =
CALCULATETABLE (
SELECTCOLUMNS (
'まとめm',
"Day", VALUE('まとめm'[日])
),
'まとめm'[氏名] = CurrentName,
'まとめm'[AMPM] = CurrentAMPM,
'まとめm'[回数] <> BLANK()
)
// 氏名+AMPMでフィルターし、回数が空でない日だけを抽出
VAR IndexedDays =
ADDCOLUMNS (
ValidDays,
"Index", RANKX(ValidDays, [Day],, ASC)
)
// DayNum に対して昇順のインデックスを付与(1,2,3,...)
VAR WithDiff =
ADDCOLUMNS (
IndexedDays,
"GroupKey", [Day] - [Index]
)
// DayNum - Index の差分で連続グループを判定 // 連続する日付は差分が同じになる → GroupKeyでグループ化可能
VAR Grouped =
GROUPBY (
WithDiff,
[GroupKey],
"StartDay", MINX ( CURRENTGROUP(), [Day] ),
"EndDay", MAXX ( CURRENTGROUP(), [Day] )
)
// GroupKeyごとに、最小・最大のDayNumを抽出 → 開始日・終了日
VAR Result =
ADDCOLUMNS (
Grouped,
"Formatted",
IF (
[StartDay] = [EndDay],
FORMAT([StartDay], "0"),
FORMAT([StartDay], "0") & "-" & FORMAT([EndDay], "0")
)
)
// 開始日=終了日なら単独日、異なれば "開始-終了" の形式で整形
RETURN
CurrentAMPM & "/" & // 先頭にAM/PMを付ける
CONCATENATEX ( // ピボットテーブルのコンテキストに含まれる'Result'[Formated]を","で結合する
Result,
[Formatted],
", ",
[StartDay], ASC
)
  1. ピボットテーブルの項目
    "ピボットテーブルのフィールド"で次のように項目をドラッグする。
    行:'まとめm'[氏名]、'まとめm'[AMPM]。Σ値:[M合算]。

6. VBAマクロ

'https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12321961622
'2025/11/07 by taihenda
Sub test()
Dim i As Long, j As Long, k As Long, mstr As String, ary() 'kの初期値は0
Columns(3).ClearContents
Columns(3).NumberFormat = "@"
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row + 1 '行ループ(i=row)
For j = 4 To Cells(1, Columns.Count).End(xlToLeft).Column '日のループ(j=Column,日=j-3)
If Cells(i, j) <> "" And (j = 4 Or Cells(i, j - 1) = "") And Cells(i, j + 1) <> "" Then
ReDim Preserve ary(k)
ary(k) = j - 3 & "-" '連続開始日(d-)
k = k + 1
ElseIf Cells(i, j) <> "" And Cells(i, j - 1) <> "" And Cells(i, j + 1) = "" Then
ReDim Preserve ary(k)
ary(k) = "-" & j - 3 '連続終了日(-d)
k = k + 1
ElseIf Cells(i, j) <> "" And Cells(i, j - 1) = "" And Cells(i, j + 1) = "" Then
ReDim Preserve ary(k)
ary(k) = j - 3 '単独日(d)
k = k + 1
End If
Next
If k > 0 Then
Cells(i, 3) = Join(ary, ",") '","で結合
Cells(i, 3) = Cells(i, 2) & "/" & Replace(Cells(i, 3), "-,-", "-") '開始と終了が","で結合され"-,-"となるので"-"で置換
Erase ary
k = 0
End If
Next
End Sub

7. サンプル

ダウンロード - 251106join.xlsm

C:\Users\Public\Documents に保存してください。Yahoo!知恵袋のワークシート式の別解も入っています。

8. VBA、ワークシート式、Power Query、メジャー(DAX)の比較

  • VBA:一番理解しやすいロジックだと思います。
  • ワークシート式:一番短いです。SUBSTITUTEのロジックは、思いつきにくいです。コメントが書けないので、可読性が悪いです。Excel LabsのAFEを使うと、可読性が改善します。
  • Power Query:差分でグループ化するロジックは、思いつきにくいです。でも、可読性は良いと思います。Power Queryエディタで、処理の経過を見ることができることも、可読性が良い点になっています。
  • メジャー:Power Queryのロジックとほぼ同じですが、RANKX()やCURRENTGROUP()などが思いつきにくいです。ADDCOLUMNSで作業列を追加していく手法は、データベースの処理で見られる手法なので参考にしても良いかも知れません。

このような式は、プログラマーで無いと発想できないと思います。当方は素人なので、ChatGPTとGeminiとCopilotにメジャーの作成を依頼したところ、回答に辿り着きませんでした。そこで、Copilotにワークシート式の回答を伝え、Power Queryの回答を依頼したところ、正解が出ました。その正解を元にメジャーを依頼したら、メジャーも正解に辿り着きました。この課題に対して、ChatGPTは今一つでした。

| | コメント (0)

Excel Power Queryで表をリスト形式に整形する方法(まとめ)

1. 前置き

ネットや書籍などに、Excel Power Queryで表をリスト形式(データベース形式)に整形する方法が解説されていますが、表の形によりその方法で整形できないことがあります。
そこで、整形のメモを整理してみました。なお、当方は素人なので、ここで紹介するものよりもっと良い方法があると思います。古いメモ程、素人度が高いです。使用される場合は、検算を行い自己責任でお願いいたします。

2. 整形方法

1ファイル、1シートの色々な表の整形方法です。ChatGPTを利用して作成したものが多いです。ChatGPTには、次のような質問をしています。

ChatGPTなどへの質問内容

  1. データを簡略化した整形前と整形後のテキストの表を入れる。項目数は簡略化しないほうが良い場合もある。表はカンマ区切りでもTAB区切りでも良い。
  2. Excel、Power Queryであることを書く。
  3. クリック操作で作るのか、Power Query Mのコードの回答を求めるのかを書く。ChatGPTなどのLLMは、コードの回答の方が得意です。
  4. ある程度の整形方法を指示する。例えば、似たような事例とか、途中まで自分で作成した方法を記載する。

1回で正解にならないことが多いので、4)の方法を伝えることが大事です。エラーが出た場合は、エラーが出たコードと、エラーメッセージと、エラーの理由と、その回避方法を使えると良いです。(例:aaaというボタンが表示されないので、bbbが使えるか検討してください。)

m) 横に2種類の項目が種類順に繰り返し並んだ表をExcelで整形(Power Query, ワークシート関数):2025/07/19:当ブログ

https://bigarrow.tea-nifty.com/blog/2025/07/post-ccee90.html
1ファイル、1シート、1表、横に同一項目のレコードが並ぶ。Power Query M 詳細エディタでコーディング

品番 品名 店舗NO. 納期1 納期2 納期3 数量1 数量2 数量3 受信日
ABCD-123 ゴミ袋 ○○○ 2025/1/1 2025/1/4 2025/1/20 35 200 1 2024/12/1
ABCE-456 ブラシ ○○○ 2025/1/3 2025/1/4   13 20   2024/12/1

↓

品番 品名 店舗NO. 納期 数量 受信日
ABCD-123 ゴミ袋 ○○○ 2025/1/1 35 2024/12/1
ABCD-123 ゴミ袋 ○○○ 2025/1/4 200 2024/12/1
ABCD-123 ゴミ袋 ○○○ 2025/1/20 1 2024/12/1
ABCE-456 ブラシ ○○○ 2025/1/3 13 2024/12/1
ABCE-456 ブラシ ○○○ 2025/1/4   2024/12/1

n) 月別に独立して横に展開されている項目の表の整形:2025/07/18:当ブログ

https://bigarrow.tea-nifty.com/blog/2025/07/post-485823.html
1ファイル、1シート、複数表(横)、リスト。入替-列結合-入替-ヘッダ化-ピボット解除-整数除算-ピボット

25/04 25/05
取引先 売上 取引先 売上
a社 1,000,000 a社 500,000
b社 100,000 c社 1,000,000
    d社 500,000

横方向のつながりはありません。各月の表は独立しています。各月の表の間に1列の空白列が合ってもOKです。

↓

年月 取引先 売上
25/04 a社 1,000,000
25/04 b社 100,000
25/05 a社 500,000
25/05 C社 1,000,000
25/05 d社 500,000

o) 項目が繰り返し横に伸びる、開始日と終了日のデータのみの表をモダンExcelで集計:2025/07/08:当ブログ

https://bigarrow.tea-nifty.com/blog/2025/07/post-258734.html
1ファイル、1シート、1表、横に複数項目のレコードが繰り返し。列結合-転置-ヘッダ化-整数除算-ピボット解除-ピボット

番号 氏名 入居日 退去日 部屋番 入居日 退去日 部屋番 入居日 退去日 部屋番
1 山口 2025/6/2 2025/6/5 103 2025/6/10 2025/6/12 105 2025/6/30 2025/7/10 203
2 田中 2025/5/3 2025/5/5 106 2025/5/10 2025/5/11 105 2025/6/3 2025/6/5 103
10 加藤 2025/7/1 2025/7/2 201            
15 広瀬 2025/8/3 2025/8/8 203 2025/9/10 2025/9/15 106      
5 長澤                  
23 深田 2025/4/3 2025/4/8 101 2025/7/12 2025/7/15 205      

↓

Pivot Table
番号 名前 入居日 退去日 部屋番 当月日数
1 山口 25/06/30 25/07/10 203 10
25/07/13 25/07/16 203 4
25/07/18 25/07/22 203 5
山口 集計     19
10 加藤 25/07/01 25/07/02 201 2
加藤 集計     2
2 田中 25/07/03 25/07/06 205 4
田中 集計     4
23 深田 25/07/12 25/07/15 205 4
深田 集計     4

p) Excel/Power Queryでデータブロックが横に並んでいるデータを縦にまとめる方法:2025/06/14:当ブログ

https://bigarrow.tea-nifty.com/blog/2025/06/post-80cc7d.html
1ファイル、1シート、複数表(横)、リスト。入替-整数除算-ピボット解除-ピボット

品番 1111         品番 1112      
得意先 品名 数量 単価 納期   得意先 品名 数量 単価 納期
A商社 りんご 1 100 12月1日   A商社 もも 3 100 11月1日
B商社 バナナ 2 200 12月23日   B商社 バナナ 4 200 12月1日

横方向のつながりはありません。各品番の表は独立しています。各品番の表は1列の空白列で区切られています。

↓

品番 得意先 品名 数量 単価 納期
1111 A商社 りんご 1 100 12月1日
1111 B商社 バナナ 2 200 12月23日
1112 A商社 もも 3 100 11月1日
1112 B商社 バナナ 4 200 12月1日

q) Excel Power Queryで1レコードが複数行、複数列に分かれている表の整形方法:2025/02/28:当ブログ

https://bigarrow.tea-nifty.com/blog/2025/02/post-08e375.html
1ファイル、1シート、1表、1レコードが複数行、複数列で、行毎に項目が違う。Power Query M 詳細エディタでコーディング

1 a:あ b:い c:う d:え h:く
e:お f:か g:き
2 a:け b:こ c:さ d:し h:た
e:す f:せ g:そ

↓

No. a b c d e f g h
1 あ い う え お か き く
2 け こ さ し す せ そ た

r) Excel Power Queryで横項目3段のクロス表をリスト形式にする方法:2025/02/17:当ブログ

https://bigarrow.tea-nifty.com/blog/2025/02/post-431da6.html
1ファイル、1シート、1表、クロス表。転置-列結合-転置-ヘッダー化-ピボット解除-列分割-ピボット

2025年 1F 2F
1月 AM PM AM PM
日 Gr 品名 個数 Gr 品名 個数 Gr 品名 個数 Gr 品名 個数
1日 A りんご 3 B キウイ 5 B 醤油 1 A 塩 2
2日 A みかん 5 B キウイ 5 B ソース 2 A 醤油 2
3日                        
4日 B みかん 11 A キウイ 5 A 塩 1 B ソース 1

↓

年月日 年 月 日 1段目 2段目 Gr 品名 個数
2025/01/01 2025年 1月 1日 1F AM A りんご 3
2025/01/01 2025年 1月 1日 1F PM B キウイ 5
2025/01/01 2025年 1月 1日 2F AM B 醤油 3
以下省略                

s) 1レコードが1シート複数行複数列から成る複数シートを1つのデータベース形式にする:2025/09/26:当ブログ 

https://bigarrow.tea-nifty.com/blog/2025/09/post-4beb66.html
1ファイル、複数シート、2行毎に項目と値を構成。列結合-剰余-整数除算-列のピボット-転置-列の結合-列の分離

会社情報  
社名 住所
A社 東京
担当者 営業日
A営業 月-木
電話 FAX
0120-000-000 0120-100-001
資本 受注
1,000万 100万

↓

社名 住所 担当者 営業日 電話 FAX 資本 受注
A社 日本 A営業 月-木 0120-000-000 0120-000-001 1,000万 100万
B社 日本 B営業 月-木 0120-001-000 0120-001-001 1,001万 101万
C社 日本 C営業 月-木 0120-002-000 0120-002-001 1,002万 102万

t) Power Queryで縦横に複数の子表が並ぶシートをデータベース形式に整形:2025/12/14:当ブログ

https://bigarrow.tea-nifty.com/blog/2025/12/post-de2eb7.html
1ファイル、1シート、縦横複数表。転置-整数除算-グループ化-カスタム列で整数除算削除し転置-展開結合

縦横2個、合計4個の表の例

商品場所                      
                       
コード A123456789         コード A123456790        
品名 100001         品名 100002        
ロット   入数 箱数 合計   ロット   入数 箱数 合計  
aswdw   12 3 36   88888   8 1 8  
qwrq   3 4 12   99999   9 2 18  
333   5 2 10   1000   10 3 30  
TOTAL     16 104   TOTAL     15 160  
コード A123456791         コード A123456792        
品名 100003         品名 100004        
ロット   入数 箱数 合計   ロット   入数 箱数 合計  
777   17 1 17   aaa   10 2 20  
888   18 2 36   bbb   20 3 60  
999   19 3 57              
000   20 4 80              
TOTAL     15 295   TOTAL     20 700  

↓

コード 品名 ロット 入数 箱数 合計
A123456789 100001 12 3 36 aswdw
A123456789 100001 qwrq 3 4 12
A123456789 100001 333 5 2 10
A123456791 100003 777 17 1 17
A123456791 100003 888 18 2 36
A123456791 100003 999 19 3 57
A123456791 100003 000 20 4 80
A123456790 100002 88888 8 1 8
A123456790 100002 99999 9 2 18
A123456790 100002 1000 10 3 30
A123456792 100004 aaa 10 2 20
A123456792 100004 bbb 20 3 60

u) 表の外に共通項目があり、縦横に複数の項目を持つクロス表をPower Queryでリストに整形:2026/05/07:当ブログ

https://bigarrow.tea-nifty.com/blog/2026/05/post-dced47.html
欄外に共通項目がある多段クロス表。絶対アドレス参照。転置-結合-転置-インデックス-整数除算-ピボット解除-列のピボット。

Column1 Column2 Column3 Column4 Column5 Column6 Column7 Column8 Column9
              《今野物産 ピッキングリスト》  
受信日:2026/04/28   部門:11            
出荷日:2026/04/30   出庫元:0006781 佐川営業所            
納品日:2026/05/01   売上部署:0006781 佐川営       検索対象:手入力情報 + EDI情報(本発注)    
                 
品名/規格   品目コード 単位 相手先店コード   160016 160014 160012
相手先品目コード     入数 自社店コード   S001 S002 S003
        店名 合計 東京店 大阪店 北海道店
りんご/生     P 数量 100 100    
B001   12345 10 ケース数 10 10    
ぶどう/生     P 数量 70   40 30
B002   11111 10 ケース数 7   4 3

↓

品名/規格 相手先品目コード 品目コード 相手先店コード 自社店コード 店名 数量 ケース数 部門 受信日 出荷日 納品日
りんご/生 B001 12345 160016 S001 東京店 100 10 11 2026/04/28 火 2026/04/30 木 2026/05/01 金
ぶどう/生 B002 11111 160012 S003 北海道店 30 3 11 2026/04/28 火 2026/04/30 木 2026/05/01 金
ぶどう/生 B002 11111 160014 S002 大阪店 40 4 11 2026/04/28 火 2026/04/30 木 2026/05/01 金

 

3. 整形手順のパターン

クロス表

[転置]-[列結合]-[ヘッダー化]-[ピボット開所]-[列分割]-[ピボット]。

横に同じ項目が繰り返し並ぶ表

[列結合]-[転置]-[ヘッダ化]-[整数除算]-[ピボット解除]-[ピボット]。
整数除算を行うことで項目の組合せの重複が無くなるため、ピボット時に「集計しない」でエラーを無くすことができる。

セル結合で空白セルがある表

[フィル]-[下へ]。[転置]-[フィル]-[下へ]-[転置]。

表の外にある1つの値を全レコードの値にする方法

[列の追加]-[カスタム列の追加]で次のように入力する。
= ソース{0}[Column2]       // ソースはテーブル名、{0}はレコード番号(行番号)、[Column2]は列名。 

当ブログの過去の記事では、カスタム列を2つ使い方法を紹介してきましたが、このようにフィールドを直接参照する方が簡単です。

4. 参考情報

5. 余談

  • ChatGPTなどのLLMの答えは、最適解ではないことがあります。

| | コメント (0)

Excel Power Queryで複数の表を結合する方法(まとめ)

1. 前置き

ネットや書籍などに、Excel Power Queryで複数の表を結合する方法が紹介されていますが、表の形によりその方法が使えない場合があります。
そこで、結合対象のパターンを整理してみました。なお、当方は素人なので、ここで紹介するものよりもっと良い方法があると思います。使用される場合は、検算を行い自己責任でお願いいたします。

補足:ブックやシートやテーブルが増えても[すべて更新]で結合できる方法を対象とします。

2. 表のパターンと結合方法一覧

一覧表の項目の説明

(0) #:パターン番号。 (1) ブック:ブックの数。 (2) シート/テーブル:シート/テーブル、1つ/複数、同名/異名。 (3) 表数:1シートに含む表数。 (4) ヘッダー:見出しがある行番号。 (5) リスト/クロス表:元の表の形式。 (6) 整形前項目:元の各表の項目が同じか。 (7) 整形後項目:整形後・結合前の各表の項目が同じか(異なる例:25年度から新たな区分が追加されるなど)。 (8) ヘルパークエリ:ヘルパークエリや関数クエリの使用。 (9) 結合関数:表の結合に使用する関数(Table.ExpandTableColumn/Table.Combine)。

表のパターンと結合方法一覧

# ブック シート/テーブル 表数 ヘッダー リスト/クロス表 整形前項目 整形後項目 ヘルパークエリ 結合関数 備考
1 1ブック 複数テーブル 1表 - リスト 同じ - なし ExpandTableColumn  
2 1ブック 複数シート 1表 1行目 リスト 同じ - なし ExpandTableColumn  
3 1ブック 複数シート 1表 1行目他 リスト他 同じ他 同じ 手動ヘルパー ExpandTableColumn  
4 1ブック 複数シート 複数表縦 各データの直上 クロス 同じ他 同じ 手動関数 ExpandTableColumn  
5 複数ブック 1シート同名 1表 1行目 リスト 同じ - 自動ヘルパー ExpandTableColumn  
6 複数ブック 1シート異名 1表 1行目 リスト 同じ - 自動ヘルパー ExpandTableColumn  
7 複数ブック 1シート異名 1表 1行目 クロス - 同じ 自動ヘルパー ExpandTableColumn  
8 複数ブック 複数シート 1表 1行目 リスト 同じ - 自動ヘルパー ExpandTableColumn  
9 複数ブック 複数シート 1表 2行目他 クロス他 - 同じ 手動ヘルパー他 ExpandTableColumn  
10 複数ブック他 複数シート他 1表 2行目他 クロス他 - 異なる 手動ヘルパー他 Combine  

#1:1ブック、複数テーブル

a) 【Excel パワークエリ】これを見ても、まだコピペでいいなんて言うヤツ……いねぇよなぁ❗️❓️:Excel ドカタCH 2024/04/13

https://www.youtube.com/watch?v=UapvFSxv2mE
1番目:1ブック、複数テーブル、リスト形式、ExcelCurrentWorkboook、Table.ExpandTableColumn

#2:1ブック、複数シート、リスト

a) 【Excel パワークエリ】これを見ても、まだコピペでいいなんて言うヤツ……いねぇよなぁ❗️❓️:Excel ドカタCH 2024/04/13

https://www.youtube.com/watch?v=UapvFSxv2mE
2番目:1ブック、複数シート、リスト形式、ヘッダー1行目、Excel.Workbook(…,true,…)、Table.ExpandTableColumn

c) 複数シートに分かれた表をパワークエリを使って1つに結合する方法【Excel】:Excel ドカタCH 2021/11/20

https://www.youtube.com/watch?v=oBvL4bENmCM
1ブック、複数シート、リスト形式、ヘッダー1行目、型設定しフィルターのエラー削除で途中のヘッダを削除、Table.ExpandTableColumn

d) 【有料級】パワークエリでExcel全シートをまとめる秘訣を大公開:Excel ドカタCH 2025/02/22

https://www.youtube.com/watch?v=ZgpRmxpKZFM
1ブック、複数シート、リスト形式、ヘッダー1行目、Excel.Workbook(…,true,…)、シート名利用、Table.ExpandTableColumn

#3:1ブック、複数シート、リスト他

g) Power Query:複数のシートのデータを縦結合する(ヘルパークエリ編):なんでもエクセル(Nandemo Excel)2023/11/14

https://nandemo-xl.hatenablog.com/entry/2023/11/14/161634
1ブック、複数シート、リスト形式他、手動ヘルパークエリ(シート名)、Table.ExpandTableColumn
例はリスト形式だが、クロス表などの1シートの整形ヘルパークエリを作成可能。パラメータは、シート名(Text)。

j) 1レコードが1シート複数行複数列から成る複数シートを1つのデータベース形式にする:当ブログ 2025/09/26

https://bigarrow.tea-nifty.com/blog/2025/09/post-4beb66.html
1ファイル、複数シート、手動ヘルパークエリ(Table)、Table.ExpandTableColumn
上記手動ヘルパークエリの応用ですが、パラメータにTableを使用。

#4:1ブック、複数シート、複数表縦

b) 【Excel】マウス操作だけのパワークエリからレベルアップ!カスタム関数クエリでワンランク上のデータ整形:Excel ドカタCH 2024/06/15

https://www.youtube.com/watch?v=jDIwpBCVibY
1ブック、複数シート、複数表、クロス形式、Table⇒新しいクエリ⇒シート変換関数クエリ、Table⇒新しいクエリ⇒表変換関数クエリ、カスタム関数の呼び出し、シート名利用、Table.ExpandTableColumn
手動で各シートと各表の変換クエリをTableを右クリックして[新しいクエリとして追加]で作成し、詳細エディタで関数クエリに変える。

#5:複数ブック、1シート同名

a) 【Excel パワークエリ】これを見ても、まだコピペでいいなんて言うヤツ……いねぇよなぁ❗️❓️:Excel ドカタCH 2024/04/13

https://www.youtube.com/watch?v=UapvFSxv2mE
3番目:複数ブック、1シート同名、リスト形式、ヘッダー1行目、Table.ExpandTableColumn
展開でヘルパークエリのサンプルファイルの変換で昇格されたヘッダー数のステップが自動生成される。このヘルパークエリを編集して、クロス表などの整形もできる。

m) Power Query:複数のExcelファイルを結合して読み込む:なんでもエクセル(Nandemo Excel)2025/08/20

https://nandemo-xl.hatenablog.com/entry/2025/08/20/113508
複数ファイル、1シート、リスト形式、ヘルパークエリ、Table.ExpandTableColumn
展開でヘルパークエリのサンプルファイルの変換で昇格されたヘッダー数のステップが自動生成される。このヘルパークエリを編集して、クロス表などの整形もできる。

i) フォルダの中の複数のExcelファイルの1シートを1つのシートにまとめる方法:当ブログ 2025/09/28

https://bigarrow.tea-nifty.com/blog/2025/09/post-1a1641.html
複数ファイル、1シート、リスト形式、ヘルパークエリ、Table.ExpandTableColumn
展開でヘルパークエリのサンプルファイルの変換で昇格されたヘッダー数のステップが自動生成される。このヘルパークエリを編集して、クロス表などの整形もできる。

x) 【PowerQuery for Excel】『目から鱗の凄技』「データマッピング」で、ランダム「セル」を「データ化」して「結合」: たぬき親父の「Excel勉強会」: 2023/08/25

https://www.youtube.com/watch?v=UZXtUUALfIE
複数ファイル、1シート、ランダム形式、ヘルパークエリ、Table.ExpandTableColumn
ランダムに項目がある表をマッピングする表を作り、マージで項目と値を揃える方法。トリッキーなことはしていないので、理解しやすい。ヘルパークエリでリスト形式まで整形したほうがすっきりしそうな気もする。

#6:複数ブック、1シート異名、リスト

e) 【パワークエリ】Excelブックを結合したいけどシート名がバラバラ…🥺:Excel ドカタCH 2024/01/27

https://www.youtube.com/watch?v=f2S0HaoUIzw
複数ブック、1シート異名、リスト形式、ヘッダー1行目、フィルターで途中のヘッダを削除、Table.ExpandTableColumn
展開で自動生成されるヘルパークエリを編集しないで、結合された表を整形する方法です。
⇒ヘルパークエリを編集したほうが良いように思えます??

#7:複数ブック、1シート異名、クロス

f) パワークエリはデータクリーニングにて最強【EXCEL Power BI Power Query Data Cleaning】:Excel ドカタCH 2022/1/29

https://www.youtube.com/watch?v=22o2pCVCLFE
複数ブック、1シート異名、クロス形式、1行目ヘッダー、ファイル名利用、ヘッダー化とピボット解除をカスタム列で行う、Table.ExpandTableColumn
ファイル名の利用をカスタム列の追加1つで行う。Power Query Mのコードの知識が必要です。(条件列を追加すればクリック操作でもできますが、手順は増えます。)

#8:複数ブック、複数シート、リスト

a) 【Excel パワークエリ】これを見ても、まだコピペでいいなんて言うヤツ……いねぇよなぁ❗️❓️:Excel ドカタCH 2024/04/13

https://www.youtube.com/watch?v=UapvFSxv2mE
4番目:複数ブック、複数シート、リスト形式、ヘッダー1行目、Excel.Workbook(…,true,…)、Table.ExpandTableColumn

#9:複数ブック、複数シート、クロス

h) 複数ブック、複数シートをPower Queryで1つの表にする方法(1ヘルパークエリ):当ブログ 2025/11/04

https://bigarrow.tea-nifty.com/blog/2025/11/post-d0f322.html
複数ブック、複数シート、手動ヘルパークエリ、Table.ExpandTableColumn

関連記事

複数ブック、複数シートをPower Queryで1つの表にする方法(2ヘルパークエリ):当ブログ 2025/11/03

https://bigarrow.tea-nifty.com/blog/2025/11/post-e6ea77.html
複数ブック、複数シート、自動ヘルパークエリ(ファイルの変換)と手動ヘルパークエリ(シートの変換)、Table.ExpandTableColumn

複数ブック、複数シートをPower Queryで1つの表にする方法(シート整形関数クエリ):当ブログ 2025/10/21

https://bigarrow.tea-nifty.com/blog/2025/10/post-4ad540.html
複数ブック、複数シート、手動関数クエリ、Table.ExpandTableColumn

#10:複数ブック、複数シート、クロス、異列

m) Excel Power Query Table.Combine を用いた複数ブック、複数シートの縦結合:当ブログ 2025/12/20

https://bigarrow.tea-nifty.com/blog/2025/12/post-60e0ad.html
複数ファイル、複数シート。Table.Combine。ヘルパークエリ。

関連記事

k) Power QueryでExcelの複数のシートを縦結合する方法:当ブログ 2025/02/21

https://bigarrow.tea-nifty.com/blog/2025/02/post-b425f3.html
1ファイル、複数シート
複数ファイル、複数シート
関数クエリ、Table.ExpandTableColumn、Table.Combine
サンプルブックのサンプルシートの整形クエリを作成し、シートテーブルを引数とする関数クエリを作る。フォルダを取得するクエリでブックの内容(シート)を読み出し展開するコードと、整形クエリを呼び出し整形するコードを記述する。
⇒ ヘルパークエリを使うようにしたのが、上記m)です。

l) Excel Power Query : フォルダ指定でブックとシートを取得しシートを整形結合:当ブログ 2024/08/18

https://bigarrow.tea-nifty.com/blog/2024/08/post-9c6b07.html
複数ファイル、複数シート、関数クエリ、Table.Combine

3. 参考

4. 余談

  • 表の結合ボタンは Table.ExpandTableColumn を使用するので、結合する直前の列名が同じである必要があります。
  • 列名が異なっていても縦結合ができる Table.Combine は、クエリの追加ボタンで使用されます。しかし、クエリの追加はクエリを特定する必要があり、結合対象の表が変わる場合は使えません。なので、詳細エディタで、Table.Combine を使用するコードを記述します。Table.Combineについては、もっとコードの記述を少なくする方法があると思います。

| | コメント (0)

複数ブック、複数シートをPower Queryで1つの表にする方法(1ヘルパークエリ)

1. 前置き

Excel Power Queryでフォルダからデータを取得するとヘルパークエリが作られますが、これはファイル全体を変換するクエリであり、個々のシートを変換するクエリではありません。
シートがクロス表等で横項目が異なる場合は、単純にファイルを変換するクエリで展開(Table.ExpandTableColumn)できないので、クリック操作では処理ができないという問題があります。
そこで、手動でシート整形関数クエリを作成し、2つのカスタム列の追加で、ブックとシートを処理して結合する方法を記事にしました。

複数ブック、複数シートをPower Queryで1つの表にする方法(シート整形関数クエリ)
https://bigarrow.tea-nifty.com/blog/2025/10/post-4ad540.html

この方法で使う展開ボタンでは「Table.ExpandTableColumn」が使われるので、シートの整形後の表の項目は同じものに限りますが、1シートの整形クエリのピボット解除等の処理で項目を揃えることができれば、この方法が使えます。
でも、ヘルパークエリではないので、整形ステップを修正する場合は、サンプルシートの変換クエリを修正後、関数クエリにそのコードを手動で上書きする必要があるという欠点があります。

本記事は、次の記事の方法でヘルパークエリを手動で作成し、サンプルクエリを修正すると関数クエリが連動して修正されるようにしたものです。次の記事の複数ブック版とも言えます。

Power Query:複数のシートのデータを縦結合する(ヘルパークエリ編)
https://nandemo-xl.hatenablog.com/entry/2023/11/14/161634

2. 入力表

Sheet1 Sheet2
売上 A店 25年10月  
商品 1日 11日 21日
商品01 1 2 3
商品02 2 3 4
商品03 3 4 5
売上 A店 25年11月  
商品 1日 11日 21日
商品01 1 2 3
商品02 2 3 4
商品03 3 4 5

条件

  1. 店舗別のブックに1ヶ月1シートの売上実績表があります。
  2. 1シートの表は次の様に縦に商品、横に日付が並んだクロス表です。
  3. 年月と日はシリアル値で、表示形式は"yy年mm年"、"d日"です。
    (Power Queryは項目名が無いシリアル値を日付と認識しません。取得後の日付けが整数になった場合は、型の変更で日付に変更してください。エラーになる場合は、Power Queryエディタの[カスタム列の追加]で式に「try #date(Date.Year([年月]), Date.Month([年月]), [属性]) otherwise null」や「Date.From(#date(1899, 12, 30) + #duration([年月], 0, 0, 0))」や「Date.AddDays(#date(1899,12,30), [シリアル値])」と入力して、日付に変えてください。)
  4. 左上の売上数のセルアドレスはA1です。
  5. 1つのフォルダに各店舗の売上実績と集計ファイルがあります。それ以外のファイルはありません。
  6. 集計ファイル名にみに"集計"という文字を含みます。
  7. 売上実績ブックには、実績以外のシートは入っていません。

課題:横項目は日付なので、シート毎に日付のシリアル値が異なります。なので、通常のフォルダーから取得する方法で"Content"列のBinaryを展開すると、異なるシリアル値のデータが縦に並び、列のデータが揃いません。そこで、本記事ではヘルパークエリで各シートの日付を1列に整形します。

3. 出力表

ピボットテーブル:Σ値=合計/売上、列=年月

店舗 商品 25/10 25/11 25/12 総計
A店 商品01 6 9 12 27
  商品02 9 12 15 36
  商品03 12 15 18 45
A店 集計   27 36 45 108
B店 商品01 9 12 15 36
  商品02 12 15 18 45
  商品03 6 9 12 27
B店 集計   27 36 45 108
総計   54 72 90 216

4. 手順例

§1 サンプルシートの作成

ヘルパークエリのパラメータのサンプルにするサンプルシートを作成します。後でこのシートをサンプルにしてヘルパークエリを作成します。

  1. 集計をファイル名に含む集計ブックを開き、[データ]-[データの取得v]-[ファイルから>]-[Excelブックから]でサンプルにするExcelブックを選択し[インポート]、サンプルにするシートを選択し[データの変換]、右の名前を"サンプルシート"に変更。
  2. 右の"ソース"と"ナビゲーション"以外のステップの左の×をクリックして削除。ソースとナビゲーションの2ステップだけにする。⇒サンプルシートが完成。

§2 パラメータの作成

  1. [ホーム]-[新しいソースv]-[その他のソース>]-[空のクエリ]で右の名前を"パラメータ1"に変更。
  2. 左の"パラメータ1"を右クリックし、[パラメータへ変換する]。
  3. [ホーム]-[詳細エディタ]で次のように修正し[完了]。⇒ヘルパークエリの"パラメータ1"が完成。

    "" meta [IsParameterQuery=true, Type="Any", IsParameterQueryRequired=true]
    ↓
    #"サンプルシート" meta [IsParameterQuery=true, BinaryIdentifier=#"サンプルシート", Type="Table", IsParameterQueryRequired=true]

§3 シートの整形ヘルパークエリの作成

サンプルシートをデータベース形式に変更するヘルパークエリを作成します。

  1. [ホーム]-[新しいソースv]-[その他のソース>]-[空のクエリ]で右の名前を"サンプルシートの変換"に変更。
  2. 数式バーに次の様に入力し、✓をクリックする。⇒サンプルシートが表示される。
    = パラメータ1
  3. 右の"変更された型"の左の×をクリックして削除。昇格されたヘッダーがあればそれも削除して、ソースだけにする。

ここからシートの表をデータベース形式にするステップを追加してください。シートの表の形により手順が異なります。以下の操作は、2.入力表の場合の手順例です。

  1. 店舗名のセルを右クリックし[ドリルダウン][*1]、数式バーの式をコピーしてメモ帳などに貼付けし、右の"ナビゲーション"の左の×をクリックして元に戻す。
    = ソース{0}[Column2]

    [*1]新しいクエリとして追加し、後で式をコピーした後に削除しても良いです。

  2. 年月のセルを右クリックし[ドリルダウン][*1]、数式バーの式をコピーしてメモ帳などに貼付けし、右の"ナビゲーション"の左の×をクリックして元に戻す。
    = ソース{0}[Column3]
  3. [ホーム]-[行の削除v]-[上位の行の削除]で行数に1を入力し[OK]。

  4. [変換]-[1行目をヘッダーとして使用v]-[1行目をヘッダーとして使用]。

  5. 右の最後の"変更された型"の左の×をクリックして削除。

  6. "商品"列を選択し、[変換]-[列のピボット解除v]-[その他の列のピボット解除]。

  7. 数式バーの"値"を"売上"に変更。

  8. [列の追加]-[カスタム列]で次のように入力し[OK]。
    新しい列名:日付
    カスタム列の式:= Date.AddDays(#date(1899, 12, 30), Number.FromText([属性]))

    解説:Excelの日付のシリアル値(整数)をPower Queryの日付形式に変換する式です。

  9. "属性"列を右クリックし[削除]。

  10. [列の追加]-[カスタム列]で次のように入力し[OK]。式には、先のステップでメモ帳などに貼り付けた式を入れる。
    新しい列名:店舗
    カスタム列の式:= ソース{0}[Column2]

  11. [列の追加]-[カスタム列]で次のように入力し[OK]。式には、先のステップでメモ帳などに貼り付けた式を入れる。
    新しい列名:年月
    カスタム列の式:= ソース{0}[Column3]

  12. "年月"列を選択し[変換]-[抽出v]-[範囲]で開始インデックスに2、文字数に5を入れ[OK]。

  13. 適当な列を選択し、Ctrl+aで全列選択し、[変換]-[データ型の検出]。適切ではない型を右クリックし[型の変更]で再設定し[現在のものを置換]する。(本例では、[売上]を"10進数"に変更。)
    251104pqsh1

  14. 左の"サンプルシートの変換"を右クリックし[関数の作成...]で関数名に"シートの変換"と入力し[OK]。⇒"シートの変換"関数クエリが完成
    251104pqsh2⇒クエリの並べ替え⇒251104pqsh3 

§4 集計クエリの生成

Excelのデータの取得のフォルダから全ブックの全シートを取得し、シートの変換関数クエリで整形してから結合します。

  1. 左の"その他のクエリ"を選択し、[ホーム]-[新しソースv]-[ファイル>]-[フォルダー]でフォルダを選択し[開く]-[データの変換]、右の名前を"集計"に変更。

  2. "Name"列の▼-[テキストフィルタ]-[次の値で始まらない]-[詳細設定]で次を入力し[OK]。
    および/または:列:演算子            :値
    _____:Name:次の値で始まらない:~$          // 一時ファイルを除く
    および:Name:指定の値を含まない:集計         // 集計ファイルを除く
    および:Extension:指定の値に等しい:.xlsx     // .xlsxのみ対象とする

  3. "Content"を選択し、Ctrlを押しながら"Name"を選択、右クリックし[他の列の削除]。

  4. [列の追加]-[カスタム列]で次のように入力し[OK]。
    新しい列名:カスタム
    カスタム列の式:= Excel.Workbook([Content], null, true)

解説:Excel.Workbook()は、Excelブックの内容(シート他)を返す関数です。これを次のステップで展開(Table.ExpandTableColumn)することにより、中身が行に展開されます。

  1. "カスタム"列の矢印アイコンをクリックし、"さらに読み込む"をクリックし、"Data"、"Item"、"Kind"のみチェックを残し、"元の列名をプレフィックスとして使用します"のチェックを外し[OK]。

  2. "Kind"列の▼-[テキストフィルター]-[指定の値に等しい]で値にSheetと入力し[OK]。

  3. [列の追加]-[カスタム関数の呼び出し]で次のように入力し[OK]。
    新しい列名:シートの変換
    関数クエリ:シートの変換
    パラメータ1:Data

解説:展開したシートの内容を関数クエリで1つずつ整形します。これを後のステップで展開(Table.ExpandTableColumn)することにより、中身が行に展開=整形した表が縦に並びます。(カスタム列の追加の場合の式:= シートの変換([Data]) )

注意:Table.Combineではないので、最初のシートに無い項目が後のシートに合っても展開されません。

  1. "Content"列を選択し、Ctrlを押しながら"Data"と"Kind"列を選択し、右クリックで[列の削除]。

  2. "シートの変換"列の矢印アイコンをクリックし、"さらに読み込む"をクリックし、"元の列名をプレフィックスとして使用します"のチェックを外し[OK]。

  3. 適当な列を選択し、Ctrl+aで全列選択し、[変換]-[データ型の検出]。適切ではない型を右クリックし[型の変更]で再設定し[現在のものを置換]する。(本例では、[売上]を"10進数"に変更。)

  4. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む]で"接続の作成のみ"を選択し[OK]でExcelに戻る。

§5 Excelシートに読み込む

  1. 右の"クエリと接続"の"集計"クエリを右クリックし[読み込み先…]で必要な形式を選択し[OK]。
    本例では"ピボットテーブル"を選択し[OK]。

  2. ピボットテーブルを選択し[ピボットテーブルのフィールド]-[ピボットテーブル]-[オプション]-[レイアウトと書式]で"更新時に列幅を自動調整する"のチェックを外す。

  3. [デザイン]-[レポートのレイアウト]-[表形式で表示]。

  4. [デザイン]-[小計v]-[すべての小計をグループの末尾に表示する]。

  5. "ピボットテーブルのフィールド"で次のように項目をドラッグする。
    列:[年月]。行:[店舗]、[商品]。Σ値:[売上]。

  6. データの変更、追加があれば、[データ]-[すべて更新v]-[すべて更新]で更新される。

5. サンプル

ダウンロード - 251104pqsh.zip

C:\Users\Public\Documents に展開します。C:\Users\Public\Documents\251104pqsh の下にファイルが展開されます。

6. 参考情報

表を整形する。ファイルを統合する。両方やらなくっちゃあならないってのがつらいところ、でもない。【Excel Power Query】
https://www.youtube.com/watch?v=PCThHqvQKIU
1シートの複数ブックの結合です。

【Excel パワークエリ】これを見ても、まだコピペでいいなんて言うヤツ……いねぇよなぁ
https://www.youtube.com/watch?v=UapvFSxv2mE
リスト(テータベース)形式の複数シートの複数ブックの結合です。

Power Query:複数のシートのデータを縦結合する(ヘルパークエリ編)
https://nandemo-xl.hatenablog.com/entry/2023/11/14/161634
1ブックの複数シートの結合です。

Power Queryのヘルパークエリは良いやつだし、カスタム関数はデバッグできる / @k_maki
https://qiita.com/k_maki/items/cab7a340ffc717ef1a4d
手動でヘルパークエリを作る方法が書かれています。

7. 関連記事

Power Queryで複数の表を結合する方法(まとめ):当ブログ : 2025/11/06
https://bigarrow.tea-nifty.com/blog/2025/11/post-341d5f.html

Power Queryで表をリスト形式に整形する方法(まとめ): 当ブログ : 2025/11/16
https://app.cocolog-nifty.com/cms/blogs/632678/entries/95708707
ヘルパークエリにはリスト形式に整形するステップを作成しますが、その参考になると思います。複数のクエリで整形する方法は、コードを修正して1クエリに統合してから、ヘルパークエリにします。

複数ブック、複数シートをPower Queryで1つの表にする方法(シート整形関数クエリ): 当ブログ : 2025/10/21
https://bigarrow.tea-nifty.com/blog/2025/10/post-4ad540.html
関数クエリの仕組みを知っておくと、ヘルパークエリを理解しやすいと思います。

複数ブック、複数シートをPower Queryで1つの表にする方法(2ヘルパークエリ): 当ブログ : 2025/11/03
https://bigarrow.tea-nifty.com/blog/2025/11/post-e6ea77.html
これは、効率が悪いですが、ヘルパークエリをネストする場合の参考になるかもしれません。

8. 余談

本ブログでは色々な方法をメモしていますが、複数ブック複数シートで整形後の項目が同じ場合は、本メモが良いと思います。

| | コメント (0)

複数ブック、複数シートをPower Queryで1つの表にする方法(2ヘルパークエリ)

1. 前置き

Excel Power Queryでフォルダからデータを取得するとヘルパークエリが作られますが、この時作られるヘルパークエリは、ファイルを変換するクエリです。
シートがクロス表等で横項目の値が異なる場合は、単純にシートを展開(Table.ExpandTableColumn)できないので、クリック操作では処理ができないという問題があります。

そこで、過去にPower Query Mの詳細エディタで、Table.Combineなどで縦結合するコードを記述する方法をメモしました。この方法は、シート整形後の項目が後で追加されても対応できます。その代わり、詳細エディタのコーディングは少々多めです。

Power QueryでExcelの複数のシートを縦結合する方法
https://bigarrow.tea-nifty.com/blog/2025/02/post-b425f3.html

次に、手動でシート整形関数クエリを作成し、2つのカスタム列の追加で、ブックとシートを処理して結合する方法を過去にメモしました。
詳細エディタでコードを書くのは1ヵ所だけなので、上記記事の「Table.Combine」より操作が簡単です。
但し、展開ボタンでは「Table.ExpandTableColumn」が使われるので、シートの整形後の表の項目は同じものに限ります。
1シートの整形クエリのピボット解除等の処理で項目を揃えることができるので、各シートの元の横項目が揃っていなくても結合することができます。但し、ヘルパークエリではないので、整形ステップを修正する場合は、サンプルシートの変換クエリを修正後、関数クエリにそのコードを手動で上書きする必要があるという欠点があります。

複数ブック、複数シートをPower Queryで1つの表にする方法(シート整形関数クエリ)
https://bigarrow.tea-nifty.com/blog/2025/10/post-4ad540.html

本記事では、Excelのフォルダからの取得で自動生成されるファイルの変換ヘルパークエリに、手動でシート整形ヘルパークエリを追加することで、サンプルクエリを修正すると関数クエリが連動して修正されるようにしたものです。なお、ファイルの変換ヘルパークエリは大したことをやっていないので、本記事より次の1ヘルパークエリの方法の方をお勧めします。

複数ブック、複数シートをPower Queryで1つの表にする方法(1ヘルパークエリ)
https://bigarrow.tea-nifty.com/blog/2025/11/post-d0f322.html

2. 入力表

Sheet1 Sheet2
売上 A店 25年10月  
商品 1日 11日 21日
商品01 1 2 3
商品02 2 3 4
商品03 3 4 5
売上 A店 25年11月  
商品 1日 11日 21日
商品01 1 2 3
商品02 2 3 4
商品03 3 4 5

条件

  1. 店舗別のブックに1ヶ月1シートの売上実績表があります。
  2. 1シートの表は次の様に縦に商品、横に日付が並んだクロス表です。
  3. 年月と日はシリアル値で、表示形式は"yy年mm年"、"d日"です。
    (日付けが整数の場合は、Power Queryエディタの[カスタム列の追加]で式に「try #date(Date.Year([年月]), Date.Month([年月]), [属性]) otherwise null」と入力して、日付に変えてください。)
  4. 左上の売上数のセルアドレスはA1です。
  5. 1つのフォルダに各店舗の売上実績と集計ファイルがあります。それ以外のファイルはありません。
  6. 集計ファイル名にみに"集計"という文字を含みます。
  7. 売上実績ブックには、実績以外のシートは入っていません。

横項目は日付なので、シート毎に日付のシリアル値が異なります。なので、通常のフォルダーから取得する方法で"Content"列のBinaryを展開すると、異なるシリアル値のデータが縦に並び、列のデータが揃いません。

3. 出力表

合計/売上、年月

店舗 商品 25/10 25/11 25/12 総計
A店 商品01 6 9 12 27
  商品02 9 12 15 36
  商品03 12 15 18 45
A店 集計   27 36 45 108
B店 商品01 9 12 15 36
  商品02 12 15 18 45
  商品03 6 9 12 27
B店 集計   27 36 45 108
総計   54 72 90 216

4. 手順例

ファイルの変換ヘルパークエリと集計クエリの生成

Excelのデータの取得のフォルダーからで、ファイルの変換ヘルパークエリを生成します。

  1. 集計字をファイル名に含む集計ブックを開き、[データ]-[データの取得v]-[ファイルから>]-[フォルダーから]でフォルダを選択し[開く]-[データの変換]、右の名前を"集計"に変更。

  2. "Name"列の▼-[テキストフィルタ]-[次の値から始まらない]-[詳細設定]で次を入力し[OK]。
    および/または:列:演算子            :値
    _____:Name:次の値で始まらない:~$          // 一時ファイルを除く
    および:Name:指定の値を含まない:集計         // 集計ファイルを除く
    および:Extension:指定の値に等しい:.xlsx     // .xlsxのみ対象とする

  3. "Content"とCtrlを押しながら"Name"を選択、右クリックし[他の列の削除]。

  4. "Content"の矢印ボタン(ファイルの結合)をクリックし、フォルダーアイコン(パラメータ1)を選択して[OK]。⇒ヘルパークエリが生背される。
    251103pqsh1
  5. "集計"クエリの最後のステップの"変更された型"の左の×をクリックして削除。

シートの整形ヘルパークエリの作成

"サンプルファイルの変換"から1つのシートをサンプルにしてデータベース形式に変更するヘルパークエリを作成します。シートの表の形により手順が異なります。以下の操作は、2.入力表の場合の手順例です。

  1. 左の"サンプルファイルの変換"クエリを右クリックして[複製]、右の名前を"サンプルシート"に変更。
  2. "Data"列の1つのTableを右クリックし[ドリルダウン]。
    251103pqsh2
  3. 右の最後の"変更された型"の左の×をクリックして削除。⇒パラメータ2の初期値になる"サンプルシート"が完成。
  4. [ホーム]-[新しいソースv]-[その他のソース.]-[空のクエリ]で右の名前を"パラメータ2"に変更。
  5. 左の"パラメータ2"を右クリックし、[パラメータへ変換する]。
  6. [ホーム]-[詳細エディタ]で次のように修正。⇒ヘルパークエリの"パラメータ2"が完成。

    "" meta [IsParameterQuery=true, Type="Any", IsParameterQueryRequired=true]
    ↓
    #"サンプルシート" meta [IsParameterQuery=true, BinaryIdentifier=#"サンプルシート", Type="Table", IsParameterQueryRequired=true]

  7. [ホーム]-[新しいソースv]-[その他のソース.]-[空のクエリ]で右の名前を"サンプルシートの変換"に変更。
  8. 数式バーに次の様に入力し、✓をクリックする。⇒サンプルシートが表示される。
    = パラメータ2
  9. 右の"変更された型"の左の×をクリックして削除。

ここからシートの表をデータベース形式にするステップを追加してください。以下の手順は例です。

  1. [列の追加]-[条件列]で次のように入力し[OK]。[]は列の選択で入力。
    新しい列名:カスタム
    列名         :演算子              :値   :出力
    [Column1]:指定の値に等しい:売上:[Column2]
    それ以外の場合
    null

  2. [列の追加]-[条件列]で次のように入力し[OK]。
    新しい列名:カスタム.1
    列名         :演算子              :値   :出力
    [Column1]:指定の値に等しい:売上:[Column3]
    それ以外の場合
    null

  3. "カスタム"列を選択し、Ctrlを押しながら"カスタム.1"列を選択し、[変換]-[フィルv]-[下へ]。

  4. [列の追加]-[条件列]で次のように入力し[OK]。
    新しい列名:カスタム.2
    列名         :演算子              :値   :出力
    [Column1]:指定の値に等しい:商品:店舗
    それ以外の場合
    [カスタム]

  5. [列の追加]-[条件列]で次のように入力し[OK]。
    新しい列名:カスタム.3
    列名         :演算子              :値   :出力
    [Column1]:指定の値に等しい:商品:年月
    それ以外の場合
    [カスタム.1]

  6. "カスタム"列を選択し、Ctrlを押しながら"カスタム.1"列を選択し、右クリックで[列の削除]。

  7. [ホーム]-[行の削除v]-[上位の行の削除]で行数に1を入力し[OK]。

  8. [変換]-[1行目をヘッダーとして使用v]-[1行目をヘッダーとして使用]。

  9. 右の最後の"変更された型"の左の×をクリックして削除。

  10. "年月"列を選択し、Ctrlを押しながら"店舗"と"商品"列を選択し、[変換]-[列のピボット解除v]-[その他の列のピボット解除]。

  11. 数式バーの"値"を"売上"に変更。

  12. [列の追加]-[カスタム列]で次のように入力し[OK]。
    新しい列名:日付
    カスタム列の式:= Date.AddDays(#date(1899, 12, 30), Number.FromText([属性]))

    解説:Excelの日付のシリアル値(整数)をPower Queryの日付形式に変換する式です。

  13. "属性"列を右クリックし[削除]。

  14. "年月"列を選択し[変換]-[抽出v]-[範囲]で開始インデックスに2、文字数に5を入れ[OK]。

  15. 適当な列を選択し、Ctrl+aで全列選択し、[変換]-[データ型の検出]。適切ではない型を右クリックし[型の変更]で再設定し[現在のものを置換]する。(本例では、[売上]を"10進数"に変更。)
    251103pqsh3

  16. 左の"サンプルシートの変換"を右クリックし[関数の作成...]で関数名に"シートの変換"と入力し[OK]。⇒"シートの変換"関数クエリが完成
    251103pqsh4⇒クエリの並べ替え⇒ 251103pqsh5

"サンプルファイルの変換"クエリの修正

"サンプルファイルの変換"クエリに"サンプルシートの変換"関数クエリを呼び出すステップを追加します。

  1. 左の"サンプルファイルの変換"クエリを選択し、"Kind"列の▼-[テキストフィルター]-[指定の値に等しい]で値にSheetと入力し[OK]。
  2. [列の追加]-[カスタム列]で次のように入力し[OK]。
    新しい列名:カスタム
    カスタム列の式:= シートの変換([Data])
  3. "Item"列を選択し、Ctrlを押しながら"カスタム"列を選択し、右クリックして[他の列の削除]。
  4. "カスタム"列の矢印アイコンをクリックし、"更に読み込む"をクリックし、"元の列名をプレフィックスとして使用します"のチェックを外し[OK]。

集計クエリの作成

  1. 左の"集計"クエリを選択し、右の"削除された他の列"の歯車アイコンをクリックし、"Name"にチェックを入れて[OK]。

  2. 右の最後のステップを選択し、中央の表をクリックし、[変換]-[データ型の検出]。適切ではない型を右クリックし[型の変更]で再設定し[現在のものを置換]する。(本例では、[売上]を"10進数"に変更。)

  3. [ホーム]-[閉じて読み込むv]-[閉じて次に読み込む...]で"接続の作成のみ"を選択し[OK]でExcelに戻る。

Excelシートに読み込む

  1. 右の"クエリと接続"の"集計"クエリを右クリックし[読み込み先…]で必要な形式を選択し[OK]。
    本例では"ピボットテーブル"を選択し[OK]。

  2. ピボットテーブルを選択し[ピボットテーブルのフィールド]-[ピボットテーブル]-[オプション]-[レイアウトと書式]で"更新時に列幅を自動調整する"のチェックを外す。

  3. [デザイン]-[レポートのレイアウト]-[表形式で表示]。

  4. [デザイン]-[小計v]-[すべての小計をグループの末尾に表示する]。

  5. "ピボットテーブルのフィールド"で次のように項目をドラッグする。
    列:[年月]。行:[店舗]、[商品]。Σ値:[売上]。

  6. データの変更、追加があれば、[データ]-[すべて更新v]-[すべて更新]で更新される。

5. サンプル

ダウンロード - 251103pqsh.zip

C:\Users\Public\Documents に展開します。C:\Users\Public\Documents\251103pqsh の下にファイルが展開されます。

6. 参考情報

表を整形する。ファイルを統合する。両方やらなくっちゃあならないってのがつらいところ、でもない。【Excel Power Query】
https://www.youtube.com/watch?v=PCThHqvQKIU
1シートの複数ブックの結合です。

【Excel パワークエリ】これを見ても、まだコピペでいいなんて言うヤツ……いねぇよなぁ
https://www.youtube.com/watch?v=UapvFSxv2mE
リスト(テータベース)形式の複数シートの複数ブックの結合です。

Power Query:複数のシートのデータを縦結合する(ヘルパークエリ編)
https://nandemo-xl.hatenablog.com/entry/2023/11/14/161634
1ブックの複数シートの結合です。

7. 関連記事

Power Queryで複数の表を結合する方法(まとめ)
https://bigarrow.tea-nifty.com/blog/2025/11/post-341d5f.html

Power Queryで表をリスト形式に整形する方法(まとめ)
https://bigarrow.tea-nifty.com/blog/2025/11/post-4925ca.html

8. 余談

Excelのフォルダーからのデータ取得で生成されるファイルの変換ヘルパークエリは、項目が揃っていない複数シートがある場合に利用価値がありません。なので、1. まとめの最後に紹介した、ファイルの変換を使用しない1ヘルパークエリの方法がシンプルです。

| | コメント (0)

« 2025年10月 | トップページ | 2025年12月 »