ここから本文です

エクセルvbaを使って競馬オッズの取得 vbaを使ってIEを制御し、競馬の三連単オッ...

pom********さん

2018/4/1007:04:02

エクセルvbaを使って競馬オッズの取得

vbaを使ってIEを制御し、競馬の三連単オッズを取得したいと思います。

しかし、下記のページの三連単をクリックし、オッズを取得することができません。

目的ページ:http://race.netkeiba.com/?pid=race&id=p201809020611&mode=top

使用環境はWindows10、Excel2016、IE11です。

詳しい方、よろしくお願いします。


ちなみに私が今作成しているまでは、こんな感じです。

Sub sample()

Dim ie As InternetExplorer
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "http://race.netkeiba.com/?pid=race&id=p201809020611&mode=top"
Do While ie.Busy = True Or ie.ReadyState <> 4
DoEvents
Loop

End Sub

閲覧数:
505
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

hot********さん

2018/4/1114:07:50

IFramjeがあるせいなのか、BusyとReadyStateで読込終わりが判定できないみたいですが、こんなでどうでしょうか。

Sub sample()
Dim ie As Object
Dim table As Object
Dim i As Integer
Dim j As Integer
'
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "http://race.netkeiba.com/?pid=race&id=p201809020611&mode=top"
Do While ie.Busy Or ie.ReadyState <> 4: DoEvents: Loop
ie.document.getElementsByClassName("race_navi_odds")(0).getElementsByTagName("a")(0).Click
Do While ie.Busy Or ie.ReadyState <> 4: DoEvents: Loop
Do While IsNull(ie.document.getElementById("ipat_shikibetsu")): DoEvents: Loop
Do While ie.document.getElementById("ipat_shikibetsu").getElementsByTagName("li")(7) Is Nothing: DoEvents: Loop
ie.document.getElementById("ipat_shikibetsu").getElementsByTagName("li")(7).Click
Do While ie.Busy Or ie.ReadyState <> 4: DoEvents: Loop
Set table = ie.document.getElementById("topSANRENTAN").getElementsByTagName("table")(0)
Cells.Clear
For i = 0 To table.Rows.Length - 1
For j = 0 To table.Rows(i).Cells.Length - 1
Cells(i + 1, j + 1).Value = table.Rows(i).Cells(j).innerText
Next
Next
ie.Quit
End Sub

質問した人からのコメント

2018/4/13 21:05:12

ありがとうございました!
思った通りのことができました!!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

web********さん

2018/4/1010:10:40

取り合えず
”オッズ表示”は pid=odds です
なので
ie.Navigate "http://race.netkeiba.com/?pid=odds&id=p201809020611
としなければいけません

末尾の &mode=top は特に必要はないはず

----------
ページ内のデータの表示切り替えは javaScript で処理されているので

Do While ie.Busy = True Or ie.ReadyState <> 4
DoEvents
Loop

だけでは表示処理待ちがうまく働かない可能性もあります
その場合は、一定時間の強制的に待機するかページ切り替わり後に作成される要素数のカウントで表示完了を判断するなどの待機処理が必要になります

----------
3連単のオッズ表示への切り替えは

上位人気一覧
単勝・複勝
枠連
馬連
ワイド
馬単
3連複
3連単

メニューの”3連単”の部分のClickが必要、VBAのコードは

ie.Document.getelementbyid("ipat_shikibetsu").getelementsbytagname("a")(7).Click

id = "ipat_shikibetsu" の中の 7番目の<a>タグ要素をClick

----------
3連単オッズ表示に切り替わった後で

ie.Document.getelementbyid("jikuHorsePD").Value=7 '馬番指定
ie.Document.getelementbyid("jikuHorseRowPD").Value=2 '着順指定
ie.Document.getelementbyid("btnShowOdds2").click '表示切り替え

と処理を続ける必要があります

----------
一着馬固定でオッズ取得するならこれで行けるが全体のオッズ取得する場合は
一着場を変更しながらオッズ取得を出走馬数分のループ処理が必要
全通りオッズの取得の場合はJRAのサイト
http://www.jra.go.jp

で3連単→人気順で表示して取得すると16頭立て3359通りを一気に取り込めます
※シートに取り込んだあとでソートすれば馬番順並び替えられます

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

por********さん

2018/4/1009:41:49

こんにちは。
「最初の画面」を開く

というコードなのは、よくわかりましたが、主様のやりたいことは「ログイン」をして、「あるボタン」をクリックして、「ある表」をエクセルシートにコピーしたい、という動作なのでは??

だとしたら、画面の移動のようすまで、全部コードにする必要があり、「そもそも、ログインが出来るのか」という部分も、解決できないといけません。

「ログインをしてしまってから、自動で」という場合もコードはありますが、それでも、「目的の操作」のために調べておくべきことがあって、それ「ログインすることの出来るユーザーである」という条件があります。

主様の対応できそうなことから、実行してください

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる