【競馬】Visual Basic で JRA-VAN DataLab. のデータを取得する
Visual Basic で JV-Link を操作することにより、JRA-VAN DataLab. が提供する競馬データを取得することができます。
今回は Visual Basic を使って簡単な競馬ソフトを作りたいと思います。
1. 動作環境
OS : Windows
どこまで古いバージョンで動作するかは分からないですが、Windows 10 以降であれば問題ないはずです。
私の使っている環境は
Windows 11 Home (64bit 版)
です。
2. JV-Link のインストール
こちらのページの [動作確認 (JV-Link)] のタブからインストーラーをダウンロードしてインストールおよび初期設定を行って下さい。
※ 使用するには JRA-VAN DataLab. の会員登録が必要です。
3. Visual Studio 2019 のインストール
Visual Studio Installer を使って Visual Studio Community 2019 をインストールします。
ワークロードには [デスクトップとモバイル] > [.NET デスクトップ開発] を選択します。
※ Visual Studio 2019 を使用して下さい。Visual Studio 2020 は IDE 自体が 64bit 化されたためか、この記事の手順ではうまくいきません。
4. 新規プロジェクトの作成
Visual Studio 2019 を起動し、[新しいプロジェクトの作成] をクリックします。
プロジェクト テンプレートから Visual Basic 用の [Windows フォーム アプリケーション (.NET Framework)] を選択し、[次へ] ボタンをクリックします。
※ [Windows フォーム アプリ] の方ではないので注意して下さい。
プロジェクト名、場所、ソリューション名を設定し、[作成] ボタンをクリックします。
プロジェクト名、ソリューション名はデフォルトの [WindowsApp1] としています。
新規のプロジェクトが作成されました。
画面左端の [ツールボックス] タブをクリックします。
ツールボックス パネルが開いたら、ピンマークをクリックしツールボックス パネルを固定します。
5. JVLink Class の表示(初回のみ)
ツールボックス内の [全般] を右クリックし、[アイテムの選択] をクリックします。
ツールボックス アイテムの選択画面が開きます。
[COM コンポーネント] タブを開き、[JVLink Class] にチェックを入れ、[OK] ボタンをクリックします。
ツールボックス内に [JVLink Class] が表示されれば OK です。
※ JVLink Class の表示は一度行えば設定が保存されます。
6. プロジェクトの作成
ツールボックス内の [コモン コントロール] > [Button] をフォーム上に配置します。
IDE 画面右下のプロパティの Name はデフォルトの [Button1] としています。
ツールボックス内の [全般] > [JVLink Class] をフォーム上に配置します。
※ JVLink Class は実行時に表示されないので、レイアウトを気にする必要はありません。
Name はデフォルトの [AxJVLink1] としています。
デザインビューのフォームを選択し、プロパティをイベント タブに切り替え、[Load] の右側の空欄をダブルクリックします。
Form1_Load プロシージャが追加された状態でコードエディタが開きます。
Form1_Load プロシージャの中身を下記コードで上書きします。
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim sid As String = "UNKNOWN"
Dim returnCode As Long
'JVLink初期化
returnCode = Me.AxJVLink1.JVInit(sid)
'JVInitエラー処理
If returnCode <> 0 Then
MessageBox.Show("JVInitエラー:" & returnCode)
Exit Sub
End If
End Sub
デザインビューのフォーム上の Button1 をダブルクリックします。
Button1_Click プロシージャが追加されます。
Button1_Click プロシージャの中身を下記コードで上書きします。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim returnCode As Long
Const buffSize As Long = 40000
Const nameSize As Long = 256
Dim buff As String
Dim fileName As String
Dim raceName As String
Dim raceNames As String = ""
'速報系データの0B12を呼び出し
'日付は直近の土日を指定して下さい
returnCode = Me.AxJVLink1.JVRTOpen("0B12", "20230430")
'JVRTOpenエラー処理
If returnCode <> 0 Then
MessageBox.Show("JVOpenエラー:" & returnCode)
Exit Sub
End If
returnCode = 1
While returnCode <> 0
'バッファ作成
buff = New String(vbNullChar, buffSize)
fileName = New String(vbNullChar, nameSize)
returnCode = Me.AxJVLink1.JVRead(buff, buffSize, fileName)
'JVReadエラー処理
If returnCode < -1 Then
MessageBox.Show("JVReadエラー:" & returnCode)
Exit While
End If
If Mid(buff, 1, 2) = "RA" Then
'レース名を抽出し末尾のスペースを除去
raceName = Mid(buff, 33, 30).TrimEnd()
'レース名が空文字でなければレース名一覧に結合
If raceName <> "" Then
raceNames = raceNames & raceName & vbCrLf
End If
End If
End While
'レース名一覧を表示
MessageBox.Show(raceNames)
'JVLink 終了処理
returnCode = Me.AxJVLink1.JVClose()
End Sub
12 行目の
returnCode = Me.AxJVLink1.JVRTOpen("0B12", "20230430")
の日付部分は直近の土日(中央競馬のレースが開催された日)を yyyymmdd 形式で指定して下さい。
※ このコードで取得している速報系データはレース後 1 週間程で配信されなくなるので、古い開催日を指定してもデータは取得できません。
7. 動作確認
[開始] ボタンをクリックします。
Form1 が表示されたら、Button1 をクリックします。
メッセージボックスにレース名が表示されれば OK です。
レース開催が無い日や、古い開催日をコード内で指定している場合は下図のようなエラーが発生します。