いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)最大値の隣のセルの値を取得する

 Excelで、複数の数値の中の最大値の隣にあるセルの値を抽出する方法についてです。
 基本的に難しいことではありませんが、最大値が複数個存在する場合について考慮する必要があります。

FILTER関数を使う方法

 次の画像ではFILTER関数を使い、C列に記録された点数のうち最大値(最高点)を獲得した者の氏名をすべて取得しています。

 E3セル

=FILTER(B3:B9,C3:C9=MAX(C3:C9))

 最大値は1つだけしかないとは限らないので、該当するすべての値を取得できるFILTER関数を使うのが最も適当と考えられます。
 ここでは第1引数(抽出範囲)をB3:B9(氏名が記録されている範囲)とし、第2引数(抽出条件)を「C3:C9=MAX(C3:C9)」としています。
 これで「点数が最大値と等しいこと」を条件として氏名を抽出することができます。



 次の画像は取得しようとする氏名が最大値の右側にあるケースです。
 これも引数の指定範囲をそれに合わせるだけで問題なく取得できます。

INDEX/MATCH関数を使う方法

 次の画像ではINDEX関数とMATCH関数を組み合わせて、最高点を獲得した者の氏名を取得しています。  
 ただしFILTER関数の例とは異なり、値は1つ(該当するもののうち最も上にあるもの)しか取得できません。

 E3セル

=INDEX(B3:B9,MATCH(MAX(C3:C9),C3:C9,0))

 「MATCH(MAX(C3:C9),C3:C9,0)」により最大値がC3:C9の範囲のうち何行目に存在するのか(ただし最初の1つだけで結果は「2」)を取得しています。
 この結果をINDEX関数と組み合わせ、B3:B9の範囲のうち2行目にある値を取得しています。



 特にFILTER関数が使えないようなケースにおいて複数の値を取得する方法が課題になりますので、ここでは作業列を使う方法を試してみます。
 次の画像ではD列に作業列を追加し、D3セルに次のような式を入力してD9までフィルコピーしています。

 D3セル(下方にフィルコピー)

=IF(C3=MAX(C$3:C$9),COUNTIF(C$3:C3,MAX(C$3:C$9)),"")

 この式は、隣のC列の値が最大値と等しければ「その行から見て上(ただしその行を含む)にある最大値の数」を返します。これは言い換えれば「その行にある最大値は最大値のうち上から何番目のものか」という数値です。
 フィルコピーによりカウント範囲等への参照がズレないように絶対参照($)を使う点がポイントです。



 次にF3セルに次のように入力し、該当する氏名の1つ目を取得します。

 F3セル

=INDEX(B$3:B$9,MATCH(ROWS(F$3:F3),D$3:D$9,0))

 


 そして式を下方にフィルコピーすると該当するすべての氏名が得られます。

 上記の式の説明ですが「ROWS(F$3:F3)」という部分は「F3セルからそのセルまでの行数」であり、つまり連番を生成するための式です。F3セルにおいてはこの部分が「1」を返し、この式を下方にフィルコピーしたときにはF4セルにおいて「2」を、F5セルにおいては「3」を返します。
 この連番を検索値としてMATCH関数でD3:D9の範囲を検索してその位置を取得し、INDEX関数によりB3:B9中の対応する位置にある氏名を取得しています。
 該当する氏名は3つしかないのでF6セル以降はエラーになっていますが、表示させたくなければさらにIFNA関数を併用するか、その部分の式を消すかどちらかの対応が必要です。

その他の例

XLOOKUP関数を使う方法

 INDEX/MATCH関数と同様で、最大値が複数ある場合に最も上(第6引数を「-1」にすれば最も下)にあるものしか取得できません。
 ただ、あえて1つだけ取得したい場合はこのXLOOKUP関数を使うのが最も簡単でしょう。

 E3セル

=XLOOKUP(MAX(C3:C9),C3:C9,B3:B9)

 検索値として「MAX(C3:C9)」つまりC列の最大値を、第2引数(検索範囲)にC列を、第3引数(抽出範囲)にB列を指定しています。
 なおINDEX/MATCHの例と同様のやり方で複数取得を行うことは可能ですが、XLOOKUP関数が使えるバージョンならFILTER関数を使った方が簡単です。

VLOOKUP関数を使う方法

 これも最大値が複数ある場合には最も上にあるもの(の隣の値)しか取得できません。
 さらに検索値(最大値)の右側の値しか取得できないため、使用できるケースが大きく制約されます。

 E3セル

=VLOOKUP(MAX(B3:B9),B3:C9,2,FALSE)