Excel (一般機能)

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

 
(Windows 10 Pro : Excel 2019)
列数が決まっていないパワークエリ横結合
投稿日時: 23/08/19 16:20:30
投稿者: ラングドシャ

お願いいたします。
d:\test にファイルにエクセルファイルが保存されています。ファイル名は不規則です。
ファイルは今後増えていく予定で、現在は10程度。増えればその分だけ横に伸ばしていきたいと思っています。
A〜D列の項目は固定されておりますが、E列から右は日付の項目で何列あるか決まっていません。
右へ行くほど新しい日付となります。
また、ファイルをまたいで日付が重複している場合があります。
行数(品番数)もファイルごとに違う場合があります。
 
品番(文字列)を軸に横に結合したく、おそらくパワークエリが適切だと思いますが、列数が
未定の場合の横に結合する方法が分からず質問いたしました。
よろしくお願いいたします。
 
<CD01_1.xlsx>

	A	B	C	D	  E	     F	      G
1	CD	品番	商品名	分類	 20230626	20230627	20230628
2	CD01	49001	ほうき	掃除	 335	     321	     326
3	CD01	49002	チップ	化粧品	 294	     325	     319
4	CD01	49003	ネット	洗濯	 279       297 	     296
5	CD01	49004	ピン黒	ヘア	 290	     252	     253
6	CD01	49005	飾ゴム	ヘア	 154	     178       162
7	CD01	49006	シール	雑貨	 113	     139	     139
8	CD01	49007	ロープ	雑貨	 205	     215	     209
9	CD01	49008	コーム	ヘア	 175	     167       163
10	CD01	49009	付箋	文房具	 221	     231	     213

 
<CD01_20230628.xlsx>
	A	B	C	D	 E	     F
1	CD	品番	商品名	分類	 20230628	20230629
2	CD01	49001	ほうき	掃除	 326	     349
3	CD01	49002	チップ	化粧品	 319	     302
4	CD01	49003	ネット	洗濯	 296	     258
5	CD01	49004	ピン黒	ヘア	 253	     238
6	CD01	49005	飾ゴム	ヘア	 162        153
7	CD01	49006	シール	雑貨	 139	     118
8	CD01	49007	ロープ	雑貨	 209        225
9	CD01	49008	コーム	ヘア	 163	     138
10	CD01	49009	付箋	文房具	 213	     233
11	CD01	49010	櫛1	ヘア		     199
12	CD01	49011	綿花	化粧品		     198

 
 
<このように結合したい>
※重複列は削除したい
※増えた品番は追加したい
※CD、分類は削除したい
	A	B	 C	     D	     E	     F
1	品番	商品名	 20230626	20230627	20230628	20230629
2	49001	ほうき	 335	    321	    326	    349
3	49002	チップ	 294	    325	    319    	302
4	49003	ネット	 279	    297	    296    	258
5	49004	ピン黒	 290    	252   	253    	238
6	49005	飾ゴム	 154   	178	    162	    153
7	49006	シール	 113	    139	    139	    118
8	49007	ロープ	 205   	215	    209   	225
9	49008	コーム	 175	    167	    163	    138
10	49009	付箋	 221   	231    	213   	233
11	49010	櫛1				            199
12	49011	綿花			             	198

 
よろしくお願いいたします。
 

回答
投稿日時: 23/08/19 18:43:44
投稿者: WinArrow

掲示の表は「表形式」と呼ばれる形式です。
これを「リスト形式」に変換する必要があります。
 
品番    商品名 日付   数量
49001    ほうき 20230626 335
49001    ほうき 20230627 321
49001    ほうき 20230628 326
 
のような形式です。
手操作では、ピボットウイザードを使います。
その後、Power Queryでテーブル結合ができると思います。
 
私は、ピボットウイザードは、リスト形式から表形式にすること以外は
使ったことがないので、アドバイスできません。
使用方法をWEB検索してみてください。

回答
投稿日時: 23/08/19 23:23:07
投稿者: WinArrow

ピボットテーブルウイザードを使って、表形式をリスト形式に変換してみました。
 
<CD01_20230628.xlsx>を題材にしました。
 
結果

行	列	値
49001	20230628	326
49001	20230629	349
49002	20230628	319
49002	20230629	302
49003	20230628	296
49003	20230629	258
49004	20230628	253
49004	20230629	238
49005	20230628	162
49005	20230629	153
49006	20230628	139
49006	20230629	118
49007	20230628	209
49007	20230629	225
49008	20230628	163
49008	20230629	138
49009	20230628	213
49009	20230629	233
49010	20230628	
49010	20230629	199
49011	20230628	
49011	20230629	198

 
WEBページ紹介
https://dekiru.net/article/20383/

回答
投稿日時: 23/08/21 09:25:17
投稿者: gombohori

こんな感じではどうでしょう

let
    ソース = Folder.Files("d:\test"),
    フィルター選択された非表示のファイル = Table.SelectRows(ソース, each [Attributes]?[Hidden]? <> true),
    読込み関数 = ( file as binary) =>
    let
        xlsx = Excel.Workbook(file, null, true),
        Sheet1_Sheet = xlsx{[Item="Sheet1",Kind="Sheet"]}[Data],
        昇格されたヘッダー数 = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]),
        変更された型 = Table.TransformColumnTypes(昇格されたヘッダー数,{{"CD", type text}, {"品番", Int64.Type}, {"商品名", type text}, {"分類", type text}}),
        ピボット解除された他の列 = Table.UnpivotOtherColumns(変更された型, {"CD", "品番", "商品名", "分類"}, "日付", "値"),
        変更された型1 = Table.TransformColumnTypes(ピボット解除された他の列,{{"日付", type date}})
    in
        変更された型1,
    カスタム関数の呼び出し = Table.AddColumn(フィルター選択された非表示のファイル, "読込ファイル", each  読込み関数([Content])),
    名前が変更された列 = Table.RenameColumns(カスタム関数の呼び出し, {"Name", "Source.Name"}),
    削除された他の列 = Table.SelectColumns(名前が変更された列, {"Source.Name", "読込ファイル"}),
    展開された読込ファイル = Table.ExpandTableColumn(削除された他の列, "読込ファイル", {"CD", "品番", "商品名", "分類", "日付", "値"}, {"CD", "品番", "商品名", "分類", "日付", "値"}),
    ピボットされた列 = Table.Pivot(Table.TransformColumnTypes(展開された読込ファイル, {{"日付", type text}}, "ja-JP"), List.Distinct(Table.TransformColumnTypes(展開された読込ファイル, {{"日付", type text}}, "ja-JP")[日付]), "日付", "値", List.Sum)
in
    ピボットされた列

投稿日時: 23/08/21 14:13:02
投稿者: ラングドシャ

WinArrowさん
リスト形式でないと集計などが難しいのですね。
表形式で作成されるファイルはとても多いです。
取引先から提供されるファイルだと修正依頼するわけにもいかないので、ご紹介いただいたwebページを
参考にさせていただきます。
ありがとうございました。
 
 
gombohoriさん
ありがとうございます。
おおむね横結合に成功したのですが、以下のような結合になってしまいました。
品番を軸にまとめることは可能でしょうか?
一旦、読み込んでからピボットテーブルでまとめるのが妥当ですか?
もし何か方法があればご指導お願いします。
 

	A	B	 C	     D	     E	     F
1	品番	商品名	 20230626	20230627	20230628	20230629
2	49001	ほうき	 335	    321	    326	    
3	49002	チップ	 294	    325	    319    	
4	49003	ネット	 279	    297	    296    	
5	49004	ピン黒	 290    	252   	253    	
6	49005	飾ゴム	 154   	178	    162	    
7	49006	シール	 113	    139	    139	    
8	49007	ロープ	 205   	215	    209   	
9	49008	コーム	 175	    167	    163	    
10	49009	付箋	 221   	231    	213   	

11	49001	ほうき	 335	    321	    326	    349
12	49002	チップ	 294	    325	    319    	302
13	49003	ネット	 279	    297	    296    	258
14	49004	ピン黒	 290    	252   	253    	238
15	49005	飾ゴム	 154   	178	    162	    153
16	49006	シール	 113	    139	    139	    118
17	49007	ロープ	 205   	215	    209   	225
18	49008	コーム	 175	    167	    163	    138
19	49009	付箋	 221   	231    	213   	233
20	49010	櫛1				            199
21	49011	綿花			             	198

 

回答
投稿日時: 23/08/21 15:23:23
投稿者: gombohori

まとめるっていっても、どうまとめるのか書いてないので、考え方だけ書きます。
最後にピボットする前に、品番と日付でグループ化すればいいです
グループ化するときの計算方法はいくつかの方法から選択できます

回答
投稿日時: 23/08/21 16:54:22
投稿者: sk

引用:
d:\test にファイルにエクセルファイルが保存されています。ファイル名は不規則です。
ファイルは今後増えていく予定で、現在は10程度。増えればその分だけ横に伸ばしていきたいと思っています。
A〜D列の項目は固定されておりますが、E列から右は日付の項目で何列あるか決まっていません。
右へ行くほど新しい日付となります。

引用:
※重複列は削除したい
※増えた品番は追加したい
※CD、分類は削除したい

(詳細エディタ)
------------------------------------------------------------
let
    GetTable = (File as binary, SheetName as text) =>
        let
            Source = Excel.Workbook(File, null, true),
            FirstSheet = Source{[Item=SheetName,Kind="Sheet"]}[Data],
            PromotedHeaders = Table.PromoteHeaders(FirstSheet, [PromoteAllScalars=true])
        in
            PromotedHeaders,
    GetFiles = Folder.Files("D:\test"),
    InvokedCustomFunction = Table.AddColumn(GetFiles, "Sheet1", each GetTable([Content], "Sheet1")),
    CombinedTable = Table.Combine(InvokedCustomFunction[Sheet1]),
    UnpivotedOtherColumns = Table.UnpivotOtherColumns(CombinedTable, {"CD", "品番", "商品名", "分類"}, "ColumnName", "ColumnValue"),
    RemovedColumns = Table.RemoveColumns(UnpivotedOtherColumns,{"CD", "分類"}),
    RemovedDuplicates = Table.Distinct(RemovedColumns),
    SortedRows = Table.Sort(RemovedDuplicates,{{"品番", Order.Ascending}, {"ColumnName", Order.Ascending}}),
    PivotedColumn = Table.Pivot(SortedRows, List.Distinct(SortedRows[ColumnName]), "ColumnName", "ColumnValue")
in
    PivotedColumn
------------------------------------------------------------
 
こんな感じのクエリを作成できれば良い、ということでしょうか。

投稿日時: 23/08/21 17:18:01
投稿者: ラングドシャ

gombohoriさん
skさん
 
すみません。
ちょっと別件で取り込んでおり、確認ができていません。
明日以降確認しご報告いたします。
ありがとうございます。

投稿日時: 23/08/22 16:04:07
投稿者: ラングドシャ

gombohoriさん
返信遅くなりました。
結果的にピボットの前に品番と日付で重複の削除をして、望む結果を得ることができました。
ありがとうございました。
 
skさん
返信おそくなりました。
いただいたクエリにて問題なく結合することができました。
ステップで確認しながら何を行っているか見てみます。
ありがとうございました。