Excel (一般機能)

Excelの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
パワークエリでファイル結合前のファイル毎にインデックス列を付番したい。
投稿日時: 25/02/02 11:30:39
投稿者: mild2

2022年ファイル 項目名+データ10行
2023年ファイル 項目名+データ10行
2024年ファイル 項目名+データ10行
上記の3つのファイルをパワークエリで「結合と読み込み」で結合出来ました。
単純に結合したので、項目名3行、データ30行、合計33行のデータになりました。
 
次に、0から始まるインデックス列を追加しました。
 
次に、「1行目をヘッダーにする」
 
次に、結合前の各ファイルの項目名の行を除外するために、インデックス列でフィルターをし「0」を除外したら完成。となるはずなのです。
 
しかし、インデックス列の付番が、結合前の各ファイル毎に0~10と付番されるはずなのですが、そうならなくて、結合後の全データについて0~32と付番されてしまうのです。私の操作手順でどこが間違っていますでしょうか?
今回の手順で参考にしたYOUTUBEが↓です。
https://www.youtube.com/watch?v=77yd-p5YiLE&list=PLdmuk44hJIQ7pxHkd9vZxIutg1WoeonDv 
 
この動画の10分40秒から、11分50秒に掛けて述べられています。
 

回答
投稿日時: 25/02/02 12:24:32
投稿者: んなっと

E:\office\Excel\ExcelVBA\11 内のブックごとに連番を付けて、最後に統合する場合。
 
let
    MltIdx = (Param) => let
            Src = Excel.Workbook(Param, null, true),
            Sht = Src{0}[Data],
            Prm = Table.PromoteHeaders(Sht, [PromoteAllScalars=true]),
            Idx = Table.AddIndexColumn(Prm, "インデックス", 1, 1, Int64.Type)
        in
            Idx,

    ソース = Folder.Files("E:\office\Excel\ExcelVBA\11"),
    Sel = Table.SelectRows(ソース, each [Attributes]?[Hidden]? <> true),
    Add = Table.AddColumn(Sel, "Custom", each MltIdx([Content])),
    Del = Table.SelectColumns(Add,{"Custom"}),
    Exp = Table.ExpandTableColumn(Del, "Custom", Table.ColumnNames(Del[Custom]{0}))
in
    Exp

投稿日時: 25/02/02 12:45:29
投稿者: mild2

ありがとうございます。
えっ、そんなに複雑な式が必要なんですか?
勿論、その方法で出来ると思いますが、動画ではそんな複雑な手順は一切無くて、普通にさらっとインデックス列の挿入をされて各ファイル毎に付番されています。動画の様にシンプルな方法では出来ないでしょうか?

回答
投稿日時: 25/02/02 14:18:02
投稿者: んなっと

連番はあくまで途中の手段でなんですね。
目的は列数と列の配置は同じだが列名が少しだけ違っている複数のブックを統合すること。
[サンプルファイルの変換]のほうでインデックス列を追加するんですよ。
動画をよく見てください。
一番下の方の[その他のクエリ]の方ではありません。
 
ヘルパークエリを使わず、詳細エディターを使う方法だとこんな感じ。
 
let
    MltExp = (Param) => let
            Src = Excel.Workbook(Param),
            Sht = Src{0}[Data],
            Idx = Table.AddIndexColumn(Sht, "インデックス", 0, 1, Int64.Type)
        in
            Idx,

    ソース = Folder.Files("E:\office\Excel\ExcelVBA\11"),
    Sel = Table.SelectRows(ソース, each [Attributes]?[Hidden]? <> true),
    Add = Table.AddColumn(Sel, "Custom", each MltExp([Content])),
    Del = Table.SelectColumns(Add,{"Custom"}),
    Exp = Table.ExpandTableColumn(Del, "Custom", Table.ColumnNames(Del[Custom]{0})),
    Prm = Table.PromoteHeaders(Exp, [PromoteAllScalars=true]),
    Flt = Table.SelectRows(Prm, each ([0] <> 0)),
    Del2 = Table.RemoveColumns(Flt,{"0"})
in
    Del2

投稿日時: 25/02/02 17:56:42
投稿者: mild2

ご指摘の通り一番下の「その他のクエリ」でやっていました。
ですので「サンプルファイルの変換」でやり直しましたが、同じ症状で変わりませんでした。(^_^;)

回答
投稿日時: 25/02/02 22:17:00
投稿者: んなっと

シート名が統一されていないと、2番目のブック以降がエラーになると思います。
 
Src = Excel.Workbook(Param),
Sht = Src{0}[Data],
Idx = Table.AddIndexColumn(Sht, "インデックス", 0, 1, Int64.Type)

 
を参考にして、サンプルファイルの変換を詳細エディターで書き換えなければなりません。
中括弧の中身を0にする。
{[…………]}[Data],

{0}[Data],

回答
投稿日時: 25/02/02 22:24:14
投稿者: んなっと

上の書き込みはフォルダーを一括取り込みして統合する場合です。
状況が違えば、別の原因かもかもしれません。

回答
投稿日時: 25/02/03 11:14:23
投稿者: んなっと

Table.ExpandTableColumnの行もTable.Combineに変更すると汎用性が高まります。
 
let
    MltExp = (Param) => let
            Src = Excel.Workbook(Param),
            Sht = Src{0}[Data],
            Idx = Table.AddIndexColumn(Sht, "インデックス", 0, 1, Int64.Type)
        in
            Idx,
    ソース = Folder.Files("E:\office\Excel\ExcelVBA\11"),
    Sel = Table.SelectRows(ソース, each [Attributes]?[Hidden]? <> true),
    Add = Table.AddColumn(Sel, "Custom", each MltExp([Content])),
    Del = Table.SelectColumns(Add,{"Custom"}),
    Cmb = Table.Combine(Del[Custom]),
    Prm = Table.PromoteHeaders(Cmb, [PromoteAllScalars=true]),
    Flt = Table.SelectRows(Prm, each ([0] <> 0)),
    Del2 = Table.RemoveColumns(Flt,{"0"})
in
    Del2

投稿日時: 25/02/05 21:50:01
投稿者: mild2

お返事遅くなってしまいました。
「シート名が統一されていないと、2番目のブック以降がエラーになると思います。」
↑ はい、シート名が統一されていませんでした。シート名を統一しなければならないというのを知りませんでした。無地解決いたしました。色々詳しくご教示頂きましてありがとうございました。