[[20260716155615]] 『クエリを使用して大量のファイルからデータを抽出』(フリオ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『クエリを使用して大量のファイルからデータを抽出したい』(フリオ)

sharepoint上に年のフォルダがあり、その中に月のフォルダがあり、更にその中に同じフォーマットのexcelファイルが入っています(ファイル名は全部違います)。

この各excelファイルのA1セルとB1セルに入力された値を抽出したいのです。
ネットで調べると、ヘルパークエリを使用してドリルダウンをする方法が記載されていました。
その方法を使用すると値を抽出することができましたが、ものすごく遅くて時間がかかります。だいたい1秒に2〜3ファイル程度読み込む速度です。
おまけにこの方法では二つ目のセルから抽出する方法が私にはわかりません。
ヘルパークエリが遅いのかと思い、ヘルパークエリを使用しない方法をさがしているのですが、見つけられません。
ご教示お願いいたします。

現在の方法
1.データの取得→ファイルから→sharepointフォルダーから
2.sharepointのURLを入力
3.結合→データの結合と変換
4.サンプルファイルを選択→SHEET1というシートを選択
5.左の欄のサンプルファイルの変換からcolumn1,1を右クリックしてドリルダウン
6.テーブルへの変換
7.閉じて読み込む
となります。

クエリのステップ欄には
ソース:= SharePoint.Files("https://〜〜〜", [ApiVersion = 15])
フィルター選択された非表示のFile1:= Table.SelectRows(ソース, each [Attributes]?[Hidden]? <> true)
カスタム関数の呼び出し1:= Table.AddColumn(#"フィルター選択された非表示の File1", "ファイルの変換", each ファイルの変換([Content]))
名前が変更された列1:= Table.RenameColumns(カスタム関数の呼び出し1, {"Name", "Source.Name"})
削除された他の列1:= Table.SelectColumns(#"名前が変更された列 1", {"Source.Name", "ファイルの変換"})
展開されたテーブル列1:= Table.ExpandTableColumn(削除された他の列1, "ファイルの変換", Table.ColumnNames(ファイルの変換(#"サンプル ファイル")))
となっています。

サンプルファイルの変換には
ソース:= Excel.Workbook(パラメーター1, null, true)
ナビゲーション:= ソース{[Item="SHEET1",Kind="Sheet"]}[Data]
昇格されたヘッダー数5:= Table.PromoteHeaders(SHEET1_Sheet, [PromoteAllScalars=true])
Column1:= 昇格されたヘッダー数{0}[Column1]
テーブルに変換済み:= #table(1, {{Column1}})
となっています。

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


 #全然関係ないかもだけど
  > Excel.Workbook(パラメーター1, null, true)
   変更: Excel.Workbook(パラメーター1, false, true)
   第2引数が null or true のとき ヘッダーを設定するため型推論のために全データ走査が入るらしい

 #ボトルネック調査のための機能があるらしい
 https://qiita.com/spumoni/items/c8223c98d6ae575bd047 
 ダメだったら↑で各アクションの所用時間がわかるらしいのでどこがボトルネックか調べてみる とか

 ちなみに power query を使うexcelはweb版とローカルどっちですか?
(ちくわ) 2026/07/16(木) 17:07:25

ちくわ様

回答ありがとうございます。
nullをfalseに変えてみましたが、変わらなかったです。
診断機能を使用したかったのですが、オプションの診断の欄を押してもクエリ診断の欄がありませんでした。
(フリオ) 2026/07/17(金) 08:31:33


「A1セルとB1セルに入力された値を抽出したい」とありますが、「サンプルファイルの変換」クエリで「昇格されたヘッダー数」を実行しているので、実際には2行目に抽出したい値があるのではないかと思われます

それはともかくとして「各excelファイル」にはテーブル書式が設定されていませんよね?
それだとシートを丸ごと読み込むことになります

「サンプルファイルの変換」クエリの「昇格されたヘッダー数{0}[Column1]」の部分で「{0}」とやってしまうと、全てのデータ範囲を読み込んでから、その中の1つ目を参照することになるはずです

「ナビゲーション」から後のステップを全部削除

数式バーの「fx」ボタンを押して(カスタム1)
= Table.FirstN(ナビゲーション,2)[[Column1], [Column2]]

[変換]の「1行目をヘッダーとして使用」をクリック

にしたほうが多分軽くなると思います
(d-q-t-p) 2026/07/17(金) 09:55:43


d-q-t-p様

回答ありがとうございます。
やってみましたが、
Expression.Error: 名前 'ナビゲーション' を認識できません。綴りが正しいことを確認してください。
と表示されて「1行目をヘッダーとして使用」が押せません。
(フリオ) 2026/07/17(金) 10:19:43


 変数名:ナビゲーション
 じゃなくて ステップ名:ナビゲーション
 変数名:SHEET1_Sheet か ソース{[Item="SHEET1",Kind="Sheet"]}[Data]
 なのかな

 = Table.FirstN(SHEET1_Sheet,2)[[Column1], [Column2]] または
 = Table.FirstN(ソース{[Item="SHEET1",Kind="Sheet"]}[Data],2)[[Column1], [Column2]]

 だと動くかな?
(ちくわ) 2026/07/17(金) 14:28:04

ちくわさん、フォローありがとうございます
「ナビゲーション」はステップ名ではなかったですね

= Table.FirstN(SHEET1_Sheet,2)[[Column1], [Column2]]

としないとダメです

アイテムアクセス(「{[Item="SHEET1",Kind="Sheet"]}」の部分)を使うと重くなるので、そっちはやめたほうがいいです
(d-q-t-p) 2026/07/17(金) 15:06:53


ちくわ様、d-q-t-p様
この方法ですとエラーが消えました。
しかし、クエリ内のファイルの変換列が「Table」となって値を抽出できなくなりました。
また、抽出する速度も前より少し早くなったかな?程度です。
3〜4ファイル/秒くらいの速度になりました。
sharepointからの抽出はこれが限界なのですかね。
(フリオ) 2026/07/17(金) 15:44:56

 ファイルアクセスがネックであれば実行時の処理の遅さはそのままだと解決案思いつかないですね。
 事前にPower Automateでsharepointの保存ファイルが更新されたときって
 条件で excel / MS Lists / Dateverse などに集計しておいて
 ローカルではまとめたデータにアクセスするのが早いでしょうか。

 geminiに聞くと .FirstN ではなく .SelectRowsで指定すると早くなるらしい
 power queryは普段触らないので動作チェックしてません。

 ```M
 let
    ソース = SharePoint.Files("https://〜〜〜", [ApiVersion = 15]),

    対象ファイルの抽出 = Table.SelectRows(ソース, each [Attributes]?[Hidden]? <> true and [Extension] = ".xlsx"),

 レコードのリスト = Table.TransformRows(対象ファイルの抽出, each 
        let
            Excelブック = Excel.Workbook([Content], false, true),
         // ナビゲーションでsheet名を検索していたものを検索せずに文字列で指定
         // .FistN()は1行目を抜き出すために全体を取得するらしい

            SHEET1のデータ = Table.SelectRows(Excelブック, each [Item] = "SHEET1" and [Kind] = "Sheet"){0}[Data],

            idx = 0, // ← ヘッダーがあるなら 1
            // インデックスでセルの値を取得
            A1の値 = SHEET1のデータ{idx}[Column1], 
            B1の値 = SHEET1のデータ{idx}[Column2]
        in
            // 「ファイル名」「A1」「B1」だけのミニマムなレコード(行)を作る
            [ファイル名 = [Name], A1セル = A1の値, B1セル = B1の値]
    ),
   出力データ = Table.FromRecords(レコードのリスト)
 in
    出力データ
 ```
(ちくわ) 2026/07/17(金) 17:03:31

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.