第3回 出馬表とオッズの取得

スポンサーリンク
ブック内のワークシート名の設定

JRAのホームページのオッズメニューから、出馬表(単勝/複勝オッズ)と3式別のオッズをコピーしてシートに貼り付けます。列幅は見やすいように調整してください。19年12月からオッズの貼り付け結果が以下のように行方向の縦長になってしまいました。まずはA図のセル位置に1レース分のオッズをペーストするマクロをつくります。
ファイル名は「出馬表作成」など適当な名前を付けて「Excelマクロ有効ブック」で保存しておきます。そうするとマクロが有効になり拡張子は「○○.xlsm」になります。このファイルをベースにマクロは展開していきます。

自作ソフトFactorXのブックで使っているそれぞれのシート名を参考までに載せておきます。これから出てくるすべてのマクロで使うワークシート名になりますので、自分で分かりやすいシート名をここで設定しておきます。変更するのが煩わしければそのまま使ったほうが、面倒がありません。
下図左から<Menu><Preview><InpOds><shCalc><Judge><Item>になっています。

シートの説明
  1. Menu…発走前のオッズを取得して「FactorXで当日レース分析」「期待値の計算」「FactorXでの分析結果とレース成績作成」の3つを操作するボタンを配置。
  2. Preview…FactorXの分析結果(これをみて購入馬券の判断)。
  3. InpOds…A図のような出馬表とオッズを貼り付けるシート。
  4. shCalc…取得したオッズをこのシート上で計算/分析。
  5. Judge…分析結果を一時的に記録して、Previewに書き込むデータを選択。
  6. Item…枠別の色、フォームの文字列などを書き入れている。
JRAのサイトからオッズをコピペするマクロ

JRAのサイトから希望の競馬場のレースを選択して出馬表(単勝/複勝)、枠複、馬複、馬単のオッズを順にコピーし、エクセルのワークシートにペーストするマクロです。下記のようなマクロでなく直接オッズをダウンロードしてワークシートに配置する方法がありますが、自分自身まだハードルが高かったのでコピーにしました。また、各オッズのコピー範囲についてはTips〈オッズのコピー方法とその範囲〉を参照ください。

マクロの流れ
  1. jraのサイトから希望レースの出馬表(単勝/複勝)をコピーする〈ctrl+c〉
  2. ワークシートに戻りショートカットキーを設定して、その設定した〈ctrl+a〉を押下して出馬表をペースト後、枠連複写先のセル位置に移動
  3. jraから枠連のオッズをコピー、ワークシートに戻り〈Tabキー〉の押下でペースト後、馬連複写先のセル位置に移動
  4. jraから馬連のオッズをコピー、ワークシートに戻り〈Tabキー〉の押下でペースト後、馬単複写先のセル位置に移動
  5. jraから馬単のオッズをコピー、ワークシートに戻り〈Tabキー〉の押下でペースト後、top位置に移動

流れが分かったところでマクロを書いてみましょう。

それでは[開発]タブのVisual Basicをクリックして [挿入]>標準モジュールを追加して以下のマクロを書いてみましょう。マクロは「Sub 出馬表複写」で始まり「End Sub」で終わります。またマクロは下記の「かいせつ」で補足説明していますのでそちらも参考にしてください。

 Option Explicit
 
         Dim ws2 As Worksheet                                      '1(かいせつを参照 以下同)
         Dim ws3 As Worksheet
         Dim ws4 As Worksheet
         Dim shColm As Long
         
 '===================================
 ' 出馬表(単勝)⇒枠連⇒馬連⇒馬単の
 ' 順にTABキーを押すことにより複写
 '===================================
 

     '(cntl+a)でマクロの実行
     Sub 出馬表複写()
          Dim tosu As Long
          Dim adr As String
         
                     Set ws3 = Worksheets("InpOds")              '2
                 
                adr = ActiveCell.Address                           '3
                 
             If adr <> Range("b7") Then
                 
                 ws3.Range("b7").Select                            '4
             
             End If
                 
                 'jraからコピーしたオッズをペースト               '5
                     ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _
                         False, NoHTMLFormatting:=True
          
                             'c7の馬番が1でないならペーストミス   '6
                             If ws3.Range("c7") <> 1 Then
                             
                                 '再入力のためご入力範囲を消去
                                 ws3.Range("b7:k25").ClearContents
                                        
                                 '再入力 位置に移動
                                 ws3.Range("b7").Select
                 
                                         MsgBox "入力ミスです。先に出馬表を再コピーしてから,ボタンを押してください"
          
                                             ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _
                                             False, NoHTMLFormatting:=True
                             End If
                         
                                 'c列馬番の最大値から頭数を割り出す
                                     tosu = Application.WorksheetFunction. _
                                     Max(ws3.Range("c7:c24"))
             
                 '8頭立て以下では枠連の発売がないので"馬連"にジャンプ
             
                 If tosu >= 9 Then
             
                     ws3.Range("m7").Select
                     Application.OnKey "{tab}", "枠連"                   '7
             
                         Else
                             ws3.Range("o7").Select
                             Application.OnKey "{tab}", "馬連"           '8
             
                 End If
             
     End Sub 
かいせつ

JRAサイトのオッズから、出馬表をコピーしたら

  1. このモジュール内の他のプロシージャからも参照できるよう、ここではモジュール変数で宣言。これで変数の適用範囲はモジュール内で有効になります。一番上のSubプロシージャの上に書きます。変数名は分かりやすく意味を持たせた名前をつけるといいでしょう
  2. Setを使い、オブジェクト型で宣言した変数ws3にシート名を代入。ブックのシート名(参考)を元に変数を宣言しています
  3. アクティブセルのアドレスを取得
  4. アクティブセルが入力位置のセルb7でない場合、b7を選択して入力準備をします
  5. 出馬表(単勝/複勝)をペースト
  6. 正しい位置にコピーができた場合、馬番のセルc7は馬番の1が入るので「1」です。それ以外だとコピーミスなのでペースト範囲のデータを消去して再度セルb7をアクティブにして、再コピーして〈cntl+a〉でマクロの実行
  7. 問題なく出馬表をペーストできたら枠複のm列に移動後、Tabキー押下で<sub 枠複>を実行
  8. 8頭立て以下は枠複の発売がないので馬複のo列に移動後、Tabキー押下で<sub 馬複>を実行

次は枠複のオッズをペーストするマクロです。同じモジュール内に以下のマクロを書き加えてください。Tabキーを押すことによって枠複オッズをペースト後、馬複のオッズ複写位置にジャンプします。

    Sub 枠複()
         ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _
             False, NoHTMLFormatting:=True                           '1     

                 If ws3.Range("m8") <> 1 Then                            '2

                     '再入力のためご入力範囲を消去
                     ws3.Range("m7:n57").ClearContents

                         '再入力 位置に移動
                         ws3.Range("m7").Select

                                 MsgBox "入力ミスです。先に枠複オッズを再コピーしてから,ボタンを押してください"

                         ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _
                             False, NoHTMLFormatting:=True
                 End If

             ws3.Range("o7").Select                                '3

             Application.OnKey "{tab}", "馬複"                   '4

     End Sub 
かいせつ

<sub 枠複>ではTabキーを押下されたのを受け枠連のオッズをペースト後、馬連の列位置にジャンプします。

  1. 前記の出馬表複写ののTabキーを押すことで枠複オッズがペーストされる
  2. ペーストミスを防止
  3. 正常にペーストできたらo列にジャンプ
  4. Tabキーの押下で<sub 馬複>の実行

<sub 馬複><sub 馬単>のプロシージャもあまり変わらないので続けていきます。同じモジュール内に書いてください。

    Sub 馬複()

         ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _
             False, NoHTMLFormatting:=True

                 If ws3.Range("o7") <> 1 Then

                     '再入力のためご入力範囲を消去
                     ws3.Range("o7:p191").ClearContents

                         '再入力 位置に移動
                         ws3.Range("o7").Select

                                     MsgBox "入力ミスです。先に馬複オッズを再コピーしてから,ボタンを押してください"

                                 ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _
                                     False, NoHTMLFormatting:=True
                 End If

             ws3.Range("q7").Select

             Application.OnKey "{tab}", "馬単"

     End Sub


     Sub 馬単()
             Dim inpRng As Range    ’22年8月12日追加および変更
                If ws3.Range("q7") <> 1 Then      この行を下行に移動
                   ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _
                           False, NoHTMLFormatting:=True
                   '入力ミスの判定
                   If ws3.Range("q7") <> 1 Then      'この位置に移動
                             '再入力のためご入力範囲を消去
                           ws3.Range("q7:r364").ClearContents

                                 '再入力 位置に移動
                                 ws3.Range("q7").Select

                             MsgBox "入力ミスです。先に馬単オッズを再コピーして,ボタンを押してください"

                                 ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:= _
                                     False, NoHTMLFormatting:=True

                    End If

                 Application.OnKey "{tab}"         '1

                             'Topに移動                   '2
                             ws3.Range("b7").Select
                       '■■入力オッズのすべての「取消」セルを空欄に置き換える ’22年8月12日  以下2行を追加
                         Set inpRng =Range("b7:r364)
                              inpRng.Replace What:="取消", replacement:=""
     End Sub     
かいせつ

<sub 馬複>ではTabキーを押下されたのを受け馬連のオッズをペースト後、馬単のオッズ入力列にジャンプします。
<sub 馬単>ではTabキーを押下されたのを受け馬単のオッズをペースト後「取消」セルをすべて空欄に置き換えます。その後セルB7にジャンプ。

  1. OnKeyメソッドの解除
  2. ペーストが終了したらセルB7に移動

URLからコピーしたオッズは、普通にワークシートにペーストすると以下のようになってしまいます。このようなケースでは、「貼り付けのオプション」〈ホーム〜貼り付け〜貼り付け先の書式に合わせる〉でペーストするとA図のようにできます。しかし、貼り付ける時にいちいち「貼り付けオプション」を選択してペーストするのは面倒な作業です。このような作業はマクロの出番といえます。

オッズのコピペはできましたか。次はオッズを見やすく整理してみましょう。

コメント

  1. 初心者 より:

    最初のマクロの解説4のRangeクラスのSelectメソッドが機能しないのはなぜでしょうか?

    • gamira gamira より:

      初心者様
      当サイトにご訪問いただきありがとうございます。
      sub 出馬表複写()内の「4」の部分でよろしいですか。
      マクロは動くので、考えられるのは上記sub 出馬表複写()の上に
      dim ws3 as worksheetと宣言されていますか?
      そこでws2/ws3/ws4/shColmの宣言をしておかないと正常に動作しません。
      いま思いつくのはその部分です。確認をしてみてください。
      これからもよろしくお願いいたします。

タイトルとURLをコピーしました