はじめに
なぜ Excel の標準機能だけで競馬ツールを作ろうと思ったのか
理由はシンプルで、
「Excel の最少機能だけで実装した場合、今の自分の限界がどこにあるのか知りたかった」
から
普段はフルスタックで開発できるが、あえて制約をかけることで
抽象化・モデル化・UI設計の腕試し をしたかった
この記事のターゲット
- エンジニア: 制約下でのモデリングや抽象化のプロセスに興味がある方
- 競馬ファン: プログラミングはできないが、Excelで独自の分析ツールを作りたい方
この記事の目的
高度な言語(Python等)を使わずとも、Excelの「関数と設計」だけでここまで本格的な予測モデルが組めるというプロセスを共有すること
環境
Microsoft Excel 2021
(標準機能のみ、VBAなし)
目的
競馬の血統に注目した指数ランキング可視化システム
目的は大きく3つある
- 競馬初心者の血統入門ツールを作りたい
- 特殊な技術を使わない疑似ノーコードの実装に挑戦したい
- 自分が使いたかったから
設計思想
血統には多くの特徴量があるが、今回は
種牡馬の可能性に重きを重きを置いた
抽出した特徴量は以下の通り:
- 距離
- 会場
- 枠番
- 馬場状態
これらを点数化し、
総合点 → レース内で相対評価 → ランキング化
という流れで指数を作る
モデル化
すべての要素を芝/ダートに分別
- 距離:数値化
- 1000m〜2300m
- おおよそ200m刻み
- 非根幹距離(1700m)も含む
- 馬場:カテゴリ化
良 / 稍重 / 重 / 不良 - 枠番:数値
1~8枠 - 会場:カテゴリ化
- 中央競馬全会場
- 南関競馬4会場(地方対応ツールが少ないため採用)
実装:シート準備
まずはシートを作る
距離シート
馬場状態シート
枠番シート
会場シート
芝・ダートに分けて会場別に列を作る
南関競馬はダートしかないので、ダートが少し長くなる

それぞれのシートに点数を記載
・評価点は
◉>◎>◯>△>×
で記載する
シートの準備はここまで
実装:詳細計算
B~G列はコンボボックスを採用

※馬名のコンボボックスは距離別シートを参照
=距離別!$A$5:$A$240
I~P列に関しては
- 各シートより評価を抽出
- 抽出した評価を数値に変換
式の基本形は下記
=IFERROR(
SWITCH(
XLOOKUP($D3,距離別!$B$4:$J$4,
XLOOKUP($B3,距離別!$A$5:$A$240,距離別!$B$5:$J$240)
),
"◉",4, "◎",3, "◯",2, "△",1, "×",0
),
"")
総合点は足しているだけ
ただし、全部空欄なら何も表示しない
=IF(COUNT($I3,$K3,$M3,$O3,$Q3,$S3)=0, "", SUM($I3,$K3,$M3,$O3,$Q3,$S3))
空白にしている理由
後述する「指数ランキング」の評価に関わるが
- 0点:データはあるが、評価は最低の「E」
- 空白:まだ評価点を記載していない
と明確に使い分けるために、あえて空白にしている
実装:指数ランキング
総合点ランクを同レース内で相対的に評価してランキング化する
指数ランキングは
S~E
Sが最高
までの評価となる
W,X列に入っている評価式は下記
=IFS(
U3="", "",
U3=0, "E",
RANK.EQ(U3,$U$3:$U$100,0)=1, "S",
U3>=PERCENTILE.INC($U$3:$U$100, 0.85), "A",
U3>=PERCENTILE.INC($U$3:$U$100, 0.6), "B",
U3>=PERCENTILE.INC($U$3:$U$100, 0.3), "C",
TRUE, "D"
)
UI設計の意図
- 視覚的なわかりやすさを重視
- Sランクや◯✕方式の方が初心者に優しい
- 点数を表示し、指数の透明性を担保
学んだこと
- コードが書かれていない分、非常に軽く動作する
- 関数を古い関数に戻せば互換性も担保できる
- 設計段階で理想形を持つことの重要性
- Excel単体でも“モデル化”は十分可能
スマホでも、動く
このExcelはクラウドを経由すると
スマホからフル機能を使える
競馬場のパドックで、スマホ片手に条件を書き換える
すると、最新のランキングを弾き出す
まとめ
Excel標準機能だけでも、
特徴量設計 → モデル化 → UI → ランキング
まで一通り実装できることがわかった
制約があるからこそ、
抽象化・設計思想の重要性がよく見える
良い題材だった









