Power Query 実務テンプレ | データ取込・更新系:Web上CSV自動取込

Excel VBA Power Query M Formula Language
スポンサーリンク

ゴールのイメージをそろえる

今回のテーマは「Web 上に公開されている CSV ファイルを、Power Query で“自動で取り込み・更新できる状態”にする実務テンプレ」です。
ローカルのフォルダではなく、URL から直接 CSV を読みに行くパターンですね。

やりたいことはシンプルで、次の二つです。
URL を指定して CSV をテーブルとして読み込む。
更新ボタンを押すだけで、常に最新の CSV 内容に置き換わるようにしておく。

ここに「日付付き URL」「パラメータ付き URL」などを足していくと、一気に“実務レベル”になります。


基本の考え方とキーワード

Web.Contents と Csv.Document の組み合わせ

ローカルファイルのときは File.Contents("C:\...") を使いましたが、
Web 上のファイルの場合は Web.Contents("https://...") を使います。

流れはこうです。

Web.Contents(URL) で「URL の中身(バイナリ)」を取得する。
そのバイナリを Csv.Document に渡して「テーブル」に変換する。

ローカルの CSV でやっていた

File.Contents → Csv.Document → Table.PromoteHeaders

の「File.Contents」が「Web.Contents」に変わるだけ、と考えるとイメージしやすいです。


例題1:固定 URL の Web 上 CSV を自動取込するテンプレ

想定する状況

例えば、こんな感じの URL で CSV が公開されているとします。

https://example.com/data/sales_latest.csv

この CSV は、毎日中身だけ更新されるが、URL 自体は変わらない。
「Excel を開いて[更新]を押すだけで、常に最新の内容を取り込みたい」というケースです。

実務テンプレ M コード(固定 URL 版)

let
    // 1) CSV の URL を変数にしておく
    CsvUrl = "https://example.com/data/sales_latest.csv",

    // 2) Web からバイナリとして取得
    SourceBinary = Web.Contents(CsvUrl),

    // 3) バイナリを CSV としてテーブル化
    CsvTable =
        Csv.Document(
            SourceBinary,
            [
                Delimiter = ",",
                Encoding = 65001,
                QuoteStyle = QuoteStyle.Csv
            ]
        ),

    // 4) 先頭行をヘッダーに昇格
    Promoted =
        Table.PromoteHeaders(
            CsvTable,
            [PromoteAllScalars = true]
        )
in
    Promoted
Power Query

ここでの重要ポイントは二つです。

Web.Contents の引数は「完全な URL の文字列」であること。
Csv.Document の設定(区切り文字・文字コード)は、ローカル CSV のときと同じように指定できること。

このクエリを作っておけば、Excel 側で[すべて更新]を押すたびに、
その時点の sales_latest.csv の中身がテーブルとして取り込まれます。


例題2:日付付き URL を自動生成して Web CSV を取込

想定する状況

今度は、URL に日付が含まれているパターンを考えます。

https://example.com/data/sales_2024-10-01.csv
https://example.com/data/sales_2024-10-02.csv

毎日ファイル名が変わるが、「今日の日付のファイルを取り込みたい」というケースです。
ここでは「今日の分」を例にしますが、「特定日」「前日」なども同じ考え方で書けます。

日付から URL を組み立てるテンプレ

let
    // 1) 今日の日付を取得
    Today = Date.From(DateTime.LocalNow()),

    // 2) 日付を "yyyy-MM-dd" 形式の文字列にする
    DateText = Date.ToText(Today, "yyyy-MM-dd"),

    // 3) ベース URL と組み合わせて完全な URL を作る
    BaseUrl = "https://example.com/data/",
    FileName = "sales_" & DateText & ".csv",
    CsvUrl = BaseUrl & FileName,

    // 4) Web からバイナリとして取得
    SourceBinary = Web.Contents(CsvUrl),

    // 5) CSV としてテーブル化
    CsvTable =
        Csv.Document(
            SourceBinary,
            [
                Delimiter = ",",
                Encoding = 65001,
                QuoteStyle = QuoteStyle.Csv
            ]
        ),

    // 6) ヘッダー昇格
    Promoted =
        Table.PromoteHeaders(
            CsvTable,
            [PromoteAllScalars = true]
        )
in
    Promoted
Power Query

ここでの重要ポイントは、「URL を文字列として組み立ててから Web.Contents に渡している」ことです。

DateTime.LocalNow → Date.From で「日付だけ」にする。
Date.ToText で「URL に使える文字列」にする。
ベース URL とファイル名を & で連結して、最終的な URL を作る。

この型さえ覚えておけば、「今日」「昨日」「特定日」など、日付ロジックを差し替えるだけで応用できます。


例題3:クエリ引数(パラメータ)で日付を指定して取込

「毎回日付を変えて試したい」場合の考え方

「常に今日」ではなく、「任意の日付を指定して、その日の CSV を取り込みたい」こともあります。
このとき便利なのが「パラメータ(クエリ引数)」です。

Power Query の UI から「パラメータ」を作ってもいいですが、ここではシンプルに「別クエリで日付を定義する」イメージで書きます。

日付パラメータを使ったテンプレ

まず、「設定」用のクエリを一つ作るイメージです。

// クエリ名:設定_対象日
let
    TargetDate = #date(2024, 10, 1)
in
    TargetDate
Power Query

次に、Web CSV 取込クエリ側でこれを参照します。

let
    // 1) 対象日を別クエリから参照
    TargetDate = 設定_対象日,

    // 2) 日付を文字列に
    DateText = Date.ToText(TargetDate, "yyyy-MM-dd"),

    // 3) URL を組み立て
    BaseUrl = "https://example.com/data/",
    FileName = "sales_" & DateText & ".csv",
    CsvUrl = BaseUrl & FileName,

    // 4) Web から取得
    SourceBinary = Web.Contents(CsvUrl),

    // 5) CSV → テーブル
    CsvTable =
        Csv.Document(
            SourceBinary,
            [
                Delimiter = ",",
                Encoding = 65001,
                QuoteStyle = QuoteStyle.Csv
            ]
        ),

    Promoted =
        Table.PromoteHeaders(
            CsvTable,
            [PromoteAllScalars = true]
        )
in
    Promoted
Power Query

こうしておけば、「設定_対象日」クエリの中の #date(2024, 10, 1) を書き換えるだけで、
取り込むファイルの日付を簡単に切り替えられます。


重要ポイントの深掘り

Web.Contents でよくハマるポイント(認証とプライバシーレベル)

Web.Contents を使うときに、実務でよくつまずくのが「認証」と「プライバシーレベル」です。

認証が必要なサイト(ログインが必要な社内システムなど)の場合、
最初の接続時に「資格情報」を聞かれます。ここで正しいアカウントを設定しておく必要があります。

また、Power Query の「プライバシーレベル」が厳しすぎると、
「このデータソースは他と結合できません」的な警告が出ることがあります。
その場合は、オプションでプライバシーレベルを調整するか、同じレベルに揃える必要があります。

コード側ではなく、Excel/Power BI 側の設定の話なので、
「エラー内容をよく読む」「接続の編集から資格情報を見直す」という視点も持っておくと安心です。

文字コードと区切り文字の指定はローカルと同じくらい大事

Web 上の CSV でも、文字コードや区切り文字はローカルと同じようにバラバラです。

UTF-8 なら Encoding = 65001
Shift-JIS なら Encoding = 932
区切りがタブなら Delimiter = "#(tab)"

ここを間違えると、「文字化けする」「列がうまく分かれない」といったトラブルになります。
一度 UI から「データの取得 → Web」経由で取り込んでみて、
自動生成された M コードの Csv.Document の設定をコピペして使う、というのも実務的なテクニックです。


実務テンプレとしてのまとめ

「Web 上 CSV 自動取込」の型は、次の流れに集約できます。

Web.Contents(URL) でバイナリを取得する。
そのバイナリを Csv.Document でテーブルにする。
URL が日付付きなら、Date → 文字列 → URL 組み立て、という階段を踏む。

一度この型を体に入れてしまえば、
「社内システムが毎日 CSV を公開している」「オープンデータの CSV を定期的に取り込みたい」といった場面で、
“手でダウンロードしてから開く”という作業をごっそり自動化できます。

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