三流君 ken3のmemo置き場

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

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

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

JRA IPATで情報を取得 8.1 1Rから最後まで 次のレースを選択 繰り返す

変数を2つ作成して、
レース番号 と オッズの種類を覚えます。
Dim nR 'レース数
Dim strR_NAME(13) 'レース 通常連番だからいらないんだけど・・・

'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

nR = objSELECT.Item("s").OPTIONs.Length  'レース数を代入
For n = 0 To objSELECT.Item("s").OPTIONs.Length - 1
    strR_NAME(n) = objSELECT.Item("s").OPTIONs(n).innerTEXT  '名前を代入
Next 

レースの数を取得したら、あとは、ループ処理で、
'ループ、頭から終わりのレースまでループさせる
For r = 0 To nR - 1 '上↑で保存したレース数分まわる
でまわし、
レースの選択、決定を繰り返しながら1R-12Rまでのオッズを出力します。

テスト結果と操作動画: http://www.youtube.com/watch?v=atKqUg03sRs
www.youtube.com

'複数立ち上がったIEから IPAT 投票メニューを見つける

    Set objIE = getIE_URL("//www.ipat.jra.go.jp/pw_020_i.cgi")

    '見つけたかチェック
    If objIE Is Nothing Then
        wscript.Echo "エラー 投票メニューが見つかりません ログインを確認してください"
        wscript.quit
    End If   

'↑上で見つけたIPAT 投票メニューから 情報メニュー を 押す

    Call IE_A_Click(objIE, "情報メニュー")   'Aタグの 情報メニューを押す
    Set objIE = Nothing  'メニューはもう使わないので  
    WScript.Sleep  5000  '5秒待つ 1000で1秒

'次は、新しく起動した IPAT情報メインメニュー を 探す

    Set objIE = getIE_URL("//info.ipat.jra.go.jp/p/s")

    '見つけたかチェック
    If objIE Is Nothing Then
        wscript.Echo "エラー IPAT情報メインメニュー 見つかりません"
        wscript.quit
    End If   


'SELECT name=m の 開催地オプションを選択する

    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

    'ループで頭から表示してみる
    Set objM = Nothing
    For n = 0 To objSELECT.Length - 1
        '※.Nameで判断する
        If objSELECT(n).Name = "m" Then
            Set objM = objSELECT(n)  '見つけたname=mを新しくオブジェクト変数に代入
            exit For  'ループを抜ける
	End If
    Next

    Set objSELECT = Nothing  'オブジェクト変数解放

    '見つけたかチェック
    If objM Is Nothing Then
        msgbox "エラー 開催地 Name=m が 見つかりません"
        wscript.quit
    End If   

'次に下のオプションを探る 競馬場・開催地を保存する

    Dim nJYO             '開催数
    Dim strJYO_NAME(10)  '開催地名前 10もいらないけど

    nJYO = objM.OPTIONs.Length  '数を代入
 
    '中身をループで表示
    For n = 0 To objM.OPTIONs.Length - 1
        strJYO_NAME(n) = objM.OPTIONs(n).innerTEXT  '名前を代入
    Next 

    'テストで 0 頭を選択する ※0 1 2 3 
    objM.OPTIONs(0).selected = True   '単純にselectedプロパティをTrueでセレクト状態にする
    Call IE_INPUT_Click_VALUE(objIE, "決定")    '決定を押し、開催地を切り替える

'表示を待つ※競馬場・開催地の切り替えを待つ
    Call IE_WAIT

'オッズのボタンを押す ※一番最初に見つかったボタンを押す(ここではレース無視)
    Call IE_INPUT_Click_VALUE(objIE, "オッズ")    'オッズを押し、表示を切り替える

'表示を待つ※オッズの切り替えを待つ
    Call IE_WAIT

'5.レース番号 と オッズの種類を覚える

    Dim nR             'レース数
    Dim strR_NAME(13)  'レース 通常連番だからいらないんだけど・・・ 

    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")

    nR = objSELECT.Item("s").OPTIONs.Length  'レース数を代入
 
    '中身をループで表示 レース
    For n = 0 To objSELECT.Item("s").OPTIONs.Length - 1
        strR_NAME(n) = objSELECT.Item("s").OPTIONs(n).innerTEXT  '名前を代入
    Next 

    Set objSELECT = Nothing   '一度クリアじゃないけど、キレイにする

'ループ、頭から終わりのレースまでループさせる
  For r = 0 To nR - 1  '上↑で保存したレース数分まわる

    '改めて、レースの選択 SELECTを取得する
    'SELECTのタグを集める .getElementsByTagName("SELECT")を使用
    Set objSELECT = objIE.Document.getElementsByTagName("SELECT")   

    'レース番号を選択
    objSELECT.Item("s").SelectedIndex = r  '上から r 番目のレースを選択
    WScript.Sleep  500  '0.5秒待ってから

    '単勝オッズを選択
    objSELECT.Item("g").Value = "Ota01"  'Ota01 固定をセット(単・複・枠連オッズ)を代入
    WScript.Sleep  500  '0.5秒待ってから

    Set objSELECT = Nothing  'オブジェクト変数解放

'6.決定を押し、レースとオッズを切り替える
    Call IE_INPUT_Click_VALUE(objIE, "決定")    '決定を押し、レースとオッズを切り替える

'表示を待つ※オッズの切り替えを待つ
    Call IE_WAIT

'7.オッズの表を取得(出力する)
    'テーブルを抜き出す

    'TABLEのタグを集める .getElementsByTagName("TABLE")を使用
    Set objTABLE = objIE.Document.getElementsByTagName("TABLE")

    'ループで頭から 中身を表示してみる
    For n = 0 To objTABLE.Length - 1
        If objTABLE(n).Rows(0).Cells(0).InnerTEXT = "枠番" Then
            Exit For  'ループを抜ける
        End If
    Next

    '↑みつけたテーブルからデータを抜きます
    '↓.Lengthで行と列を取り出し、2重ループさせる
    For y = 0 To objTABLE(n).Rows.Length - 1  '行のループ
        strLINE = ""  '空の文字列で初期化
        For x = 0 To objTABLE(n).Rows(y).Cells.Length - 1  '列のループ
            '.InnerTextで中身の文字列を取り出し &でつなげ ,カンマを付ける
            strLINE = strLINE & objTABLE(n).Rows(y).Cells(x).InnerText & ","
        Next  'テーブルの列 x の ループ
        '作成した文字列(1行分↑)を出力する
        strLINE = strR_NAME(r) & "," & strLINE  '頭にレース番号を追加する 
        Wscript.ECHO strLINE    '一番後ろのゴミカンマは気にしない(ぉぃぉぃ)
    Next  'テーブルの行 y の ループ

  Next  'レース r のループ


'サブルーチンなど

'URLを受け取り、IEを探し、リターン値として返す
Function getIE_URL(sURL)

    'オブジェクトを格納する変数
    Dim objShell, objWindow
    Dim objRET  'リターン

    'シェルのオブジェクトを作成する
    Set objShell = CreateObject("Shell.Application")

    Set objRET = Nothing   'リターン値を初期化する    
    'ウインドウの数だけまわすぞ
    For Each objWindow In objShell.Windows
        'TypeNameでオブジェクト変数のタイプを表示する
        'HTMLDocumentだったら
        If TypeName(objWindow.document) = "HTMLDocument" Then
           If InStr(objWindow.document.URL, sURL) > 0 Then   'URLが含まれているか?
               Set objRET = objWindow '見つけたウインドウを(IE)を代入
               Exit For   
           End IF
        End If
    Next
    Set objShell = Nothing

    Set getIE_URL = objRET     'リターン値をセット(値を返す)

End Function

'Aタグ
'oIE と クリックする文字列を受け取り、見つけたら.Click する
'(※InStrの手抜き処理なので、京都と東京都に注意 完全一致は InnerTEXTで=にする)
Sub IE_A_Click(oIE, sHTML)
    'Aのタグを集める .getElementsByTagName("A")を使用
    Set objA = oIE.Document.getElementsByTagName("A")

    'ループで頭から表示してみる
    For n = 0 To objA.Length - 1
        '※.InnerHTMLじゃなくて、.OuterHTMLでAの全体を見る
        'リンクを探す、ソースの文字を探す
        If InStr(objA(n).OuterHTML, sHTML) > 0 Then  '文字を見つけたら
            objA(n).Click  'クリックする
            Exit For  'ループを抜ける
        End If
    Next

    Set objA = Nothing  'オブジェクト変数解放
End Sub

'INPUTのタグ、.Valueで比べる
'oIE と クリックする値を受け取り、見つけたら.Click する
Sub IE_INPUT_Click_VALUE(oIE, sVALUE)
    'INPUTのタグを集める .getElementsByTagName("INPUT")を使用
    Set objINPUT = oIE.Document.getElementsByTagName("INPUT")

    'ループで頭から表示してみる
    For n = 0 To objINPUT.Length - 1
        '※.valueで値を見る
        If objINPUT(n).Value = sVALUE Then
            objINPUT(n).Click  'みつけたボタンを押す
            exit For  'ループを抜ける
	end If
    Next

    Set objINPUT = Nothing

End Sub

'IEの表示完了を待つ
Sub IE_WAIT()

    WScript.Sleep  500  '0.5秒待ってから
    
    'ページの表示完了を待ちます。
    While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
        WScript.Sleep  100  '0.1秒待つ 1000で1秒
    Wend

    WScript.Sleep  1500  '関数を抜ける前におまけで1.5秒待つ(ぉぃぉぃ)

End Sub

JRA IPAT単勝オッズ取得 開発の流れ と 全体の流れ

JRA IPAT 単勝オッズの取り込み - 三流君ken3のひとりグループ
http://ken3hitori.g.hatena.ne.jp/bbs/30
↑の流れを見て、笑ってください・・・
JRA IPATを操作する他のサンプル・類似処理は、
JRA IPAT ログイン処理
JRA IPAT 入金処理 - 三流君ken3のひとりグループ
です。また、VBA IE操作の解説は
三流君VBAでIE操作 InternetExplorer.Applicationを操作する
で細々やっているので、よかったらお時間のある時にのぞきにきてください。

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)