第4回 オッズを見やすく表に整形

スポンサーリンク
取得したオッズを見やすく表に整形します

前回は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    
             '旧  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

以下のように枠連のオッズが表として配置されます。オッズを回転複写(行列の入替え)しておくと枠ごとの取得率を集計する時にサクサクとできます。

枠連オッズを表にして配置
かいせつ
  1. 枠連のオッズ表作成処理
  2. Setを使い、オブジェクト型で宣言した変数ws3、ws4にシート名を代入。共にモジュール変数として複数のプロシージャで共有できる変数で宣言ずみ(A)
  3. VBAからワークシート関数を呼び出すにはApplicationオブジェクトのWorksheetFunctionプロパティを使用します。出馬表の馬番の最大値を求めて出走頭数を求めます
  4. InpOdsシートの枠連オッズ複写元の、該当軸枠オッズ初行と最終行を算出
  5. Withはステートメントの一種です。同じオブジェクト名が何度も出てくるような場合はWithを使ってオブジェクト名を省略して書くことができます。「With ws3〜End With」の間では指定したオブジェクト名(Ws3)の手前に「.」をつけることで省略することができます
  6. セル(Rangeオブジェクト)を格納する変数では「As Range」のように型指定をします。オブジェクト型で宣言したオブジェクト変数に、オブジェクトを格納するときは、「Set 変数名 = 値」のようにSetを使います
  7. 左辺と右辺のセル範囲の大きさを同じにすること、Valueも省略せずに書くことでセルの値(Value)はクリップボードを使わずにコピーされます
  8. 1枠から8枠までのオッズを回転複写(行列の入替え)することにより、枠ごとの取得率を計算しやすくなります。
  9. 21年11月3日、caRowT=26に変更しました
  10. 21年11月3日、buf=28を追加しました
  11. 21年11月3日、.Cells(caRowT+i,11)を.Cells(caRowT+i,buf)に変更
  • (A)第3回出馬表とオッズの取得で、module1(名前を変更した場合はそのモジュール)のプロシージャ〈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

馬単のマクロをここから書き始める
馬連オッズを表にして配置
かいせつ
  1. コンピュータは繰り返しが大得意。そこで繰り返しの回数が決まっているので「For〜Next文」を使います。馬番1から最終馬番ひとつ手前までの回数を反復処理をします。繰り返したい処理は「For」と「Next i」の間に書きます。
  2. 条件によって処理を変えたい場合は「If文」を使います。ここでは馬番が10でない時の処理を実行します。「inRowT=inRowE+2」と「+2」で2行下に設定
  3. 馬番が10の時、馬番9のオッズブロックと馬番10のブロックとの間は1行(1セル)で他のブロック間の2行と比べ1行少ないので「inRowT=inRowE+1」になります。
  4. 21年11月3日、caRowT=18caRowT=43に変更しました

前記のマクロの「馬単のマクロをここから書き始める」以下に次のマクロを書きます。

         '▼▼▼馬単処理▼▼▼
         
             '馬単の行と列の初期値
             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 
かいせつ
  1. 21年11月3日、caRowT=41caRowT=69に変更しました
馬単オッズを表にして配置

書き終えたら保存してさっそく実行しましょう。マクロの実行にはいくつかの方法があり、目的によって使い分けましょう。またプログラミングにはバグ(エラーの発生)はつきもので、その原因を探り、一つひとつ解決していきます。バグが発生した時の対処法は必須です。

コメント

  1. りー より:

    初めまして!競馬をExcelで予想できないかとい思い、検索していたらここにたどり着きました。
    今、このサイトを見ながらマクロを作成しているのですが、第4回のオッズを見やすく~まで実施しているのですが、オッズ表を作成するマクロを実行すると枠連のオッズ表の8枠より右のセルL列からAB列まで「#N/A」と表示され、34行目のL列からAB列には、K34の値がL列からAB列まで続いてしまいます。
    何か私のコードに間違いがあるのでしょうか?
    ご確認よろしくお願いいたします。

    • gamira gamira より:

      訪問いただきありがとうございます。
      ご質問の箇所は「Inpods」シートのオッズを「Calc」シートでオッズ表にするマクロということですが、
      実行してみましたが問題ないようです。
      kodak_7gbさんが実行した、それぞれのシートに入力されたデータのセル位置が、
      サイトに配置された画像と同じか確認してみてください。
      Tipsの「マクロのデバッグ」を参照して、
      どの部分にバグがあるかをみつけ修正することを試みてください。
      実行したいプロシージャに入力カーソルをいれ「F8」キーで1行づつ実行して、
      ワークシート上の動きが意図しないものなら、その部分を修正します。
      マクロは一発で動くことなどありません。根気よくデバッグとのたたかいです。
      kodak_7gbさん理想の予想プログラムができることを願っております。

      • りー より:

        ご返信いただきありがとうございます。
        いろいろとコードを確認し、gamira様の説明を見ながらなんとかマクロを流すことができました。
        また、第11回までのマクロも流すことができました。
        ありがとうございます。
        第12回もまたあるでしょうか?
        楽しみにしています。

        • gamira gamira より:

          りー様
          結果ご報告いただきありがとうございます。
          第11回までお付き合いいただき感謝いたします。
          こんなに速く修正できるとはVBAの達人とお見受けしました。
          りー様のような方に拙いコードをお見せするのは恥ずかしい限りです。
          当サイトではあらゆる角度からオッズを眺め、何でこうなるのを
          考えていくことをモットーとしております。
          忙しいのを理由に秋競馬が始まるころには
          第12回として時間差のオッズを見比べて見たいと思います。
          よろしくお願いいたします。

          • りー より:

            いえいえ、VBAほぼ初心者です。
            仕事で少し使うくらいでコードはほとんどわかりませんが、なんとなくここがこういうことかと考えながらやってます。
            またよろしくお願いします。

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