【備忘録的】麻雀スコア集計スプレッドシートで使った関数の紹介

公開:2022/08/25

WEB アプリ 麻雀

𝕏 f B! P L
本サイトには、広告あるいはアフィリエイトプログラムによるプロモーションが含まれる場合があります。
スポンサーリンク
namimoriです。

以前の記事で自作の麻雀の成績管理スプレッドシートを作成しました。

麻雀スコア集計スプレッドシートを改良しました

麻雀スコア集計スプレッドシートを改良しました

麻雀のスコア集計を自動で行う自作スプレッドシートの改良版を紹介。...

作成にあたって、関数による計算や集計方法などを色々と試行錯誤したのでその一部を紹介します。なお、Googleスプレッドシートで作成しましたが、Excelでも同様の関数が使えるので同じようにできるはずです。

計算の流れは、「点数(素点)の入力→エラー出し→順位を確定→順位点の精算・スコア化→各種成績の集計」という感じです。

エラーの取得

入力ミスが余計に集計されてしまうのを防ぐためエラーを取得し、また修正を促せるように点数入力シートのCheck欄(B列の各行)へエラーを表示します。エラーが出た行(1ゲーム・対局に相当)については成績集計へ反映しないようになっています。

以下がエラー取得用の関数です。

=IFS(COUNTA(C2:V2)=0,"",COUNTA(C2:V2)>4,"入力超過",AND('設定'!$F$6="上家優先",COUNT(C2:V2)=4,COUNTUNIQUE(C2:V2)<4),"要順位付け",AND(COUNT(C2:V2)=4,(SUM(C2:V2)-'設定'!$F$3*4)<10,(SUM(C2:V2)-'設定'!$F$3*4)>=0),"OK",TRUE,(SUM(C2:V2)-'設定'!$F$3*4))

各行(各ゲーム)のセルに入力された点数について、各行毎、

  • 未入力のゲームかどうか:COUNTA関数
  • 入力数が4人を超えていないか:COUNTA関数
  • 上家優先設定なのに同点者がいないか:COUNT関数 AND COUNTUNIQUE関数
  • 配給原点の合計からのズレはないか:SUM関数

の関数でエラーの判定・表示の条件としています。OKを出す条件は

「4人分(4セル)入力」かつ「0≦(4人の点数合計)-(配給原点の合計)<10」

としています。「差が0(すなわち配給原点の合計に一致)」ではなく「差が10未満」としたのは後述する順位を一の位の端数でつける場合に対応するためです。IFS関数最後の条件「TRUE」は「どの条件にもあてはまらない場合」に対応し、配給原点の合計と入力点数の合計のズレを表示します。(リーチ棒が場に残るルールへ対応するため、配給原点の合計と入力点数の合計がズレていても警告(差分)は表示しますが集計は行うようにしています。)

順位の確定

点数入力シートの各セルに入力された点数をもとに同一ゲーム内(同一行内)の順位を算出します。

これは以下のように RANK関数 で取得できます。

rank('点数入力'!C2,'点数入力'!$C2:$V2)

これで取得した順位は着順表(計算用)シートにまとめられます。

また、同点決着で順位付けをする(すなわち同着なし)ルールの場合には、点数の一の位に端数を付け足すことでRANK関数が機能するようにします。この端数は ROUND関数 で丸め込みます(スコア整理(計算用)シート内)。

ROUNDDOWN('点数入力'!C2,-2)

一の位を切り捨てる場合、数式内の第二引数は -1 で良いのですが、念のためどうせ使わない十の位で切り捨てるため -2 としています。(入力者全員がスプレッドシートの内容・仕組みに熟知しているとは限らないため念には念を入れておきます。)

順位点の精算

順位に応じて順位点を加算します。これには VLOOKUP関数 を用いました。

VLOOKUP('着順表(計算用)'!C2,'設定'!$K$2:$L$5,2,FALSE)

設定シート内のK列L列の2~5行目は順位点の表(K列:順位、L列:順位点)になっています。(この記事における「順位点」とは「順位ウマ」および「オカによるトップ賞」の合計のこととします。)RANK関数で算出した順位(着順表シート内に出力)に一致する順位を順位点表から探し、その順位点を取得します。

ただ、1~4位が確定している場合はこれでOKなのですが、同点決着を同着とし順位点を折半するルールの場合には別の計算が必要になります。

namimori は以下のように必要な順位点を足し合わせて、同順位の人数で割るという方法をとりました。

(順位点)={(自分の順位の順位点)+(必要なら1つ下位の順位点)+(必要なら2つ下位の順位点)+(必要なら3つ下位の順位点)}/(自分と同順位の人数)

順位点の探索には VLOOKUP関数 を、「(必要なら)」の条件式は IF関数 を、同順位者のカウントには countif関数を用いました。

(VLOOKUP('着順表(計算用)'!D3,'設定'!$K$2:$L$5,2,FALSE)+IF(countif('着順表(計算用)'!$C3:$V3,'着順表(計算用)'!D3)>=2,VLOOKUP('着順表(計算用)'!D3+1,'設定'!$K$2:$L$5,2,FALSE),0)+IF(countif('着順表(計算用)'!$C3:$V3,'着順表(計算用)'!D3)>=3,VLOOKUP('着順表(計算用)'!D3+2,'設定'!$K$2:$L$5,2,FALSE),0)+IF(countif('着順表(計算用)'!$C3:$V3,'着順表(計算用)'!D3)=4,VLOOKUP('着順表(計算用)'!D3+3,'設定'!$K$2:$L$5,2,FALSE),0)

1つ下位の順位点の要不要の判定は「自分と同じ順位の者が(自分を含めて)2人以上」をTRUEとしています。同様に2つ/3つ下位の順位点の要不要は「自分と同じ順位の者が(自分を含めて)3人/4人以上」で判定。

これ書きながら「4人同点決着」に対応していないことに気づきました。が、配給原点で全員決着なんてことはまあないでしょう。(西入ありのルールなら起こりえませんし。)そのうち気が向いたら対応します。←v1.1.0で4人同点に対応。本記事内の数式も加筆修正しました。上の条件における「自分と同じ順位が4人」が4人同点の場合の判定です。

スコアの算出

順位点が取得できたらいよいよスコアの算出です。持ち点から原点を引いてそこに順位点を足し、さらに1000で割ってスコア化します。集計に余計な値が入り込まないように未入力の空欄やCheck欄のエラーを加味したものが以下の数式です。

=IF(OR(ISBLANK('点数入力'!C2),'点数入力'!$B2="入力超過",'点数入力'!$B2="要順位付け"),"",(ROUNDDOWN('点数入力'!C2,-2)-'設定'!$G$3+(VLOOKUP('着順表(計算用)'!C2,'設定'!$K$2:$L$5,2,FALSE)+IF(countif('着順表(計算用)'!$C2:$V2,'着順表(計算用)'!C2)>=2,VLOOKUP('着順表(計算用)'!C2+1,'設定'!$K$2:$L$5,2,FALSE),0)+IF(countif('着順表(計算用)'!$C2:$V2,'着順表(計算用)'!C2)>=3,VLOOKUP('着順表(計算用)'!C2+2,'設定'!$K$2:$L$5,2,FALSE),0)+IF(countif('着順表(計算用)'!$C2:$V2,'着順表(計算用)'!C2)=4,VLOOKUP('着順表(計算用)'!C2+3,'設定'!$K$2:$L$5,2,FALSE),0))/countif('着順表(計算用)'!$C2:$V2,'着順表(計算用)'!C2))*0.001)

頭のIF関数で、対応する点数入力欄に「入力がない(ISBLANK関数)」あるいは、Check欄に「入力人数の超過」「順位付けが必要」のエラーが出てるならスコア算出をせず空欄を返すようにしています。それ以外ならスコアを計算し返します。

なお、トップ者のスコアは「2~4位のスコアの和の絶対値(プラスに反転させたもの)」として計算することが多いようですが、今回は100点単位の丸め込みをしていないのでこの計算式でも同じ結果になります。ただし、これに起因して100点単位を四捨五入・五捨六入してからスコア化する計算と、このスプレッドシートの計算で出たスコアを四捨五入・五捨六入する計算では端数のズレが生じる場合があります。端数の丸め込みを採用したい場合は仲間内で事前に取り決めをして使ってもらえればと思います。

各種成績の集計

個人成績の集計はほとんどが数えたり足したり割ったりしてるだけなので簡単です。一部解説します。

「対局数」は各列(各プレイヤー)ごと入力のあるセルの数を COUNT関数 で数えて算出しています。入力ミスを数えてしまうのを防ぐため「点数入力」シートではなく「スコア整理(計算用)」シート上で数えています。

「平均点数」の計算には AVERAGE関数 ではなく、 SUMPRODUCT関数 と ROUND関数 を用いました。

=IFERROR(SUMPRODUCT(ROUND('点数入力'!C$2:C$1000,-1))/G2,"")

順位確定のための端数を丸め込んでから平均値を求めたいので ROUND関数で丸め込んだ値の合計値をSUMPRODUCT関数で算出しそれを対局数で割っています。(ここ以外もですが対局数が0だとエラーが表示されて気持ち悪いので、IFERROR関数で空欄を返すようにしています。)

また、各順位の回数はCOUNTIF関数を用いて「着順表」シート上で数えています。(「点数入力」シートから順位を判定し直接その回数を数えるという方法がわからなかったため。)

終わりに

Excelやスプレッドシートに関しては「使ったことがある」程度の素人なので、集計表を作るに当たりあらためて勉強しながら調べながらの作業でした。より効率的な関数の使い方や数式の書き方などあればぜひコメントで教えてください。また、本記事が配布したスプレッドシートの改良や別のスプレッドシート制作のヒントになれば幸いです。

麻雀スコア集計スプレッドシートを改良しました

自作の麻雀集計表を公開:スプレッドシートでPC・スマホから管理

スポンサーリンク
スポンサーリンク

カテゴリラベル

月別アーカイブ

スポンサーリンク

最新記事

プロフィール

namimoriのプロフィール画像

namimori

namimori(なみもり)と申します。

歌やギター、弾き語り等の音楽関係の他、Androidスマホ、フリーソフト等を用いたPC活用などが趣味。

a S
スポンサーリンク

QooQ

Powered by Blogger.