三流君のソースコード置き場

ブログにソースコードをアップして、ブログの検索機能で利用してます(利用予定です)

よく検索されるキーワード: [VBA]/ [VBS]/ [CreateObject]/ [Excel]/ [ADO]


修正したコード JRAオッズ CNAMEを取得するコード 26/03/08

https://www.youtube.com/watch?v=tC_84sHW3dg

www.youtube.com


修正したコード

// 2026/03/08 テスト001
// まず、空のクエリーにメイン関数を貼り付けてください
// メイン処理

// 名前は何でも

//--- JRAオッズのCNAMEを取得する パワークエリ 26/02/15テスト
// doActionからパラメーターを切り出す
// cname=pw15oli00/6Dで 今週の開催を取り出す

let
    // JRAホームページからソースを取得する POST送信で結果を受け取る
    strURL = "https://www.jra.go.jp/JRADB/accessO.html",
    strPARA = Text.ToBinary("cname=pw15oli00/6D"),
    strHEAD = [#"Content-Type"="application/x-www-form-urlencoded"],
    ソース = Web.Contents(strURL, [Headers = strHEAD, Content = strPARA]),
    文字列 = Text.FromBinary(ソース, 932),
    HTMLソース = Lines.FromText(文字列),
    
    テーブルに変換済み = Table.FromList(HTMLソース, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    フィルターされた行 = Table.SelectRows(テーブルに変換済み, each Text.Contains([Column1], "Action") and Text.Contains([Column1], "回")),

    条件2_1 = "accessO.html', '",
    条件2_2 = "');"">",
    Column2を追加 = Table.AddColumn(フィルターされた行, "CNAME", each Text.BetweenDelimiters([Column1], 条件2_1, 条件2_2)),

    //【ここから追加】Column3を作成
    // '</i>' と '</a></div>' の間のテキストを抽出します
    条件3_1 = "</i>",
    条件3_2 = "</a></div>",
    Column3を追加 = Table.AddColumn(Column2を追加, "開催", each Text.BetweenDelimiters([Column1], 条件3_1, 条件3_2)),

    // 開催の結果
    開催の結果 = Table.RemoveColumns(Column3を追加,{"Column1"}),

    // ソースのクエリー結果(テーブル)をレコードのリストに変換
    lst処理リスト = Table.ToRecords(開催の結果),
    str馬券の種類 = "単勝,枠連,馬連,ワイド,馬単,3連複,3連単",

    // ループ処理 リストを順番に処理する List.Transformで変換するのが順番に呼び出すイメージ?
    テーブル一覧 = List.Transform(
        lst処理リスト,
        each 開催別にCNAME取得(_[CNAME], _[開催], str馬券の種類)
    ),

    // 結合,上でテーブルのリストが作成されているので、それを一つにつなげる
    t_all = Table.Combine(テーブル一覧)
in
    t_all
//----
// 2026/03/08 テスト002
// 空のクエリーに 開催別にCNAME取得 で作成する
// メインから呼ばれる関数

// 関数化して開催地別に馬券の種類でループしたCNAMEを返す
// 関数で引数を受け取り、テーブルを返す
// 26/02/10 ※枠連にすると、枠連無し8頭までで不具合になることを見つける・・・追加のバグを記載すること

(str開催地CNAME as text, str開催地と開催日 as text, str馬券種類 as text) as table =>
let

// 開催地別HTMLの取得なので、POST送信は場所ごとにWebクエリーは1回だけ走らせる
    // JRAホームページからソースを取得する POST送信で結果を受け取る
    strURL = "https://www.jra.go.jp/JRADB/accessO.html",
    // 引数で受け取った開催地のCNAMEをパラメーターとする 26/01/25修正
    strCNAME = "cname=" & str開催地CNAME,
    strPARA = Text.ToBinary(strCNAME),
    strHEAD = [#"Content-Type"="application/x-www-form-urlencoded"],
    ソース = Web.Contents(strURL, [Headers = strHEAD, Content = strPARA]),
    HTML文字列 = Text.FromBinary(ソース, 932),
    HTMLソース = Lines.FromText(HTML文字列),

    // HTMLソースLISTをテーブルに変換して、フィルターなどで使う
    テーブルに変換済み = Table.FromList(HTMLソース, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
// ここまでが、一回だけのPOST取得後、HTMLソースを取得した時の処理、
// ここから、個別の馬券者別単位で処理を行う
    // ※初めからリストでもらう手もあるけど、カンマ区切り文字列からリストを作成
    // --- 馬券種類を List に分解 "単勝,馬連,3連複" → { "単勝","馬連","3連複" } ---
    馬券種類List =
        List.Transform(
            Text.Split(str馬券種類, ","),
            each Text.Trim(_)
        ),

    // 作成したリストを使用して、種類別にループ(変換)を行う
    馬券別テーブル =
        List.Transform(
            馬券種類List,
            (txt券種 as text) =>
        let
            // CNAMEを取得したいので、フィルターをかけ、文字列を抜き出す
            フィルターされた行 = Table.SelectRows(
                                    テーブルに変換済み, 
                                    each Text.Contains([Column1], "Action") 
                                    and Text.Contains([Column1], txt券種)),

            // doActionのパラメーターを抜き出し 列"CNAME"を作る
            条件3_1 = "doAction('/JRADB/accessO.html', '", // ここから
            条件3_2 = "'",                                 // 次のシングルコーテーションまで抜き出す
            CNAMEを追加 = Table.AddColumn(
                            フィルターされた行, 
                            "CNAME",
                            each Text.BetweenDelimiters([Column1], 条件3_1, 条件3_2)),

            //場所の処理 新列 "今週の開催地" を追加する、引数で受け取った場所をそのままセットする
            追加された場所 = Table.AddColumn(CNAMEを追加, "今週の開催地", each str開催地と開催日),

            //馬券の種類を追加する List変換処理中の券種をセットする
            追加された種類 = Table.AddColumn(追加された場所, "馬券の種類", each txt券種),

            // 2026/02/08 処理の追加 ダミーの連番インデックス列を追加します (0から始まる連番が振られます)
            インデックス列の追加 = Table.AddIndexColumn(追加された種類, "Index", 0, 1),

            // レース番号をクラス名 を指定して取得します
            レース番号抽出 = Html.Table(HTML文字列, {
                {"RaceNO", ".race_num img", each [Attributes][alt]}
            }),

            // 新列"レース番号"を作成します
            レース番号を追加 = Table.AddColumn(
                                インデックス列の追加, 
                                "レース番号", 
                                each レース番号抽出{_[Index]}[RaceNO]
                            ),

            // 発走時刻をクラス名とタグ td.time を指定して取得します
            発走時刻抽出 = Html.Table(HTML文字列, {
                {"time", "td.time"}
            }),

            // 新列"発走時刻"を作成します
            発走時刻を追加 = Table.AddColumn(
                                レース番号を追加, 
                                "発走時刻", 
                                each 発走時刻抽出{_[Index]}[time]
                            ),

            // レース名をクラス名とタグ td.race_name を指定して取得します
            レース名称抽出 = Html.Table(HTML文字列, {
                {"レース名称", "td.race_name"}
            }),

            // 列"発走時刻"を作成します
            レース名称を追加 = Table.AddColumn(
                                発走時刻を追加, 
                                "レース名", 
                                each レース名称抽出{_[Index]}[レース名称]
                            ),

            //不要な列を削除する
            列削除 = Table.RemoveColumns(レース名称を追加,{"Column1", "Index"})

        in
            列削除   //馬券の種類別に作成したテーブルを返す
        ),  // ←List.Transformの閉じカッコ、ここまでが種類のリストでループ変換される

    // すべて結合、ループで複数テーブルをリスト形式で取得しているので、最後にテーブルを結合する 
    結果 = Table.Combine(馬券別テーブル)

in
    結果

// ここまでをコピーして、貼り付けてください

https://www.youtube.com/watch?v=tC_84sHW3dg

www.youtube.com


修正したコード


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

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


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

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


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