取得したオッズを見やすく表に整形します
前回はjraのサイトからオッズをコピーしてワークシートにペーストするマクロを書いたわけですが、うまくできましたか。今回のマクロはmodule1(名前を変更した場合はそのモジュール)のEnd Subの下に続けて書いていきます。また、サンプルのシート名と同じにしたと仮定して〈InpOdds〉〈Calc〉シートを使います。
取得したオッズの1レース分を整頓します(21年11月3日 5ヶ所変更)
〈InpOdds〉シートにペーストした1レース分の枠連、馬連、馬単のオッズを〈Calc〉シートに整形して書き込みます。1R〜12Rまでをまとめて実行する場合は同じ処理を繰り返し行う「For Nextステートメント」を使いますが、それはまたの機会にして、まずは1レース分のオッズを整形します。
※21年11月3日に【枠連処理】で3ヶ所、【馬連処理】で1ヶ所、【馬単処理】で1ヶ所変更しましたので、それ以前に作られた方は修正をお願いします。
Sub odds表作成() Dim i As Long Dim arr As Variant Dim OdsRngA As Range, OdsRngB As Range Dim caRowT As Long, caRowE As Long Dim inRowT As Long, inRowE As Long Dim buf As Long Dim tosu As Long '▼▼▼枠連処理▼▼▼ 1 '枠連の行と列の初期値 caColm = 3 'Calcシートのoddsの列top位置(c列)全式別共通 inRowE = 5 'InpOdsシート:odds行位置
caRowT = 26 'Calcシートのoddsの行top位置、枠連26/馬連43/馬単69 9 '旧 caRowT = 5 '21年11月3日上段のように変更 caRowE = caRowT + 8 'Calcシートのoddsの最終行
buf = 28 '新規に追加しました10 Set ws3 = Worksheets("InpOds") '2 Set ws4 = Worksheets("Calc") 'c列馬番の最大値から頭数を割り出す tosu = Application.WorksheetFunction. _ Max(ws3.Range("c7:c24")) '3 '■■枠連のオッズを、InpOdsからCalcシートへ配置 For i = 1 To 8 '1枠~8枠がらみの夫々のオッズ範囲(Top~最終行) 4 inRowT = inRowE + 3 'InpOdsシートのオッズTop位置 inRowE = inRowT + (8 - i) 'InpOdsシートのオッズ最終行 'オッズの複写元範囲(InpOdsシート) With ws3 5 Set OdsRngA = .Range(.Cells(inRowT, "n"), .Cells(inRowE, "n")) '6 End With 'オッズの複写先範囲(Calcシート) With ws4 Set OdsRngB = .Range(.Cells(caRowT + i, caColm + i), .Cells(caRowE, caColm + i)) End With 'オッズの複写 OdsRngB.Value = OdsRngA.Value '7 Next i '■■Calcシートの枠連オッズ回転複写(配列で行列入替) For i = 1 To 7 '8 '回転元 With ws4 arr = .Range(.Cells(caRowT + 1 + i, caColm + i), .Cells(caRowE, caColm + i)).Value End With '配列収納 arr = WorksheetFunction.Transpose(arr) '回転先に配置 With ws4 .Range(.Cells(caRowT + i, caColm + 1 + i), .Cells(caRowT + i, buf)) = arr
'11 End With Next i
’馬連のマクロはここから書き始める End Sub
以下のように枠連のオッズが表として配置されます。オッズを回転複写(行列の入替え)しておくと枠ごとの取得率を集計する時にサクサクとできます。
次は馬連のオッズを表に整形します。「馬連のマクロはここから書き始める」から以下のマクロを書きます。
'▼▼▼馬連処理▼▼▼ '馬連の行と列の初期値 inRowE = 5 'InpOdsシート:odds行位置 caRowT = 43 'Calcシートのoddsの行top位置、枠連26/馬連43/馬単69 '旧 caRowT = 18 '21年11月3日変更 上段のように変更しました 4 caRowE = caRowT + tosu 'Calcシートのoddsの最終行 '■■馬連のオッズを、InpOdsからCalcシートへ配置 For i = 1 To tosu - 1 '1 '◆軸馬番10番を除くオッズ取得の処理 'InpOdsシートでの操作(軸馬Aと軸馬Bのブロック間は1セルアキと馬番表題の合計2セルアキ) '軸馬番ごとのオッズのTop~End If i <> 10 Then '2 inRowT = inRowE + 2 'オッズTop位置 inRowE = inRowT + (tosu - i) 'オッズ最終行 'オッズの複写元範囲(InpOdsシート) With ws3 Set OdsRngA = .Range(.Cells(inRowT, "p"), .Cells(inRowE, "p")) End With 'オッズの複写先範囲(Calcシート) With ws4 Set OdsRngB = .Range(.Cells(caRowT + i, caColm + i), .Cells(caRowE, caColm + i)) End With 'オッズの複写 OdsRngB.Value = OdsRngA.Value Else '■軸馬番10番のオッズ取得の処理(軸9のブロックと軸10のブロック間だけ馬番表題の1セルのみアキ) inRowT = inRowE + 1 'オッズTop位置 3 inRowE = inRowT + (tosu - i) 'オッズ最終行 'オッズの複写元範囲(InpOdsシート) With ws3 Set OdsRngA = .Range(.Cells(inRowT, "p"), .Cells(inRowE, "p")) End With 'オッズの複写先範囲(Calcシート) With ws4 Set OdsRngB = .Range(.Cells(caRowT + i, caColm + i), .Cells(caRowE, caColm + i)) End With 'オッズの複写 OdsRngB.Value = OdsRngA.Value End If Next i '■■Calcシートの馬連オッズ回転複写(配列で行列入替) buf = caColm + tosu 'Calcシートのオッズテーブル最終列 For i = 1 To tosu - 1 '回転元 With ws4 arr = .Range(.Cells(caRowT + i, caColm + i), .Cells(caRowE, caColm + i)).Value End With '配列収納 arr = WorksheetFunction.Transpose(arr) '回転先に配置 With ws4 .Range(.Cells(caRowT + i, caColm + i), .Cells(caRowT + i, buf)) = arr End With Next i 馬単のマクロをここから書き始める
前記のマクロの「馬単のマクロをここから書き始める」以下に次のマクロを書きます。
'▼▼▼馬単処理▼▼▼ '馬単の行と列の初期値 inRowE = 5 'InpOdsシート:odds行位置 caRowT = 69 'Calcシートのoddsの行top位置、枠連26/馬連43/馬単69 '旧 caRowT = 41 '21年11月3日 上段のように変更しました 1 caRowE = caRowT + tosu 'Calcシートのoddsの最終行 '■■馬単のオッズを、InpOdsからCalcシートへ配置 For i = 1 To tosu '◆軸馬番10番を除くオッズ取得の処理(軸馬Aと軸馬Bのブロック間は1セルアキと馬番表題の合計2セルアキ) If i <> 10 Then inRowT = inRowE + 3 'オッズTop位置 inRowE = inRowT + tosu - 1 'オッズ最終行 'オッズの複写元範囲(InpOdsシート) With ws3 Set OdsRngA = .Range(.Cells(inRowT, "r"), .Cells(inRowE, "r")) End With 'オッズの複写先範囲(Calcシート) With ws4 Set OdsRngB = .Range(.Cells(caRowT, caColm + i), .Cells(caRowT + tosu - 1, caColm + i)) End With 'オッズの複写 OdsRngB.Value = OdsRngA.Value Else ' '◆軸馬番10番限定オッズ取得の処理(軸9のブロックと軸10のブロック間だけ馬番表題の1セルのみアキ) inRowT = inRowE + 2 'オッズTop位置 inRowE = inRowT + tosu - 1 'オッズ最終行 'オッズの複写元範囲(InpOdsシート) With ws3 Set OdsRngA = .Range(.Cells(inRowT, "r"), .Cells(inRowE, "r")) End With 'オッズの複写先範囲(Calcシート) With ws4 Set OdsRngB = .Range(.Cells(caRowT, caColm + i), .Cells(caRowT + tosu - 1, caColm + i)) End With OdsRngB.Value = OdsRngA.Value End If Next i End Sub
書き終えたら保存してさっそく実行しましょう。マクロの実行にはいくつかの方法があり、目的によって使い分けましょう。またプログラミングにはバグ(エラーの発生)はつきもので、その原因を探り、一つひとつ解決していきます。バグが発生した時の対処法は必須です。
コメント
初めまして!競馬をExcelで予想できないかとい思い、検索していたらここにたどり着きました。
今、このサイトを見ながらマクロを作成しているのですが、第4回のオッズを見やすく~まで実施しているのですが、オッズ表を作成するマクロを実行すると枠連のオッズ表の8枠より右のセルL列からAB列まで「#N/A」と表示され、34行目のL列からAB列には、K34の値がL列からAB列まで続いてしまいます。
何か私のコードに間違いがあるのでしょうか?
ご確認よろしくお願いいたします。
訪問いただきありがとうございます。
ご質問の箇所は「Inpods」シートのオッズを「Calc」シートでオッズ表にするマクロということですが、
実行してみましたが問題ないようです。
kodak_7gbさんが実行した、それぞれのシートに入力されたデータのセル位置が、
サイトに配置された画像と同じか確認してみてください。
Tipsの「マクロのデバッグ」を参照して、
どの部分にバグがあるかをみつけ修正することを試みてください。
実行したいプロシージャに入力カーソルをいれ「F8」キーで1行づつ実行して、
ワークシート上の動きが意図しないものなら、その部分を修正します。
マクロは一発で動くことなどありません。根気よくデバッグとのたたかいです。
kodak_7gbさん理想の予想プログラムができることを願っております。
ご返信いただきありがとうございます。
いろいろとコードを確認し、gamira様の説明を見ながらなんとかマクロを流すことができました。
また、第11回までのマクロも流すことができました。
ありがとうございます。
第12回もまたあるでしょうか?
楽しみにしています。
りー様
結果ご報告いただきありがとうございます。
第11回までお付き合いいただき感謝いたします。
こんなに速く修正できるとはVBAの達人とお見受けしました。
りー様のような方に拙いコードをお見せするのは恥ずかしい限りです。
当サイトではあらゆる角度からオッズを眺め、何でこうなるのを
考えていくことをモットーとしております。
忙しいのを理由に秋競馬が始まるころには
第12回として時間差のオッズを見比べて見たいと思います。
よろしくお願いいたします。
いえいえ、VBAほぼ初心者です。
仕事で少し使うくらいでコードはほとんどわかりませんが、なんとなくここがこういうことかと考えながらやってます。
またよろしくお願いします。