Excel講座

データベースと検索関数

本章で用いる実習用ファイル

リスト形式の表で用いられる関数群に「検索関数」がある。名前からして、あるいは実際によくある説明として、(リスト形式の)データベースから特定のデータを検索するための関数である、と理解しがちである。機能としては確かにその通りなのだが、実際の使い方とは少し違う。

データベースから条件に従って特定のデータを引き出すのは抽出(フィルター)機能を用いるべきである。検索関数はこの用途には余り適さない。なぜか?

Excelの検索関数は(今のところ)配列を返さない。一つの値を返すのみである。となると複数のレコードが条件に合致する検索条件での実用的な使用は難しいことになる。

ABCDEFG
1ID名前グループ血液型生年月日身長
22203小片リサつばきファクトリーA1998/11/5159
31601山岸理子つばきファクトリーB1998/11/24155
41905藤井梨央こぶしファクトリーB1999/3/4150
52205広瀬彩海こぶしファクトリーO1999/8/4156
62003新沼希空つばきファクトリーO1999/10/20160.2
72206谷本安美つばきファクトリーB1999/11/16157.5
182405秋山眞緒つばきファクトリーB2002/7/29160
19

このデータからIDで検索するのであれば(IDは一意Uniqueな値なので)検索関数が使える。しかし例えば血液型で検索すると値は複数必要になる。抽出(フィルター)機能なら例えば「B型」で抽出すると複数のレコードを引き出せる。しかし検索関数は最初にヒットしたレコードからしか値を引き出せない。これでは「使えない」。

では検索関数はなにに使うのか?まずはそこの理解から始めよう。

検索関数

検索関数の主たる使用目的は表の結合である。表の結合とは何か?

ABCDEF
1明細番号商品番号商品名単価数量
21A-1越前ガニ36001
32B-1越前そばセット35001
43B-2ソースカツ丼25003
54C-1若狭牛100001
65D-1梅ワイン42002
7

このような表では「商品番号」と「商品名」は一対一の対応をしていて、「商品番号」が決まれば「商品名」も確定する。「商品番号」と「商品名」双方を逐一入力する必要が無い。「商品番号」と「商品名」を別に入力すると不整合が起こることの方が問題である。ならば「商品番号」が入力されれば「商品名」は自動的に入力されるのが望ましい。さらに商品(番号・名)が決まれば、価格も決まる。というわけで「商品番号」と「商品名」「価格」の対応表を用意する。

ABCDEF
1明細番号商品番号商品名単価数量
21A-11
32B-11
43B-23
54C-11
65D-12
7
8商品番号商品名単価
9A-1越前ガニ3600
10A-2若狭河豚13000
11B-1越前そばセット3500
12B-2ソースカツ丼2500
13C-1若狭牛10000
14D-1梅ワイン4200
15

こうした対応表があれば、商品番号が決まれば、商品名・単価は自動的に確定する。元の「受注票」は「明細番号・商品番号・数量」の表「商品番号・商品名・単価」の表結合させた表とみることができる。このときの「商品番号」から他の情報を引き出すときに用いるのが検索関数である。もちろん「商品番号」は一意Uniqueな値である。

検索関数一覧

INDEX
  • 範囲指定は一次元二次元どちらも可
  • MATCH
    • デフォルトの検索モードは昇順検索(1)
    XMATCH2021
    • デフォルトの検索モードは完全一致(0)
    • 昇順検索は「-1」
一次元
LOOKUP
  • 検索モードは昇順検索のみ
XLOOKUP2021
  • LOOKUP関数をパワーアップ(完全一致・昇順・降順・ワイルドカード)
  • デフォルトの検索モードは完全一致
  • 昇順検索は「-1」
二次元
VLOOKUP
  • 縦方向の検索を行う
  • 検索対象は一番左の列固定
  • デフォルトの検索モードは昇順検索(TRUE)
HLOOKUP
  • 横方向の検索を行う
  • 検索対象は一番上の行固定
  • デフォルトの検索モードは昇順検索(TRUE)
検索モード
完全一致近似一致(昇順・降順)見つからない場合
MATCH0[1]…昇順 / -1…降順#N/A
XMATCH2021[0]-1…昇順 / 1…降順 / 2…ワイルドカード#N/A
LOOKUP× 昇順 #N/A
VLOOKUP/HLOOKUPFALSE/0 [TRUE/1]…昇順 #N/A
XLOOKUP2021[0]-1…昇順 / 1…降順 / 2…ワイルドカード 自由に指定できる
  • []内は初期値

縦方向の検索:VLOOKUP(検索値,検索範囲,列番号,[一致モード])

VLOOKUPは検索範囲一番左の列のなかから検索値と一致する値を上から探し、その列番号目のを返す関数である。

  • 一致モードが0(FALSE)…完全一致: 検索値と完全に一致するデータのみを検索
  • 一致モードが1(TRUE)…(初期値)近似一致(昇順検索):検索値(数値)以下の値を検索。上回った時点で検索終了

    ※このとき検索範囲の1列目は昇順に並んでいなければならない。

VLOOKUP(B3,商品マスター,2,FALSE):3行目の「商品番号」から「商品名」を検索する
ABCDEF
1明細番号商品番号商品名単価数量
21A-11
32B-1=VLOOKUP(B3,商品マスター,2,FALSE)1
43B-23
54C-11
65D-12
7
8商品番号商品名単価
9A-1越前ガニ3600
10A-2若狭河豚13000
11B-1越前そばセット3500
12B-2ソースカツ丼2500
13C-1若狭牛10000
14D-1梅ワイン4200
15123
商品マスター
B9:D14

セルB3の値(商品番号:B-1)を範囲商品マスターの一番左の列(商品番号列)から検索(上から3番目、11行目でヒットする)し、その行の左から2番目(C列)の値(「越前そばセット」)を返す。

一致モードを完全一致ではなく、近似一致を用いるメリットは以下の対応表(同じ商品を複数個購入すると購入数に応じて値引きする)を用意したときに現れる。

VLOOKUP(E4,値引率マスター,2,TRUE):4行目の「数量」から「割引率」を検索する
ABCDEFG
1明細番号商品番号商品名単価数量値引率
21A-11
32B-11
43B-23
54C-11
65D-12
16数量値引率
1700%
1821%
1955%
201010%
2112
値引率マスター
B17:C20

セルE4の値(数量:3)を範囲値引率マスターの一番左の列(数量列)から検索(1番上:17行目、2番目:18行目でヒット、3番目:19行目で終了→18行目が最終検索値)し、その行(18行)の左から2番目(C列)の値(「1%」)を返す。

課題:会場(xlsx形式)

クラス番号から会場を導く式をセルD2に立てよ。

ABCDE
1学生番号名前クラス番号会場
2M090001高橋10
3M090002新垣60
4M090003亀井30
5M090004道重40
6M090005田中50
7M090006久住60
8M09000710
9M09000820
10M090009光井30
11
12クラス番号会場
1310京都第一
1420京都第二
1530滋賀第一
1640滋賀第二
1750大阪
1860東京
19
課題:コース(xlsx形式)

点数からコースを導く式をセルD2に立てよ。

ABCDE
1学生番号名前点数コース
2C200001山岸13
3C200002小片80
4C200003新沼64
5C200004谷本43
6C200005岸本79
7C200006浅倉60
8C200007小野55
9C200008小野田48
10C200009秋山61
11
12点数コース
130基礎定着
1460基本
1570応用
1680実践
17

横方向の検索:HLOOKUP(検索値,検索範囲,行番号,[一致モード])

HLOOKUPは検索範囲一番上の行のなかから検索値と一致する値を左から探し、その行番号目のを返す関数である。

  • 一致モードが0(FALSE)…完全一致: 検索値と完全に一致するデータのみを検索
  • 一致モードが1(TRUE)…(初期値)近似一致:検索値(数値)以下の値を検索。上回った時点で検索終了

    ※このとき検索範囲の1行目は昇順に並んでいなければならない。

VLOOKUP関数の横バージョンである。検索範囲(対応表)の作りが行/列入れ替わっているときに用いる。あまり使用されない。

縦横両方向の検索:XLOOKUP(検索値,検索範囲,戻り配列,[見つからない場合の処理],[一致モード])2021

XLOOKUPは検索範囲(VLOOKUP関数における検索範囲の一番左の列と同じ)のなかから検索値と一致する値を探し、戻り配列の中から対応するを返す関数である。

  • 一致モードが-1…近似一致:検索値(数値)と一致、または次に小さい項目(VLOOKUPの1・TRUE相当)
  • 一致モードが0…(初期値)完全一致: 検索値と完全に一致するデータのみを検索
  • 一致モードが1…近似一致:検索値(数値)と一致、または次に大きい項目

VLOOKUP, HLOOKUPを包括し、それに取って代わりうる新関数(Excelのバージョンによっては使用できない)。両関数の欠陥の多くを修正している。

  • 縦横でいちいち関数を分けているのが、無駄っぽい
  • 近似一致の時、対応表が昇順で並んでいないと使えない
  • 値を返すフィールドを指定する第3引数がただの数字で、目視で数えて入力することになる(数えさせることもできるが、別の関数が必要)
  • 対応表の検索対象列より左のフィールドの値は返せない
  • 一致する値がなかったとき、エラー(#N/A)になる
XLOOKUP(B3,商品番号,商品名):3行目の「商品番号」から「商品名」を検索する
ABCDEF
1明細番号商品番号商品名単価数量
21A-11
32B-1=XLOOKUP(B3,商品番号,商品名)1
43B-23
54C-11
65D-12
7
8商品番号商品名単価
9A-1越前ガニ3600
10A-2若狭河豚13000
11B-1越前そばセット3500
12B-2ソースカツ丼2500
13C-1若狭牛10000
14D-1梅ワイン4200
15
商品番号
B9:B14
商品名
C9:C14
単価
D9:D14

セルB3の値(商品番号:B-1)を範囲商品番号から検索(上から3番目、11行目でヒットする)し、それに対応する商品名値(「越前そばセット」)を返す。

XLOOKUP(E4,数量,値引率,"",-1):4行目の「数量」から「値引率」を検索する

「値引率」も同様に求められる。

ABCDEFG
1明細番号商品番号商品名単価数量値引率
21A-11
32B-11
43B-23
54C-11
65D-12
16数量値引率
1700%
1821%
1955%
201010%
21
数量
B17:B20
値引率
C9:C14
課題:XLOOKUP(xlsx形式)

課題:会場(xlsx形式), 課題:コース(xlsx形式)をXLOOKUP関数を使うように式を書き換えよ。

要素番号から配列の値を返す:INDEX(配列,行番号,[列番号])
配列の値からそれを含む要素番号を返す:MATCH(検索値,配列,[一致モード])

VLOOKUP,HLOOKUP,XLOOKUPはその名の通り検索LOOKUPするための関数である。同等の機能はより汎用的な機能を持った関数を組み合わせることでも実現できる。

INDEX関数, MATCH関数は配列を扱うための基本的な関数である。

  • INDEXは要素番号(行番号列番号)を指定するとそれに対応する配列の値を返す関数である
  • MATCHは検索値配列の何番目に含まれるか、要素番号を返す関数である
    • 一致モードが0…検索値と完全に一致するデータのみを検索
    • 一致モードが1…(初期値)検索値(数値)以下の値を検索。上回った時点で検索終了

      ※このとき配列昇順に並んでいなければならない。

    • 一致モードが-1…検索値(数値)以上の値を検索。下回った時点で検索終了

      ※このとき配列降順に並んでいなければならない。

配列:つばき
123456789
山岸小片新沼谷本岸本浅倉小野小野田秋山
  • INDEX(つばき,6)→浅倉
  • MATCH("浅倉",つばき,0)→6

INDEX関数、MATCH関数は単独でできることは(重要だが)単純である。しかしこれを組み合わせるとVLOOKUP,HLOOKUP,XLOOKUPすべてを包括し、さらにそれ以上のことができる最強の検索式を作ることができる。

二次元配列バージョン(VLOOKUP相当)
INDEX(商品マスター,MATCH($B3,商品番号,0),MATCH(C$1,$B$8:$D$8,0))
ABCDEF
1明細番号商品番号商品名単価数量
21A-11
32B-1=INDEX(商品マスター,MATCH($B3,商品番号,0),MATCH(C$1,$B$8:$D$8,0))1
43B-23
54C-11
65D-12
7
8商品番号商品名単価
9A-1越前ガニ3600
10A-2若狭河豚13000
11B-1越前そばセット3500
12B-2ソースカツ丼2500
13C-1若狭牛10000
14D-1梅ワイン4200
15
MATCH("B-1",商品番号,0)→3
商品番号
1A-1
2A-2
3B-1
4B-2
5C-1
6D-1
MATCH("商品名",商品マスターフィールド名,0)→2
商品マスターフィールド名
123
商品番号商品名単価
INDEX(商品マスターデータ, 3, 2 )
商品マスターデータ
123
1A-1越前ガニ3600
2A-2若狭河豚13000
3B-1越前そばセット3500
4B-2ソースカツ丼2500
5C-1若狭牛10000
6D-1梅ワイン4200

※行方向、列方向をクロスさせた検索が可能である。

一次元配列バージョン(XLOOKUP相当)
INDEX(商品名,MATCH($B3,商品番号,0))
ABCDEF
1明細番号商品番号商品名単価数量
21A-11
32B-1=INDEX(商品名,MATCH(B3,商品番号,0)1
43B-23
54C-11
65D-12
7
8商品番号商品名単価
9A-1越前ガニ3600
10A-2若狭河豚13000
11B-1越前そばセット3500
12B-2ソースカツ丼2500
13C-1若狭牛10000
14D-1梅ワイン4200
15
商品番号
B9:B14
商品名
C9:C14
MATCHの昇順検索モード:4行目の「数量」から「値引率」を検索する
  • INDEX(値引率マスター,MATCH($E4,数量),MATCH(F$1,$B$16:$C$16, 0))二次元
  • INDEX(値引率,MATCH($E4,数量))一次元

「値引率」も同様に求められる。検索値が数値だとMATCH関数は「検索値以下」の値を検索する。

ABCDEFG
1明細番号商品番号商品名単価数量値引率
21A-11
32B-11
43B-23
54C-11
65D-12
16数量値引率
1700%
1821%
1955%
201010%
21
値引率マスター
B16:C20
値引率
B16:B20
数量
B16:B20
課題:INDEX_MATCH(xlsx形式)

課題:会場(xlsx形式), 課題:コース(xlsx形式)をINDEX関数とMATCH関数を使うように式を書き換えよ。

課題:成績評価(xlsx形式)

成績評価基準表を元に成績表の成績欄を出力する式をセルD2に立て、オートフィルで残りのセルを埋めよ。

成績表
ABCDE
1学生番号名前点数成績
2C200001山岸13
3C200002小片0
4C200003新沼41
5C200004谷本23
6C200005岸本79
7C200006浅倉60
8C200007小野55
9C200008小野田48
10C200009秋山61
11
成績評価基準
評価点数
580点以上
460点以上
340点以上
220点以上
1それ未満

課題:総当たりリーグ戦結果(xlsx形式)

6チーム総当たりリーグ戦の対戦結果表から、自チームと相手チームを指定したら、その試合の結果を表示するようにセルC10に式を立てよ。

ABCDEFGH
1チーム汎神虚人DaTA薬留止中台島根
2虚人9-6-13-210-31-00-3
3DaTA3-12-13-9-61-00-2
4汎神-6-91-35-31-02-1
5薬留止3-53-106-9-10-311-2
6島根1-23-02-02-110-1-
7中台0-10-10-13-10-1-0
8
9自チーム相手チーム結果
10虚人汎神9-6
11

課題:十二支(xlsx形式)

十二支は年を12で割った余りから判定できる。

十二支と余りの対応表から、各人の十二支を判定する式を立てよ。

ABCDEFGH
1ID名前生年月日十二支十二支余り
22203小片リサ1998/11/54
31601山岸理子1998/11/245
41905藤井梨央1999/3/46
52205広瀬彩海1999/8/47
62003新沼希空1999/10/208
72206谷本安美1999/11/169
81602野村みな美2000/2/1010
91201小川麗奈2000/3/2711
101704岸本ゆめの2000/4/10
111102浜浦彩乃2000/4/261
121103田口夏実2000/7/212
132207浅倉樹々2000/9/33
142401小野瑞歩2000/9/28
151706和田桜子2001/3/8
162208井上玲音2001/7/17
172209小野田紗栞2001/12/17
182405秋山眞緒2002/7/29
19