三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。
Ken3三流君の連絡先:
[google formsで連絡する]
上記の問い合わせフォームに質問・感想など気軽に書き込んでください

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

【Excel】VBA不要!パワークエリの関数化とList.TransformでJRAオッズ全12レースを一括取得する方法

ExcelパワークエリでJRA単勝オッズを一括取得!List.Transformで12レース全自動読み取り

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

処理のイメージと[このブログをAIで作成したことを伝える]

今回やりたかったこと

  • 開催地(中山、京都など)の情報を自動で取得する
  • 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]ライブ配信中に発覚したのですが、パワークエリの''「すべて更新」ボタンを押すと、クエリが並列(非同期)で動いてしまい、取得するデータの順番がズレる''というバグのような現象が発生しました [cite: 192]。

今後の改善点として:

  • クエリの実行順序を強制する(Table.Bufferなどの活用)
  • または、VBAを使ってクエリを1つずつ順番に更新させる

このあたりを次回、詳細に検証してみたいと思います。

関連リンク

    • -

AIからのアドバイス
技術系動画は「失敗」にこそ価値があります。41:11の「データがズレる」という発見は、同じことをしようとしている視聴者にとって最大の救いになります。次はこの「実行順序の制御」をテーマにした動画を作ると、さらに深いファンが増えるはずです!

ブログのアイキャッチ画像として使用する

質問・感想・クレームなど、
気軽にコメント欄に書いてもらえるとうれしいです。

[Googleフォームにコメントを残す]
↑質問・コメントの入力フォームです、気軽に書いてください


フッター:最後にKen3Videoの動画一覧を紹介します

YouTubeにアップした動画です。他の動画を一瞬でも見てもらえるとさらに嬉しいです。
再生リスト:[三流君Ken3の最新動画]←リストの一覧形式で表示する


また、ブログを見に来てくださいね。ではまたぁ~