メインコンテンツへスキップ
見出し画像

[NG EXCEL]VLOOKUP関数をいまさら使ってはいけない

    関連記事:やってはいけない、VLOOKUP関数、XLOOKUP関数

    【まとめ】
    ・いまさらVLOOKUP関数を使ってはいけない。
    ・XLOOKUP関数を使う。
    ・行で範囲指定してはいけない。
     ( 例 C15:C50 ⇒ C:C)
    ・XLOOKUP関数の記述方法
    =XLOOKUP(検索値,検索列,表示列)
    =XLOOKUP(検索値のセルと同じものを,検索列から探して,表示列の同じ行のものを表示する)

    【まとめ】(かなりダラダラです)
    VLOOKUPは、データベース(一覧表)から所定のデータを引っ張り出すために使われます(ました)。
    職員番号を入れると職員名や住所・生年月日などが、商品コードを入れると商品名や単価や発注先などが出てくるので便利な関数です(でした)。
    勿論、該当データのリストが存在していることが大前提です。


    便利でしたが(過去形)、クセがあるというか、記述の仕方が面倒かつ融通が利かない、という印象があり、あまり好きではありませんでした。

    批判を恐れずにいうと(定型句?)、いまさらVLOOKUP関数を推奨/説明しているEXCEL本やサイトは、注意して見た方がいいと思います。


    なぜなら、古いから。
    VLOOKUP関数は使いづらいから。
    もっと便利なXLOOKUP関数があるから。

    XLOOKUP関数はEXCEL2021から使えるのに、いまだにVLOOKUP関数を推奨/説明しているのは、どうかと思うから。

    XLOOKUP関数が使えない環境での代替に、という意味合いでなら分かります(そんな環境もどうかと思いますが)。

    また、昔出た(掲載された)ものなら、そのまま残っていても仕方ありません。
    その本やサイトを否定するつもりはありません。

    でも、いまさら敢えてVLOOKUP関数を推奨/紹介しているとしたら、その理由は何だろう?と疑問です。
    単に「知らない」のか?
    「ついていけていない」(out of date)のか?
    VLOOK関数に愛着(未練)がありすぎるのか?

    (私もモダンEXCELといわれる関数には、ついていけてませんけど。というか、それらを使うレベルまで至っていないのですが。)

    昨年度(R5年度)、「VLOOKUP関数でデータを取り出しました」と言ってきたスタッフがいたので、「XLOOKUP関数の方が簡単だよ」と伝えました。
    スタッフのやる気を削いではいけませんが、簡単に出来て、修正も楽(後任の使える)な関数があるのに、そのまま放っておくのは「悪」ですから。

    前置きが長くなりました。


    LOOKUP関数とは

    「LOOKUP」は「調べる」という意味です(だそうです。高校で習った?)。

    VLOOKUP関数も、XLOOKUP関数も、
    「あるデータ(検索値)をリスト(検索列)から調べて(探し出して)、それに呼応する(表示列にある)データを表示する」関数です。

    VLOOKUP/HLOOKUP関数とは

    VLOOKUPのVは「Vertical(バーティカル」「垂直」という意味です。
    昔、「バーティカルリミット」という登山もの(登攀もの?)映画がありました。
    データ(検索値)を縦に(同一列を上から下に)調べていくので「Vertical」です。
    HLOOKUPという関数もあって、こちらのHは「Horizontal」(ホリゾンタル)で「水平」。
    昔、「NEW HORIZON」という英語の教科書がありました(と思ったら、今もまだある! 懐かしい~)
    こちらは検索値を水平に(同一行を左から右に)調べていくから「Horizontal」。
    ただし、実務での使用例は少ないでしょう。

    XLOOKUP関数は、VLOOKUP関数+HLOOKUP関数(垂直でも、水平でも使える)

    Excel2021から登場した「XLOOKUP」関数は、データを上下左右、どちらでも調べられる、という関数です。
    2つの関数が一緒になっただけではなく、記述方法も簡略化され、なおかつ、融通も利くようになりました(詳細は後述)。

    一方、VLOOKUP/HLOOKUP関数は、記述方法がちょっと面倒で、なおかつ、融通も利きづらく、私は敬遠していました(やむを得ず使うこともありましたが)。

    しかし、XLOOK関数が登場して、LOOKUP関数に対する印象は激変!
    なんて便利なんだ、と感激&多用しています。
    ちょっとした一覧表から関連データを引っ張り出すのもサクサクできます。
    記述も簡単。
    表に列を追加しても全く問題なし!(VLOOKUPだと、列を追加すると機能しなくなる)


    VLOOKUPとXLOOKUPの違い

    以下、VLOOKUP関数とXLOOKUP関数の違いを説明していきますが、HLOOKUP関数はそもそもあまり使われていない(だろう)ので、今回は省略します。

    例えばこんな表。

    画像

    水色欄には計算式が入っています(条件付き書式で自動色付け)。
    左の表の「単価」は、右の「単価表」から自動で持ってきています(通常「単価表」のようなリスト/データベース的なものは別シートにしておくべきですが、分かりやすくするために並べています)。

    計算式は、C3セルとC4セルで変えています。

    画像

    C3セルは、=XLOOKUP(B3,G:G,H:H)
    これは、
    「B3セルの中身(=A4白黒)を、G列から探して、同じ行にあるH列のデータを表示する」
    という計算式です。
    計算式のトレースを表示すると・・・

    画像

    青丸又は青枠内が使われているところ。
    黄色は実際に対象となっているセルです(黄色は手作業で付けました)

    一方、C4セルでは、VLOOKUP関数を使っています。

    画像

    こちらも対象となる範囲(青色)はC3と同じです。実際に使われているセルは黄色です。

    VLOOKUP関数のいまいちポイント① 何列目か数えないといけない

    ここで問題なのは、VLOOKUP関数の記述方法。
    =VLOOKUP(B4,G:H,2)
    「B4セルの中身(=A4カラー)を、G列からH列のうち一番左のG列から探して、G列から右に2列目(=H列)にあるデータを表示する」
    というものです。

    最初の「検索値」はXLOOKUP関数と同じですが、その後に、検索の範囲(G:H)を指定して、次に、表示するデータがG列から何列目にあるか、を入れる必要があります。

    XLOOKUP関数では、下のようにG列とH列の間にも青線が入っています。

    画像

    これは、G列とH列を別々に指定している、ということです。
    対して、C4セルのVLOOKUP関数だと、G列とH列の間に青線はありません。

    画像

    これは、G列からH列をまとめて指定している、ということです。
    そして、VLOOKUP関数では、この「まとめて指定した列」のうち、表示するデータは左から何列目にあるか、を示す必要があります。
    つまり、何列目か数える必要があります。

    上の例なら、「G~Hのうち、Gから2列目」とすぐに分かります。
    でも「G~AB」のうちのAB列だったら、Gから数えて何列目でしょうか?
    正直、数えるのは面倒です。
    これが、VLOOK関数のいまいちな点その1です(かなりいまいちな点です)。


    VLOOKUP関数のいまいちポイント② 列を挿入するとおかしくなる


    例えば、単価表のG列の後(右)に1列追加してみます。

    画像

    XLOOKUP関数を使ったC3セルは、計算式が
    =XLOOKUP(B3,G:G,H:H) から
    =XLOOKUP(B3,G:G,I:I) に変わり、列挿入前と同じく「5」を表示しています。
    列を挿入しても、計算式は自動で正しく対応している、といえます(エクセルは基本そうなっています)。

    一方、VLOOKUP関数を使ったC4セルは、
    =VLOOKUP(B4,G:H,2) から
    =VLOOKUP(B4,G:I,2) に変わっています。
    セルの挿入に対応して、G:H がG:I に自動で変わっています。
    しかし、C4は「0」。
    本来入るはずの「10」が入っていません。
    これは「G:I,2」つまり「G列から2列目であるI列の中のデータを取り出す」という式になってしまっているからです(2列目にはデータがないので「0」になります)。
    つまり、列を挿入しても、「○列目」は自動で変わっていないのです。
    仮に、挿入した列に前年度単価を入れてみると・・・

    画像

    本来表示すべき「10」ではなく、「8」が表示されました。

    式のトレースでも見てみると

    画像

    XLOOKUP関数は、実際に対象となる列のみを調べているのが分かります(H列は、G列とI列の青枠に挟まれているだけで、対象とはなっていません)。
    一方、VLOOKUP関数は・・・

    画像

    「G:H」が「G:I」と範囲は広がりましたが、あいかわらず範囲内の2行目の数値を表示してしまっています。
    範囲は広がっても、探しているのは「2列目」のままなのです。
    ここは自動では直りません。
    従って、列挿入したら、VLOOKUP関数の「○列目」もいちいち手で直さなくてはいけません。
    しかも、間違えないためには、いちいち「○列目」と目で見て数えなくてはいけません。
    これは面倒です。間違いもおきます。
    怖くて表の修正もできません。

    実際、VLOOK関数を使った表を引き継いだ際、この「トラップ」に気づかないまま、検索対象となるリスト(データベース)の列を増やしてしまうと、間違ったデータが表示され、大惨事になる場合があります。

    これを避けるためには「〇列目」のところに、対象となる項目名の位置(〇列目)を調べる関数を入れる等して対応するのですが、それはそれでハードルが一つ上がります(分かりづらくもなる)。

    XLOOKUP関数なら、リストの修正(列挿入)も簡単

    その点、XLOOKUP関数は、列を挿入しても、削除しても自動で計算式が変わるので、手間&集中力いらずです(勿論、必要な列を削除したらダメです)。

    また、該当列が具体的に示されているので、入力&理解しやすいといえます。


    VLOOKUP関数のいまいちポイント③ 検索値が左端にないとダメ


    VLOOKUP関数は、検索する列が一番左にないと検索できません。
    「一番左の列を探して、表示するのは左から○列目」という指定しかできないのです。

    例えば、下の表では、単価から種類を出してみます。

    画像

    右の表のG3に「10」と入れると、左のリストから「A4カラー」を表示します。

    これには、XLOOKUP関数を使っています。

    画像

    =XLOOKUP(G3,C:C,B:B) として、
    G3の数値と同じものをC列から探して、同じ行のものを左隣りのB列から表示する、という計算式です。
    表示するデータがある列(B列)が、検索列(C列)より左にあっても、問題なくできています。
    *同じ単価のものが2つ以上あると正確ではなくなりますが、ここでは割愛します。

    これ、VLOOKUP関数ではできません。

    画像

    =VLOOKUP(G4,B:C,1)でも
    =VLOOKUP(G5,B:C,2)でも
    =VLOOKUP(G6,B:C,-1)でもダメ。
    「C列のものを、その左にあるB列から表示する」ことができないのです。
    常に、検索する列は一番左。
    表示するデータがある列は、それよりも必ず右。
    この制約は、かなり面倒です。
    (VLOOK関数を使いたいがために、右にある検索列を、わざわざ左に持ってくる、なんてこともやっていました。)

    結論:VOOKUP関数は、もう使わない


    以上の点から、VLOOKUP関数を使う必要性は薄いといえます。
    VLOOK関数には、昔、色々お世話になりましたのでお礼したところすが(苦労もさせられたので色々言いたいところもあるけど)、いまさらVLOOKUP関数を使う必要はありません。
    覚える必要もありません。
    時間の無駄、というより、浪費になります。

    今において、VLOOKUP関数を推奨/紹介している情報は、パッ缶があるのに、その裏側を缶詰で開けるやり方を示しているようなものです(分かりづらい例え?)。

    簡単に出来る方法があるのに、敢えて難しい方法を示すのは「悪」です。


    VLOOKUP関数について一所懸命解説しているものをみると、ゼークト(ドイツの軍人)の「無能な働き者は組織にもっとも害を与える」という表現を思い出してしまいます。
    ゼートクは組織論なので適切な例えではないですし、VLOOKUP関数を扱っている本やサイトを無能扱いする意味でもありません。

    ただ、やはり、いまさらVLOOKUP関数を使用するのは、手間や後任への負荷を考えると、マイナスでしょう。

    昔作られた表にVOOKUP関数が使われていたとしても、それはしょうがない。
    でも、可能ならXLOOKUP関数に修正した方が、後任は理解しやすくなることでしょう。

    ちょっと(かなり)言い過ぎな部分もあると自認していますが、ほんと、VLOOKUP関数に関する情報がいまだ流布しているのは困りものです。

    もし「XLOOKUP関数にはできなくて、VLOOKUP関数でないとできない」というものがありましたら、是非ご教示ください。
    今後の参考とさせていただきます。

    なお、XLOOKUP関数については、今後も説明していきたいと思います(複数条件の扱い方など)。

    長々となってしまいましたが、参考になれば幸いです。

    *【まとめ】の「行で範囲指定してはいけない。( 例 C15:C50 ⇒ C:C)」については、別途触れます。長くなってしまったし、他の関数にも関連あることなので。

    *「EXCEL御法度」を「NG EXCEL」に改編検討中です。
    「御法度」だと分からない人もいるみたいなので…

    (作業 2日 4h)































    あなたへのおすすめ