見出し画像

100点法から段階別評価をつける(VLOOKUP関数近似一致) ※全文無料

90 点以上は A ,70 点以上は B ,50 点以上は C ,…… のように 100 点法から段階別評価を VLOOKUP 関数を使って出す方法を紹介します。

100 点法から段階別評価は,成績処理ファイル作成の 5 段階評価をつけるところで if 関数を用いて作りましたが,VLOOKUP 関数を使ったほうが短い記述で自由度が高く作れます。

1.2.では原理の説明を行いますので,使い方だけ知りたい方は 3.まで飛ばしてください。

1.VLOOKUP 関数の完全一致と近似一致

完全一致:検索範囲を上から照合し,検索値と一致するものを探す。もし見つからなければ,#N/A というエラーを返す。
近似一致:検索範囲を二分探索し,検索値と一致するものを探す。もし見つからなければ,検索値を超えない最大の値を返す。

座席表作成の記事で VLOOKUP 関数を紹介した際,VLOOKUP 関数の検索方法は基本的には完全一致を使うと書きました。

近似一致の使い方を紹介する前に,近似一致で使われている二分探索を解説します。
二分探索を行う場合,検索されるデータは必ず昇順になっていなければなりません。
二分探索は昇順になっているデータの真ん中の値と検索値を比較し,検索値と一致すれば終わり検索値の方が小さければ(検索値は範囲の下半分には入っていないので)上半分のデータに対して同様の操作を行います。
具体例で紹介します。

画像1

この表の「値」の列に「11」が含まれているかを二分探索で探します。

・15個のデータの真ん中(8番め)の値(19)より検索値(11)の方が小さい。
・上半分(1~7番め)の真ん中(4番め)の値(7)より検索値(11)の方が大きい。
・下半分(5~7番め)の真ん中(6番め)の値(13)より検索値(11)の方が小さい。
・上半分(5番めのみ)の真ん中(5番め)の値(11)と検索値(11)は一致する。
・よって,検索値(11)は表の「値」に含まれている。

このように値の有無を探しますので,昇順でなければならないのです。
この操作はちょうど,人が辞書を引くときに似ています。辞書を引くときだいたいのアタリをつけてそこから前後に飛ばしながら探していきますね。この辞書を引く操作を再現していると思ってください。
二分探索は値が昇順でなければならないという制約がありますが,探索速度は上から順に照合していくのに比べ圧倒的に速いです。
探索すべきデータの量が 2 倍になったとき,上から順に照合すると 2 倍の時間がかかりますが,二分探索ならば 1 手順増えるだけです。
もちろん,運が良ければ(悪ければ?)上から照合したほうが速い場合もあります。最たる例は,検査値が一番上のデータであるときです。

VLOOKUP 関数でも完全一致(FALSE)より近似一致(TRUE)の方が計算にかかる時間は短くて済みます。
ただし,しつこいようですが,近似一致の場合はデータが昇順に並んでいなければなりません。
ですので,検索するデータが文字列(特に日本語!)であったり,並び順が昇順でない可能性がある場合は完全一致にしなければなりません。
また,検索値が検索範囲に存在しないときの挙動が完全一致と近似一致では異なります
完全一致では検索するデータに検索値がなければ,#N/A となり,検索値が検索範囲に存在しなかったということがひと目で分かります。これも完全一致を使うべき理由です。

2.近似一致で検索値が検索範囲に存在しない場合

では,近似一致で検索値が検索範囲に存在しないときの挙動を説明します。
先程の例で検索値が「8」の場合を考えてみましょう。

画像2

・15個のデータの真ん中(8番め)の値(19)より検索値(8)の方が小さい。
・上半分(1~7番め)の真ん中(4番め)の値(7)より検索値(8)の方が大きい。
・下半分(5~7番め)の真ん中(6番め)の値(13)より検索値(8)の方が小さい。
・上半分(5番めのみ)の真ん中(5番め)の値(11)より検索値(8)の方が小さい。
・次の検索範囲は存在しない。
・よって,検索値(8)は 7 から 11 の間の値であることがわかる。

このとき,VLOOKUP 関数は「7」を返します
つまり,検索値(8)が存在する区間の下端(7)を返したのです。
これが上で書いた近似一致の「もし見つからなければ,検索値を超えない最大の値を返す」ということです。

近似一致を使った場合でもエラーが返ってくることがあります。
それは検索値が検索するデータの最小値より小さい場合です。
理由は上の探索方法を考えれば当たり前です。

例えば,検索値が 1 の場合を考えてみましょう。
二分探索によって,検索値(1)は 1 番めの値(2)より小さいことがわかります。
しかし,1番めの値だけでは検索値が入る区間を作ることができません
区間が作れないので,区間の下端を返すということができずにエラー(#N/A)になります

3.100点法から段階別評価をつける

90 点以上は A ,70 点以上は B ,50 点以上は C として 100 点法から段階別評価をつけてみましょう。

100 点法の得点を事前に入力しておき,ABC 評価の基準を昇順で作っておきます。

段階別評価を表示するところ(D2セル)には,
=VLOOKUP(C2,$G$3:$H$5,2,TRUE)
と入力します。
100 点法の値(C2)を評価の基準($G$3:$H$5)の中で近似一致で探し, 2 列め(ABC評価)の値を返すようにします。

画像3

しかしこのままではエラーが出ます。

画像4

なぜなら,検索値が検索範囲の最小値を下回っているからです。
ですので,評価の基準のところに最小値 0 を入れなければなりません。
0 点から 49 点までは評価 D にしましょう。
検索範囲も G2 からにするのをお忘れなく。

画像5

これですべての値が正しく表示されました。

近似一致を使って,○点から△点は◇という読み替えを行うときは
1.基準となるデータを昇順で用意する。
2.基準となるデータは最小値から準備する。
3.VLOOKUP 関数を近似一致(TRUE)で使用する。

この 3 点を押さえれば大丈夫です。

他の例も作ってみましょう。
体力テストで上体起こしの回数を得点化するとします。

画像6

画像7

作ったあとに,いくつか数値を変化させて意図通りに動いているか確認する癖をつけましょう。
切り替わり目の値も正しく表示されていることを見届ければ大丈夫です。

いかがでしたでしょうか。
くどいようですが,このような特別なことをするという意図がないときはVLOOKUP 関数は完全一致(FALSE)で使用しましょう。近似一致に比べて遅いと言っても最近のパソコンの性能ではそこまで問題にならないことが大半です。安全性の高さを評価するべきです。
近似一致を使うときは切り替わり目の値で意図通り動いていることを確かめましょう。これは VLOOKUP 関数のみならずあらゆるところで大切になります。切り替わり目には特に注意を払ってください。

※ 本文は以上です。「記事を購入」での応援を歓迎します。応援いただけましたら今回作成したEXCELファイルをプレゼントいたします。

ここから先は

0字 / 1ファイル

¥ 200

最後までお読みいただきありがとうございます。「スキ」をしていただけるととても励みになります。