券種ごとのオッズテーブルを単勝人気順に並べ替える
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 下に続く
かいせつ
- call ○○○で オッズ表作成を呼び出し実行後このプロシージャに戻ってきます(オッズ表作成マクロは第4回オッズを見やすく表に整形に掲載済み)
- ”Item”シート上の色分けした枠番/馬番を”Calc”シートの「馬のデータ」「枠のデータ」にコピペします(マクロではなく簡単なエクセルのコピー&ペーストを使いました)
- 枠色つきの枠番は”Item”シートに作ってあります(Tips カラーの設定〈セルの塗りと文字色〉)
- モジュール「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 ’ここから馬単/馬連共通処理を書く
かいせつ
- “Calc”シートのオッズテーブル先頭列位置(全テーブル共通)です
- 「枠のデータ」の単勝率/枠連率に順位を付けます
- 単勝率ランクがが同位の場合、枠連率を加味して順位の再取得します
- 「枠のデータ」の枠番と単勝率を、オッズテーブルの左側と上側にペーストします
- 枠番と単勝率を含めたオッズテーブルを行単位の人気順でソートします
- 「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
かいせつ
- 「馬のデータ」の単勝/馬連/馬単のオッズ率からランク付けします
- 単勝ランクが同位の場合、馬連のランクを加味して順位の再取得します
- 「馬のデータ」の色付き馬番と単勝ランクをコピーして、馬連/馬単オッズテーブルのそれぞれ左側にペースト後、テーブルの上側にペーストします
- 馬番と単勝ランクを含めた馬連/馬単オッズテーブルを単勝ランクで行単位ソート
「For i = 44 to 69 step25」iの値は「44、69」とstepにより25増えて変化します。馬連テーブルの先頭行44行目、その25行下の69行目に馬単テーブルの先頭行があります - 「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 ↓ここに続けて以下のマクロを書きます
かいせつ
- 使用するワークシートは”InpOds”と”Calc”になります
- 配列を使って”InpOds”シートにある出走馬の単勝オッズを率に変換します
- 単勝の払戻率は80%なのでオッズ率は「80÷単勝オッズ」になります。計算結果を”Calc”シートのセルE3以下の「馬のデータ」に書込みます
- 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 ’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
かいせつ
- “Calc”シートの枠連オッズテーブルのセル範囲
- 枠連オッズ率は配列を使って算出
- 枠連オッズの払戻率は77.5%、オッズ率は単純に2等分する
- 枠連オッズテーブルのオッズ率算出結果は列AP(42列目)に書込む
- 枠ごとのオッズ率の合計を枠のデータの「列R」に出力
- “Calc”シートの馬連オッズテーブルのセル範囲(1行/1列手前に設定)
- 馬連オッズの払戻率は77.5%、オッズ率は単純に2等分する
- 馬連オッズテーブルの馬番ごとのオッズ率を集計したら直接「馬のデータ」の列Gに出力
- 馬単の払戻率は75%、馬券にはウラがないので2等分はしない
コメント