ExcelパワークエリでJRA単勝オッズを一括取得!List.Transformで12レース全自動読み取り
JRAの公式サイトから1レースずつデータを取るのは大変ですよね。
「1つのレースは取れるけど、12レース分をループさせる方法がわからない」
そんな悩みを解決するために、パワークエリを関数化して一気に読み込む「''VBA不要の自動化テクニック''」をまとめました。

今回やりたかったこと
- 開催地(中山、京都など)の情報を自動で取得する
- 1レースから12レースまでのパラメーター(CNAME)を特定する
- 取得処理を「関数化」し、List.Transformでループを回して一括結合する
メインのソースコード
1. クエリの関数化:単勝テーブルを返す
まずは、レース番号とパラメーターを受け取って、そのレースのオッズ表を返す「部品」を作ります。
(レース番号 as text, 受け取ったCNAME) as table =>
let
strURL = "https://www.jra.go.jp/JRADB/accessO.html",
strCNAME = "cname=" & 受け取ったCNAME,
strPARA = Text.ToBinary(strCNAME),
strHEAD = [#"Content-Type"="application/x-www-form-urlencoded"],
ソース = Web.Contents(strURL, [Headers = strHEAD, Content = strPARA]),
文字列 = Text.FromBinary(ソース, 932),
strレース名 = Text.BetweenDelimiters(文字列, "<span class=""race_name"">", "<"),
str時刻 = Text.BetweenDelimiters(文字列, "<div class=""cell time""><strong>", "<"),
HTMLtest = Web.Page(文字列),
TB0 = HTMLtest{0}[Data],
追加されたレース名 = Table.AddColumn(TB0, "レース名", each strレース名),
追加されたオッズ時刻 = Table.AddColumn(追加されたレース名, "オッズ時刻", each str時刻),
追加されたカスタム = Table.AddColumn(追加されたオッズ時刻, "レース番号", each レース番号),
並べ替えられた列 = Table.ReorderColumns(追加されたカスタム,{"レース番号", "レース名", "オッズ時刻", "枠", "馬番", "馬名", "単勝"})
in
並べ替えられた列
2. ループ処理:単勝1to12
次に、用意した関数を12レース分ループさせて、最後にガッチャンコ(結合)します。
let
ソース = Excel.CurrentWorkbook(){[Name="レース別CNAME"]}[Content],
TBレース別CNAME = Table.TransformColumnTypes(ソース,{{"単勝CNAME", type text}, {"レース番号", type text}}),
// テーブルをレコードのリストに変換
lst処理リスト = Table.ToRecords(TBレース別CNAME),
// List.Transformで関数を順番に呼び出す
テーブル一覧 = List.Transform(
lst処理リスト,
each 単勝テーブルを返す(_[レース番号], _[単勝CNAME])
),
// 全てのテーブルを一つに繋げる
結果 = Table.Combine(テーブル一覧)
in
結果
手順の解説と動画リンク
今回の構築手順のポイントを、動画のタイムスタンプと共に解説します。
- [cite_start][08:33](https://www.youtube.com/watch?v=T-kRPFVOE2w&t=513s) ''開催場所の自動取得'': JRAトップページから「中山7日」などの情報を抜き出します [cite: 188]。
- [cite_start][15:41](https://www.youtube.com/watch?v=T-kRPFVOE2w&t=941s) ''名前範囲「CNAME」の作成'': セルの値をクエリに渡すためのテクニックです [cite: 189]。
- [cite_start][23:40](https://www.youtube.com/watch?v=T-kRPFVOE2w&t=1420s) ''クエリの関数化'': ここが一番重要。引数を受け取るようにコードを書き換えます [cite: 190]。
- [cite_start][30:07](https://www.youtube.com/watch?v=T-kRPFVOE2w&t=1807s) ''List.Transformによるループ'': M言語で最も強力な「繰り返し」の手法です [cite: 191]。
- [cite_start][41:11](https://www.youtube.com/watch?v=T-kRPFVOE2w&t=2471s) ''非同期更新によるデータのズレ'': ライブ中に発覚した重要な注意点。更新順序の制御が課題です [cite: 192]。
未解決の問題点と今後の課題
[cite_start]ライブ配信中に発覚したのですが、パワークエリの''「すべて更新」ボタンを押すと、クエリが並列(非同期)で動いてしまい、取得するデータの順番がズレる''というバグのような現象が発生しました [cite: 192]。
今後の改善点として:
- クエリの実行順序を強制する(Table.Bufferなどの活用)
- または、VBAを使ってクエリを1つずつ順番に更新させる
このあたりを次回、詳細に検証してみたいと思います。
