騎手リーディングデータを削除して入力先頭列にジャンプ
ここでのマクロはB4セルのプルダウンで指定した競馬場の騎手データを消去後、その競馬場トップ列にジャンプしてペーストを待ちます。アクティブシートに適用されるので、このマクロはJockeyとTrainerは共通です。では、標準モジュールを追加して以下のマクロを書いていきます。
Option Explicit
Dim jmp_topClm As Integer '1
Sub data_del()
'====================================================
' 指定した競馬場のランクを消去してコピペの準備
' Jockey Trainer共通(アクティブシートに適用)
'====================================================
Dim delRng As Range
Dim ws As Worksheet
Dim srchKey As Range
Dim srchRng As Range
Dim jmp_btmClm As Long
Set ws = Worksheets("Item")
Set srchRng = ws.Range("b3:d13") '2 Itemの競馬場一覧表
Set srchKey = Range("b4") '3 Jockey Trainerシートの競馬場指定欄
'指定競馬場の先頭列番取得
jmp_topClm = WorksheetFunction.VLookup(srchKey, srchRng, 3, False) '4
'指定競馬場のデータ消去
If jmp_topClm = 5 Then '全国は5列目(全国の時適用)
jmp_btmClm = jmp_topClm + 16 '5
Else
jmp_btmClm = jmp_topClm + 15 '6
End If
Set delRng = Range(Cells(4, jmp_topClm), Cells(43, jmp_btmClm))
delRng.ClearContents
'指定競馬場のTop列に移動してペーストを待つ
Cells(4, jmp_topClm).Select
End Sub
Sub Rank_paste() '7
・・・・・
・・・・・・
End Sub
Sub Ranking() '8
・・・・・・・
・・・・・・・
End Sub
リーディングをコピペする
ここまで、例えば全国のリーディングデータを消去したら、アクティブセルがE4に移動というマクロを作りました。つぎは移動したセルE4にコピーしたデータをショートカットキー[cntl+a]を使ってペーストするマクロです。
Sub Rank_paste()
'(ctrl+a)で実行 '8
'Jockey Trainer共通のマクロ
'=====================================
' JRAのHPからリーディングをコピー後
' ペースト処理するマクロ
'======================================
Dim rowAdd4 As Integer '行位置初期値
Dim rowAdd As Integer 'アクティブセルの行アドレス
Dim clmAdd As Integer 'アクティブセルの列アドレス
rowAdd4 = 4 '指定馬場の先頭行
rowAdd = ActiveCell.Row '指定馬場でアクティブセルを指定済み
clmAdd = ActiveCell.Column '指定馬場でアクティブセルを指定済み
'貼付け先の書式に合わせてペースト
ActiveSheet.PasteSpecial _
Format:="HTML", _
Link:=False, _
DisplayAsIcon:=False, _
NoHTMLFormatting:=True
'正しく複写されていない場合は複写データを消去して再コピー _
ランク1位~20位の処理
If Cells(rowAdd4 + 1, clmAdd) = "" Then '1 正しく複写されていない場合はE5が空欄
Cells(rowAdd4, clmAdd).ClearContents ’*
Cells(rowAdd4, jmp_topClm).Value = "再度コピーしてください" '2
Exit Sub
ランク1位~20位は正常に複写済み _
ランク21位~40位が正しく複写されていない場合は _
複写データを消去して再コピー '3
ElseIf Cells(rowAdd4 + 1, clmAdd) <> "" And _
Cells(rowAdd + 1, clmAdd) = "" Then
Cells(rowAdd, clmAdd).Value = "再度コピーしてください"
Exit Sub
Else
rowAdd = rowAdd + 20 '4 セル行位置を20行下に設定
Cells(rowAdd, clmAdd).Select
End If
'ランク40位までペーストしたら、ランク付けをする '5
If rowAdd = 44 Then
Call Ranking '6
Range("b4").Select ’ topの競馬場選択セルに移動 '7
End If
End Sub
騎手の勝率・連対率にランクをつける
リーディングデータは勝ち数順に並んでいます。勝ち数が上位でも騎乗回数が多く勝率は良くない場合もあります。どちらを重視するかは人それぞれですが、ここでは勝率と連対率のランク付けをします。下記プロシージャ中、青文字部分はJRAの現リーディングデータでは不要ですので書かなくても問題ありません。
Sub Ranking() '==================================== '騎手・調教師のランク付け '==================================== Dim ws As Worksheet Dim i As Long Dim winRate As Long Dim ofSet As Long Dim endRow As Integer Dim c As Range Dim fndRow As Long Set ws = Worksheets("Item") winRate = jmp_topClm + 10 '1データの勝率セル列 '指定馬場で全国選択時のTop列 If jmp_topClm = 5 Then '全国のランキング ofSet = 5 '2 勝率列から5列移動して勝率順位記入 '競馬場別の場合のTop列 ElseIf jmp_topClm <> 5 Then '競馬場別ランキングの場合 ofSet = 4 '3 勝率列から4列移動して勝率順位記入 End If '各競馬場データの最終行検出 endRow = Cells(Rows.Count, winRate).End(xlUp).Row 'i=0は項目の勝率列 i=1は項目の連対率列 For i = 0 To 1 '4 winRate = winRate + i For Each c In Range(Cells(4, winRate), Cells(endRow, winRate)) c.Offset(0, ofSet) = Application.WorksheetFunction.Rank _ (c.Value, Range(Cells(4, winRate), Cells(endRow, winRate)), 0) '5 Next c Next i '■■■ランキングの騎手名欄 の処理 ’6 Dim nameRng As Range Dim txt As String Dim findStr As Variant '騎手ランキング検索範囲(札幌~小倉) Set nameRng = Range(Cells(4, jmp_topClm + 1), Cells(endRow, jmp_topClm + 1)) '外国人騎手のピリオドを全角から半角にする _ 免許を有さない騎手の頭についている「*」をとる For Each c In nameRng txt = c.Value txt = Replace(txt, ".", ".") '全角を半角に txt = Replace(txt, "*", "") '「*」をとる c.Value = txt Next c For Each c In nameRng '外国人騎手の全角英字を半角英字に置き換え '置き換え対象外の左から2文字目以降(100文字までにしてある) findStr = Mid(c.Value, 2, 100) '1文字目が全角英字なら半角英字に変換 If Left(c.Value, 1) Like "[A-Z]" Then findStr = StrConv(Left(c.Value, 1), vbNarrow) & findStr Else findStr = Left(c.Value, 1) & findStr End If c.Value = findStr Next c '更新済みの競馬場名の入力 7 fndRow = Cells(20, "b").End(xlUp).Row Cells(fndRow + 1, "b").Value = Range("b4").Value End Sub
これでJockeyシートの「全国」のレイアウトとマクロができ上がりました。フォームコントロールボタン「指定馬場消去&入力」に「Sub data_del ()」をマクロ登録してください。
コメント