空手の形の試合の得点計算 ~ダミーデータ作成~

先日長男が、他県某市で空手の試合に出場した。
形の試合(決勝)では、採点方式で優劣が競われた。

  1. 主審1名と副審4名が採点する。
  2. 一人の持ち点は7.0点。そこから0.1点単位で、加点または減点する。
  3. 5名のうち、最高点と最低点を除く3名の合計点の大小で勝敗を決める。
  4. 上記に於いて同点の場合、合計点に最低点を加えて比較する。
  5. それでも勝敗が決まらない場合、最高点を加えて比較する。

私も数回試合の補助員になったことがあるが、この計算は私が見た限り、その場で手計算で行われることが多い。そこで、点数を入力するだけで自動的に順位を算出するExcelファイルの作成を試みた。
(※2018年11月現在、それ専用のアプリは既にあるようです)。
f:id:Infoment:20181107191623p:plain
まずは、何をするにも計算確認用のサンプルが必要だ。
f:id:Infoment:20181107191702p:plain

一つずつ手入力するのも面倒なので、まずはダミーデータを作成するマクロを作成した。今回の作戦はこうだ。

  1. ランダムに点数を入力する、ユーザー定義関数を作成する。
  2. 同関数の引数は、以下の3つとする。
    ・処理範囲
    ・得点の最大値
    ・得点の最小値
  3. ランダムな点数は、RND関数を用いて作成する。

実際のコードがこちら。

標準モジュール
Sub MakeTestData(myRng As Range, iMax As Double, iMin As Double)
    Dim r As Range
        For Each r In myRng
            r = Format((iMax - iMin) * Rnd + iMin, "0.0")
        Next
        myRng.NumberFormatLocal = "0.0"
End Sub

RND関数は、0以上1未満の数値をランダムに作成する。従って、

最小値+(最大値と最小値の差)× 0以上1未満のランダムな数値

としておけば、

  • RND=0 ⇒ 最小値+(最大値-最小値)×0=最小値
  • RND≒1 ⇒ 最小値+(最大値-最小値)×0.999…≒最大値

となる。

最後に、このユーザー定義関数に引数を与えるマクロを作成する。

Sub TEST()
    MakeTestData myRng:=Selection, _
                 iMax:=7.4, _
                 iMin:=6.8
End Sub

なお今回の最大値と最小値は、異常値が頻出しないよう、試合でよく見かける点数とした。

結果は、↓ このとおり。
f:id:Infoment:20181107193559g:plain

とりあえず今日は、下ごしらえ。明日に続きます。

参考まで。