![見出し画像](https://assets.st-note.com/production/uploads/images/103519019/rectangle_large_type_2_16503873bbcbbf32dd348c83f545bae6.png?width=800)
【競馬】Excel VBA で JRA-VAN DataLab. のデータを取得する
Excel VBA で JV-Link を操作することにより、JRA-VAN DataLab. が提供する競馬データを取得することができます。
今回は Excel を使って簡単な競馬ソフトを作りたいと思います。
※ Excel は 32bit 版を使用して下さい。64bit 版では JV-Link が使えません。
1. 事前準備
事前準備に関してはこちらの記事を参照して下さい。
2. 作成手順
Excel で新規の空白のブックを作成し、適当な名前で保存します。
このとき、ファイルの種類を [Excel ブック (*.xlsx)] ではなく [Excel マクロ有効ブック (*.xlsm)] に設定して下さい。
![](https://assets.st-note.com/img/1681978287786-VaqZ3bBLT9.png?width=800)
[開発] タブの [Visual Basic] をクリックします。
![](https://assets.st-note.com/img/1681978984027-0yAaRl6jP7.png?width=800)
Microsoft Visual Basic for Applications の画面が開きます。
![](https://assets.st-note.com/img/1681979734390-Bs1kdCSc1K.png?width=800)
[挿入] > [ユーザーフォーム] をクリックします。
![](https://assets.st-note.com/img/1681979882263-URS5jtQd4m.png?width=800)
ユーザーフォームが追加されます。
オブジェクト名はデフォルトの [UserForm1] としています。
![](https://assets.st-note.com/img/1681989431269-aW0H8qjQKP.png?width=800)
ユーザーフォーム上にコマンドボタンを配置します。
オブジェクト名はデフォルトの [CommandButton1] としています。
![](https://assets.st-note.com/img/1681981659137-kfEdatHkGj.png?width=800)
ユーザーフォーム上に JV-Link を配置します。
オブジェクト名はデフォルトの [JVLink1] としています。
※ JV-Link は実行時に表示されないので、レイアウトを気にする必要はありません。
![](https://assets.st-note.com/img/1681989784451-YQYbMF2wDo.png?width=800)
ユーザーフォーム上に配置したコマンドボタンをダブルクリックしてコードエディタを開きます。
![](https://assets.st-note.com/img/1681981787448-wWqJ2NeETx.png?width=800)
コード全体を下記コードで上書きします。
Private Sub CommandButton1_Click()
Dim sid As String
Dim retval As Long
Dim buff As String
Dim filename As String
Dim racename As String
Dim racenames As String
sid = "UNKNOWN"
'JVLinkを初期化
JVLink1.JVInit (sid)
'速報系データの0B12を呼び出し
'日付は直近の土日を指定して下さい
retval = JVLink1.JVRTOpen("0B12", "20230416")
'JVRTOpenエラー処理
If (retval < 0) Then
MsgBox ("JVRTOpenエラー。RC=" & retval)
GoTo CommandButton1_END
End If
retval = 1
While retval <> 0
'JVRTOpenで指定したデータを1レコードずつ取り込み
retval = JVLink1.JVRead(buff, 40000, filename)
'JVReadエラー処理
If (retval < -1) Then
MsgBox ("JVReadエラー。RC=" & retval)
GoTo CommandButton1_END
End If
If Left(buff, 2) = "RA" Then
'レース名を抽出し末尾のスペースを除去
racename = RTrim(Right(Left(buff, 62), 30))
'レース名が空文字でなければレース名一覧に結合
If racename <> "" Then
racenames = racenames & racename & vbCrLf
End If
End If
DoEvents
Wend
'レース名一覧を表示
MsgBox (racenames)
CommandButton1_END:
'一通り読み込みが終わった後はJVCloseを行う
JVLink1.JVClose
End Sub
16 行目の
retval = JVLink1.JVRTOpen("0B12", "20230416")
の日付部分は直近の土日(中央競馬のレースが開催された日)を yyyymmdd 形式で指定して下さい。
※ このコードで取得している速報系データはレース後 1 週間程で配信されなくなるので、古い開催日を指定してもデータは取得できません。
[挿入] > [標準モジュール] をクリックします。
![](https://assets.st-note.com/img/1682714116563-nMuRfQ2OcP.png?width=800)
標準モジュールが追加されます。
![](https://assets.st-note.com/img/1681986457698-t3DEP1C7I4.png?width=800)
コードエディタに下記コードを入力します。
Sub macro1()
UserForm1.Show
End Sub
![](https://assets.st-note.com/img/1681986703039-Y6YnRjvwk2.png?width=800)
3. 動作確認
Excel の画面に戻り、[開発] タブの [マクロ] をクリックします。
![](https://assets.st-note.com/img/1681987111980-gRTuecxO3K.png?width=800)
マクロ画面が表示されたら、macro1 が選択されていることを確認し [実行] ボタンをクリックします。
![](https://assets.st-note.com/img/1681987217746-SXRa67KooN.png)
ユーザーフォームが表示されたら、ボタンをクリックします。
![](https://assets.st-note.com/img/1681987290519-wap18pHzgc.png)
メッセージボックスにレース名が表示されれば OK です。
![](https://assets.st-note.com/img/1681988249952-0lH3WdsREg.png)
レース開催が無い日や、古い開催日をコード内で指定している場合は下図のようなエラーが発生します。
![](https://assets.st-note.com/img/1681988632595-6CAXGJQPui.png?width=800)
この記事が気に入ったらサポートをしてみませんか?