券種ごとのオッズテーブルを単勝人気順に並べ替える
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 '枠色つきの枠番のコピペ 3 .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 下に続く
券種別のオッズテーブルをソートします。まず縦方向(行)に、次いで横方向(列)に単勝人気順で並べ替えます。こうすると券種別のオッズテーブルが単勝人気組合せ順に並べることができます。
上から続く '----------------------------------------------- _ 馬券別のオッズテーブルを単勝人気順に並べる _ ------------------------------------------------ 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 ’ここから馬単/馬連共通処理を書く
'■■馬連/馬単共通処理 '出走馬単勝のランキング 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
全オッズを率に変換
〈第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 ↓ここに続けて以下のマクロを書きます
馬券別のオッズを率に変換する
枠連/馬連/馬単の各オッズ率は、払戻率を参考に算出して「馬のデータ」「枠のデータ」に書き入れます。
↑上から続く '----------------------------- '馬券別のオッズを率に変換 '----------------------------- 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 ’6 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
コメント