トップに戻る

VBAで馬番と出走数から枠番を出す関数

競馬の枠番ってどうやって計算するんじゃろなと考えながら、こんなものが出来上がりました。

VBAの標準モジュールに以下のコードをコピペした後、ワークシートのセルにこの関数を使用する数式を入れれば、枠番を出してくれます。

MITライセンスにするため、前置きのコメントが長いですがご容赦ください。

あと、Try-Catch-Finallyもどきを入れてますが、Javaをほとんど触ってないので、使い方が間違っているかもしれません。

このプログラムについてのご質問や、"Try-Catch-Finallyの使い方はこうじゃねぇぞ"といったツッコミがありましたら、ツイッターやメールでお願いいたします。

プログラムバージョン:1.001 変数名や処理を微妙に変えました。返り値をVariantにして、不正な値を入力した時に#NUM!を返すようにしました。

Option Explicit

' GetBracketNum関数 番号と出走数から枠番を出す関数
' Copyright (C) 2020 マヴユーユ (twitter:mavyuuyu)
' このプログラムのライセンスは、MIT Licenseです。
' This software is released under the MIT License.
' http://opensource.org/licenses/mit-license.php
' MIT Licenseの日本語訳は、以下のURLをご参照ください。
' https://ja.osdn.net/projects/opensource/wiki/licenses%2FMIT_license
'
' ******************** 使い方 ********************
' この関数は、シート上のセルでも計算することが出来ます。
' 数式例1・競馬の場合: =GetBracketNum(馬番, 出走数)
' 数式例2・競輪の場合: =GetBracketNum(車番, 出走数, 6)
' 枠数は省略すると、8が指定されます。
' ************************************************

Private Const ERR_INVALID_NUM = 10001

Public Function GetBracketNum( _
    ByVal num As Long, _
    ByVal num_of_entries As Long, _
    Optional ByVal num_of_brackets As Long = 8 _
) As Variant
    
    On Error GoTo ErrorHandler
    Dim ret As Variant
    If IsValidNum(num, num_of_entries, num_of_brackets) = False Then
        Err.Raise ERR_INVALID_NUM
    ElseIf num_of_entries <= num_of_brackets Then
        num_of_brackets = num_of_entries
    End If
    
    Dim i As Long
    For i = 1 To num_of_brackets
        Dim numInBracket As Long, cnt As Long
        numInBracket = Int((num_of_entries + i - 1) / num_of_brackets)
        cnt = cnt + numInBracket
        If num <= cnt Then
            ret = i
            GoTo Finally
        End If
    Next i

ErrorHandler:
    If Err.Number = ERR_INVALID_NUM Then
        ret = CVErr(xlErrNum)
        GoTo Finally
    End If
    Dim errMsg As String
    errMsg = "エラーが発生しました。" & vbCrLf & _
             "エラー番号:" & Err.Number & vbCrLf & _
             Err.Description
    Exit Function

Finally:
    GetBracketNum = ret

End Function

Private Function IsValidNum( _
    ByVal num As Long, _
    ByVal num_of_entries As Long, _
    ByVal num_of_brackets As Long _
) As Boolean
    Dim ret As Boolean
    If num > 0 And _
       num_of_entries > 0 And _
       num_of_brackets > 0 And _
       num_of_entries >= num Then
        ret = True
    End If
    IsValidNum = ret
End Function

      

数式として使用するには、標準モジュールに上記のプログラムをコピペした後、以下のように数式を入力します。