第6回 券種ごとの単勝人気順オッズテーブル作成

スポンサーリンク
券種ごとのオッズテーブルを単勝人気順に並べ替える

sortメソッドを使って馬券別のオッズテーブル全体を単勝人気順に並べ替えます。

馬券別オッズを率に換算してその順位の取得

オッズテーブルを単勝の人気順に並べ替える準備として、次のように「馬のデータ」と「枠のデータ」を作成します。ここで必要なのは単勝率と単勝ランクですが、当該馬がらみの馬券の売上を、オッズ率で集計する作業を馬券別に進めていきす。
ランク付けはオッズでできますが、自作の競馬予想ソフトFactorXではすべてのオッズは率に換算して分析しているので、ここではその方法を紹介します。

標準モジュールを追加してマクロを書く

新規に標準モジュールを追加、名前のModule1を「c_テーブル人気順」などとモジュール名を分かりやすい名前に変更後、そこに以下のマクロを書いていきます。

Option Explicit

Dim ws3 As Worksheet, ws4 As Worksheet
Dim tosu As Long
Dim rowTop As Long
Dim clmTopA As Integer, clmTopB As Integer

Sub 人気順オッズテーブル()

    Dim i As Long
    Dim rngA As Range, rngB As Range
    Dim v As Variant         '配列の変数
    Dim ws5 As Worksheet
    
            Set ws3 = Worksheets("InpOds")
            Set ws4 = Worksheets("Calc")
            Set ws5 = Worksheets("Item")
            
    Call odds表作成                                '1
            
            '■頭数の割り出し
             '  InpOdsシートのc列馬番の最大値をもとめて該当レースの頭数を割り出す
                tosu = Application.WorksheetFunction.Max(ws3.Range("c7:c24"))
            
                  rowTop = 7

            '■  "Calc"シートの「馬のデータ」に枠番・馬番を貼り付け
              'Itemシート上の枠番・馬番を"Calc"シートにペースト                    2
      
                With ws5
                '枠色つきの枠番のコピペ                   
                    .Range(.Cells(2, tosu), .Cells(1 + tosu, tosu)).Copy _
                     Destination:=ws4.Cells(3, "b")
      
                '枠色つき馬番のコピペ
                    .Range(.Cells(22, tosu), .Cells(21 + tosu, tosu)).Copy _
                     Destination:=ws4.Cells(3, "c")
                     
            '■"Calc"シートの「枠のデータ」に枠番を貼り付け
                '枠色つきの枠番のコピペ
                    .Range("h2:h9").Copy _
                     Destination:=ws4.Cells(3, "n")
               
               End With
                
      Call 全オッズを率に変換                                                       '4
下に続く
かいせつ
  1. call ○○○で オッズ表作成を呼び出し実行後このプロシージャに戻ってきます(オッズ表作成マクロは第4回オッズを見やすく表に整形に掲載済み)
  2. ”Item”シート上の色分けした枠番/馬番を”Calc”シートの「馬のデータ」「枠のデータ」にコピペします(マクロではなく簡単なエクセルのコピー&ペーストを使いました)
  3. 枠色つきの枠番は”Item”シートに作ってあります(Tips カラーの設定〈セルの塗りと文字色〉
  4. モジュール「c_テーブル人気順」のプロシージャ「Sub人気順オッズテーブル〜End sub」の下に新たに「全オッズを率に変換」プロシージャを作り、callで呼び出します

券種別のオッズテーブルをソートします。まず縦方向(行)に、次いで横方向(列)に単勝人気順で並べ替えます。こうすると券種別のオッズテーブルが単勝人気組合せ順に並べることができます。

 上から続く
'----------------------------------------------- _
   馬券別のオッズテーブルを単勝人気順に並べる _
  ------------------------------------------------
            clmTopA = 19     '列S(全券種共通) 1
        
        '■■枠連
            
            With ws4                            ' End Withは■■枠連の最後にある
            
            '枠連の枠ごとのランキング
  
                For i = 1 To 8                    '2
       
                    '単勝オッズ率を数値の高い順でランクづけ
                    .Cells(i + 2, "o") = Application.WorksheetFunction.Rank _
                            (.Cells(i + 2, "p"), .Range("p3:p10"), 0)
       
                    '枠連オッズ率を数値の高い順でランクづけ
                    .Cells(i + 2, "q") = Application.WorksheetFunction.Rank _
                            (.Cells(i + 2, "r"), .Range("r3:r10"), 0)
                Next i
                
                    '単勝が同順位でも枠連ランク順位を加味してランク付け         3
                    
                            v = .Range("q3:q10")     '枠連ランク列
            
                        For i = 1 To 8
                        
                            v(i, 1) = v(i, 1) * 0.01 + .Cells(2 + i, "o")
                
                        Next i

                            .Range("o3:o10") = v    'o列の単勝ランクを新しく書換え
     
                        For i = 1 To 8     ’ランクの数値の低い順でランク付け
    
                            .Cells(i + 2, "o") = Application.WorksheetFunction.Rank _
                                                (.Cells(i + 2, "o"), .Range("o3:o10"), 1)
                        Next i
            
            '■枠色つきの枠番と単勝率のコピペ
                .Range("n3:o10").Copy
                
                    'オッズtableの左側にペースト                              4
                    .Cells(27, clmTopA).PasteSpecial xlPasteAll

                        'オッズtableの上部にペースト
                        .Range("u25").PasteSpecial _
                            Paste:=xlPasteAll, _
                            operation:=xlNone, _
                            SkipBlanks:=False, _
                            Transpose:=True
    
                '枠連オッズtableをt27の単勝人気(昇順)で行単位ソート  5
                    Set rngA = .Range("s27:ab34")
                    
                        ws4.Sort.SortFields.Clear
                        rngA.Sort _
                            Key1:=.Range("t27"), Order1:=xlAscending, _
                            Header:=xlNo, OrderCustom:=1

                '枠連オッズtableを26行目の単勝人気(昇順)で列単位ソート       6
                    Set rngA = .Range("u25:ab34")
                    
                        ws4.Sort.SortFields.Clear
                        rngA.Sort _
                            Key1:=.Rows(26), Order1:=xlAscending, _
                            Header:=xlNo, OrderCustom:=1, _
                            MatchCase:=False, Orientation:=xlSortRows, _
                            SortMethod:=xlPinYin
            
            End With
  ’ここから馬単/馬連共通処理を書く
かいせつ
  1. “Calc”シートのオッズテーブル先頭列位置(全テーブル共通)です
  2. 「枠のデータ」の単勝率/枠連率に順位を付けます
  3. 単勝率ランクがが同位の場合、枠連率を加味して順位の再取得します
  4. 「枠のデータ」の枠番と単勝率を、オッズテーブルの左側と上側にペーストします
  5. 枠番と単勝率を含めたオッズテーブルを行単位の人気順でソートします
  6. 「5」で並べ替えたテーブルを列単位の人気順でソートします
        '■■馬連/馬単共通処理
                    
            '出走馬単勝のランキング

                For i = 1 To tosu
                     If ws4.Cells(2 + i, "e") <> "" Then         '22年8月13日 追加
                    '「馬のデータ」のテーブル操作            1
                    
                    With ws4
                    
                        '単勝オッズ率を数値の高い順でランク付け
                         .Cells(i + 2, "d") = Application.WorksheetFunction.Rank _
                            (.Cells(2 + i, "e"), .Range(.Cells(3, "e"), .Cells(2 + tosu, "e")), 0)
       
                        '馬連オッズ率を数値の高い順にランク付け
                        .Cells(i + 2, "f") = Application.WorksheetFunction.Rank _
                            (.Cells(i + 2, "g"), .Range(.Cells(3, "g"), .Cells(2 + tosu, "g")), 0)
                            
                        '馬単オッズ率を数値の高い順にランク付け
                         .Cells(i + 2, "h") = Application.WorksheetFunction.Rank _
                            (.Cells(i + 2, "i"), .Range(.Cells(3, "i"), .Cells(2 + tosu, "i")), 0)

                    End With
                    End If       '22年8月13日 追加
                Next i

                    '単勝が同順位でも馬連ランク順位を加味してランクを再取得    2
                    
                    With ws4
                            
                        '馬連ランク列
                        Set rngA = .Range(.Cells(3, "f"), .Cells(2 + tosu, "f"))
                               
                                v = rngA
            
                            For i = 1 To tosu
                     If ws4.Cells(2+ i, "d") <> "" Then         '22年8月13日 追加                         
                                v(i, 1) = v(i, 1) * 0.01 + .Cells(2 + i, "d")
                    End If       '22年8月13日 追加                
                            Next i
                            
                                        '単勝ランク列
                                        Set rngB = .Range(.Cells(3, "d"), .Cells(2 + tosu, "d"))
                                
                                    .Range(.Cells(3, "d"), .Cells(2 + tosu, "d")) = v            'd列の単勝ランク
     
                                For i = 1 To tosu
                                    
                                    'd列の単勝ランクを新しく書換え
                     If .Cells(2+ i, "d") <> "" Then         '22年8月13日 追加 
                                     .Cells(i + 2, "d") = Application.WorksheetFunction.Rank _
                                                (.Cells(i + 2, "d"), rngB, 1)
                    End If       '22年8月13日 追加 

                                Next i
            
                                        '「馬のデータ」の枠色つきの馬番と単勝率をコピー   3
                                        .Range(.Cells(3, "c"), .Cells(2 + tosu, "d")).Copy
                
                                    For i = 44 To 69 Step 25
                                
                                        '馬連/馬単オッズtableの左側にペースト
                                        .Cells(i, clmTopA).PasteSpecial xlPasteAll

                                        '馬連/馬単オッズtableの上部にペースト
                                        .Cells(i - 2, "u").PasteSpecial _
                                            Paste:=xlPasteAll, _
                                            operation:=xlNone, _
                                            SkipBlanks:=False, _
                                            Transpose:=True
                                    Next i
                
                    End With

        '■■馬連/馬単テーブルの、行/列でのソート                  

                '馬連/馬単オッズtableを単勝人気(昇順)で行単位ソート      4
                    
                    For i = 44 To 69 Step 25
                    
                        With ws4
                            Set rngA = .Range(.Cells(i, clmTopA), .Cells(i + tosu - 1, clmTopA + tosu + 1))
                    
                                ws4.Sort.SortFields.Clear
                                    rngA.Sort _
                                    Key1:=.Cells(i, clmTopA + 1), Order1:=xlAscending, _
                                    Header:=xlNo, OrderCustom:=1

                '馬連/馬単オッズtableを単勝人気(昇順)で列単位ソート       5
                    
                            Set rngA = .Range(.Cells(i - 2, clmTopA + 2), .Cells(i + tosu - 1, clmTopA + tosu + 1))
                    
                                ws4.Sort.SortFields.Clear
                                    rngA.Sort _
                                    Key1:=.Rows(i - 1), Order1:=xlAscending, _
                                    Header:=xlNo, OrderCustom:=1, _
                                    MatchCase:=False, Orientation:=xlSortRows, _
                                    SortMethod:=xlPinYin
            
                        End With

                    Next i

End Sub
かいせつ
  1. 「馬のデータ」の単勝/馬連/馬単のオッズ率からランク付けします
  2. 単勝ランクが同位の場合、馬連のランクを加味して順位の再取得します
  3. 「馬のデータ」の色付き馬番と単勝ランクをコピーして、馬連/馬単オッズテーブルのそれぞれ左側にペースト後、テーブルの上側にペーストします
  4. 馬番と単勝ランクを含めた馬連/馬単オッズテーブルを単勝ランクで行単位ソート
    For i = 44 to 69 step25」iの値は「44、69」とstepにより25増えて変化します。馬連テーブルの先頭行44行目、その25行下の69行目に馬単テーブルの先頭行があります
  5. 「4」で並べ替えたテーブルを列単位でソートします
全オッズを率に変換

第4回のオッズを見やすく表に整形〉で表に配置した馬券別オッズを使用します。払戻率を元にこれらのオッズを率に変換します

単勝オッズを率に変える

「InpOds」シートのセルE7以下にある単勝オッズを単勝率に変換後、「Calc」シートのセルE3以下に書込みます。

Sub 全オッズを率に変換()
        Dim i As Integer, j As Integer
        Dim rowTop As Integer, rowBtm As Integer
        Dim v As Variant        '配列の変数
        Dim ritu As Single
        Dim clmBtm As Integer
        Dim total As Single

  '-----------------------------
    '出走馬の単勝を率に変換
  '-----------------------------
                    Set ws3 = Worksheets("InpOds")            ’1
                    Set ws4 = Worksheets("Calc")
                                 
             '■頭数の割り出し
             '  InpOdsシートのc列馬番の最大値をもとめて該当レースの頭数を割り出す
                tosu = Application.WorksheetFunction.Max(ws3.Range("c7:c24"))
                                                     
                                                     
             '■単勝オッズを率にする                                                                2
             
                    rowTop = 7       '"Preview""InpOds"シートのTop行
       
                    v = 0   '配列vの初期化
       
                With ws3
            
                    v = .Range(.Cells(rowTop, "e"), .Cells(rowTop + tosu - 1, "e"))
        
                        For i = 1 To tosu
                
                            If VarType(.Cells(rowTop + i - 1, "e").Value) = vbDouble Then      '単勝セル内容が数値なら実行
                        
                                v(i, 1) = 80 / v(i, 1)            '80/オッズで単勝の率を算出         3
              
                                Else
              
                                    v(i, 1) = ""       '数値以外の取り消しなら空欄
                
                            End If
        
                        Next i
                
                End With
                
                    With ws4
                    
                        .Range(.Cells(3, "e"), .Cells(3 + tosu - 1, "e")) = v        '配列で80/オッズを代入 
                    
                    End With

             '■単勝の率を枠番ごとにまとめる(9頭立て以上が枠連発売)        4
        
                If tosu >= 9 Then
  
                '出走馬の単勝の率をDSUM関数を使い枠ごとにまとめる
       
                    For i = 1 To 8
                    
                        With ws4
                            .Range("m3") = i     '馬ごとの単勝率を枠ごとにするための検索条件(セルに一時的においておく)
                                         
                                ritu = Application.WorksheetFunction. _
                                        DSum(.Range(.Cells(2, "b"), .Cells(2 + tosu, "e")), _
                                            .Range("e2"), .Range("m2:m3"))
                                
                                .Cells(2 + i, "p") = ritu
                        End With
                        
                    Next i

                End If
↓ここに続けて以下のマクロを書きます
かいせつ
  1. 使用するワークシートは”InpOds”と”Calc”になります
  2. 配列を使って”InpOds”シートにある出走馬の単勝オッズを率に変換します
  3. 単勝の払戻率は80%なのでオッズ率は「80÷単勝オッズ」になります。計算結果を”Calc”シートのセルE3以下の「馬のデータ」に書込みます
  4. E3以下の馬の単勝率をDsum関数を使って枠番ごとにまとめ、セルP3以下の「枠のデータ」に結果を記録します
馬券別のオッズを率に変換する

枠連/馬連/馬単の各オッズ率は、払戻率を参考に算出して「馬のデータ」「枠のデータ」に書き入れます。

↑上から続く
   '-----------------------------
        '馬券別のオッズを率に変換
    '-----------------------------

                clmTopA = 21        'U列
                      
             '■■枠連オッズを率に変換
        
                rowTop = 27               '1
                rowBtm = rowTop + 7
                clmBtm = clmTopA + 7
            
            
              With ws4          'ここのWith Endは■馬単の最終行にある
                                v = 0
                    v = .Range(.Cells(rowTop, clmTopA), .Cells(rowBtm, clmBtm) '2

                    For i = 1 To 8
                
                        For j = 1 To 8
                
                            'ゾロ目がない時(16頭未満や同枠の片方が取消)
                            If v(j, i) = 0 Then

                                v(j, i) = 0
                                    
                                    ElseIf i = j Then   'ゾロ目時の計算
                                        
                                        v(j, i) = 77.5 / v(j, i)                                
                                
                                    Else                 '通常の計算

                                        v(j, i) = (77.5 / v(j, i)) / 2       '3

                            End If
                            
                        Next j
                               
                    Next i
                              
                clmTopB = 42        'ap列                                           '4
                clmBtm = clmTopB + 7
                
                                '枠連のオッズを率に換算した書き込み範囲
                                .Range(.Cells(rowTop, clmTopB), .Cells(rowBtm, clmBtm)) = v
  
             '「枠のデータ」に枠率を書き込み

               For i = 0 To 7                                                          '5
                
                    .Cells(3 + i, "r") = WorksheetFunction. _
                    Sum(.Range(.Cells(rowTop, clmTopB + i), .Cells(rowBtm, clmTopB + i)))
                
                Next i
  
        '■■馬連オッズを率に変換
 
                    rowTop = 44 - 1         ’
                    clmTopA = clmTopA - 1
                
            For i = 1 To tosu
                    
                For j = 1 To tosu
                
                        v = 0
                        
                    v = .Cells(rowTop + j, clmTopA + i)
                        
                        If v <> "" Then
                         
                            v = 77.5 / v / 2    'オッズ率を2等分する  '7
                            
                                total = total + v
                          
                        End If
                    
                Next j
                        
                    ws4.Cells(i + 2, "g") = total  ’8
                    
                        total = 0
            Next i

        '■■馬単オッズを率に変換
            
                    rowTop = 69 - 1
                
            For i = 1 To tosu
                    
                For j = 1 To tosu
                
                        v = 0
                        
                    v = .Cells(rowTop + j, clmTopA + i)
                        
                        If v <> "" Then
                         
                            v = 75 / v       '9
                            
                                total = total + v
                          
                        End If
                    
                Next j
                        
                    ws4.Cells(i + 2, "i") = total
 
                        total = 0
            Next i
             
         End With

End Sub
かいせつ
  1. “Calc”シートの枠連オッズテーブルのセル範囲
  2. 枠連オッズ率は配列を使って算出
  3. 枠連オッズの払戻率は77.5%、オッズ率は単純に2等分する
  4. 枠連オッズテーブルのオッズ率算出結果は列AP(42列目)に書込む
  5. 枠ごとのオッズ率の合計を枠のデータの「列R」に出力
  6. “Calc”シートの馬連オッズテーブルのセル範囲(1行/1列手前に設定)
  7. 馬連オッズの払戻率は77.5%、オッズ率は単純に2等分する
  8. 馬連オッズテーブルの馬番ごとのオッズ率を集計したら直接「馬のデータ」の列Gに出力
  9. 馬単の払戻率は75%、馬券にはウラがないので2等分はしない

コメント

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