HLOOKUP関数の使い方|横方向の表から値を検索する

HLOOKUP関数の使い方|横方向の表から値を検索する

執筆者:

カテゴリ:

HLOOKUPは、横方向に並んだ表から値を探す関数です。VLOOKUP の縦横が入れ替わったもの、と考えるのが一番わかりやすいです。

H は Horizontal(水平)の頭文字です。

書式

=HLOOKUP(検索キー, 範囲, 行番号, [検索の型])
引数 内容
検索キー 探したい値
範囲 探しに行く表。一番上の行が検索対象になる
行番号 範囲の上端を1として、取り出したい行が何番目か
検索の型 FALSE=完全一致 / TRUE=近似一致

VLOOKUPが「左端の列を検索して、右へ数える」のに対し、HLOOKUPは「上端の行を検索して、下へ数える」動きになります。

基本の使い方

月ごとの数字が横に並んだ、よくある集計表です。

A B C D
1 項目 4月 5月 6月
2 売上 1200 1450 1380
3 原価 700 820 790
4 利益 500 630 590

「5月の利益」を取り出します。

=HLOOKUP("5月", A1:D4, 4, FALSE)

結果:630

1行目から「5月」を探し、見つかった列(C列)の4行目を返しています。

実務での使いどころ

月次・年次の推移表は横に伸びる形が多いため、「月を指定して、その月の数字を引く」用途でよく使います。

=HLOOKUP($B$1, $A$1:$M$10, 3, FALSE)

B1セルに月を入れると、その月の数字が出てくるダッシュボードのような作りにできます。範囲は絶対参照にしておいてください。

行番号を MATCH で動的に求めると、項目名も指定できるようになります。

=HLOOKUP($B$1, $A$1:$M$10, MATCH($A$5, $A$1:$A$10, 0), FALSE)

使わないほうがいい場面

HLOOKUPには、VLOOKUPと同じ弱点がそのまま残っています。

  • 行番号が「上から何番目」という位置指定なので、行を挿入すると壊れる
  • 検索できるのは範囲の一番上の行だけ
  • 見つからないときの値を指定できない

これらは XLOOKUP で全部解決します。XLOOKUPは検索範囲を「行」で指定すれば横方向の検索になるため、HLOOKUPの上位互換として使えます

=XLOOKUP("5月", B1:D1, B4:D4)   → 630

行を挿入しても壊れず、読んでも意味が分かりやすい。新しく作るならこちらを推奨します。

そもそも表の形を見直す

横に長い表は、集計・並べ替え・QUERY による抽出のすべてで扱いにくくなります。データを蓄積する目的なら、縦持ち(1行1レコード)に直すほうが後が楽です。

項目 金額
4月 売上 1200
4月 原価 700
5月 売上 1450

この形にしておけば、SUMIFSQUERY で自由に切り出せます。HLOOKUPが必要になった時点で、表の設計を疑ってみる価値はあります。

エラーの対処

#N/A が出る

一番上の行に検索キーが存在しません。「5月」と「5月 」(末尾スペース)、「5月」と「05月」のような表記ゆれが原因のことが多いです。

#REF! が出る

行番号が範囲の行数を超えています。範囲が4行なのに行番号5を指定した、というケースです。


横方向の表が生まれる理由と、その代償

HLOOKUPは横並びの表から値を検索する関数です。使い方はVLOOKUPと同じ考え方で、方向が違うだけです。しかし実務で使う機会は多くありません。理由は、横方向の表そのものが扱いにくいためです。

横方向の表が生まれるのは、たいてい印刷や見た目の都合です。月を横に並べた予算表、項目を横に並べた比較表。人が読むには分かりやすい形ですが、データとしては扱いにくい構造をしています。

扱いにくさは具体的に三つあります。第一に、データが増える方向が右になるため、列を追加し続けることになります。列数には上限があり、また横スクロールが必要になって閲覧性が落ちます。第二に、並べ替えや絞り込みといった機能は縦方向のデータを前提としているため、そのままでは使えません。第三に、集計関数の多くも縦方向を想定した書き方が自然で、横方向だと数式が読みにくくなります。

したがって、HLOOKUPを書く前に一度立ち止まる価値があります。その表は本当に横並びである必要があるのか。縦に持ち替えられないか。持ち替えられるなら、以降の作業がすべて楽になります。


縦に持ち替える方法

横方向の表を縦方向に変える方法はいくつかあります。

もっとも手軽なのは、行と列を入れ替える関数を使う方法です。範囲を指定するだけで、縦横が入れ替わった結果が返ります。元データと連動するので、更新も自動です。→ TRANSPOSE関数の使い方

一度きりの変換でよければ、コピーしてから行列を入れ替えて貼り付ける機能があります。数式ではなく値として固定されるので、元データが変わっても追従しません。

構造的に持ち替えたい場合は、データの持ち方そのものを設計し直すことになります。月を横に並べるのではなく、日付の列を一本持たせて縦に積む形です。この形にすると、集計も絞り込みも並べ替えも標準の機能で扱えるようになります。

見た目として横並びが必要なら、縦に持ったデータから集計表を生成すればよいのです。元データは縦、表示は横、という分離ができると、両方の利点が得られます。


それでも横方向で扱う場合

構造を変えられない場面もあります。他部署から受け取る決まった形式、システムから出力される固定のレイアウト。こうした場合はHLOOKUPで対応することになります。

書き方はVLOOKUPと同じ考え方です。検索する行が範囲の最上段にある必要があり、そこから何行目を返すかを数字で指定します。VLOOKUPで列番号を数えていたところが、行番号に変わるだけです。

事故の起き方も同じです。範囲を絶対参照で固定しないと、コピーしたときにずれます。行番号を固定の数字で書いていると、行を挿入したときに参照先が変わります。完全一致の指定を省略すると、近似一致になって意図しない値が返ります。

より堅牢に書くなら、行番号を検索関数で求める方法があります。見出しの名前から位置を求めれば、行を挿入しても壊れません。

新しい検索関数が使える環境なら、そちらのほうが安全です。縦横を問わず同じ書き方で検索でき、範囲の方向さえ揃っていれば動きます。→ XLOOKUP関数の使い方


検索できないときの確認

値が見つからない場合の原因は、縦方向の検索とまったく同じです。順に確かめてください。

型の違いが第一です。見た目が同じでも、片方が文字列で片方が数値なら一致しません。表示の寄せ方が手がかりになります。

前後の空白が第二です。末尾に半角スペースが入っているだけで一致しません。文字数を数えれば分かります。

範囲の指定が第三です。検索する行が範囲の最上段になっているか、範囲が絶対参照で固定されているかを確認してください。

行番号が第四です。範囲の行数を超えていないか、範囲を広げたときに番号を直し忘れていないかを見てください。

完全一致の指定が第五です。省略していると近似一致になります。エラーは出ず、もっともらしい値が返るため、もっとも発見が遅れる原因です。

この五つを順に潰せば、原因は特定できます。


縦持ちに変えたあとの集計

横方向の表を縦に持ち替えると、集計の書き方が一変します。どう変わるかを具体的に見ておくと、持ち替える価値が分かります。

横持ちのままでは、月ごとの合計を出すのに列ごとの合計を並べることになります。月が増えるたびに数式を足す必要があります。特定の月だけを抜き出すには、列の位置を求める処理が要ります。

縦持ちにすると、月は列の値になります。条件付きの集計関数で、月を条件に指定するだけで済みます。月が増えても数式は変わりません。

期間で絞る場合も同様です。横持ちでは複数の列を足し合わせることになりますが、縦持ちなら開始日と終了日の条件を指定するだけです。

商品分類と月のクロス集計を作る場合も、縦持ちのほうが単純になります。行に分類、列に月を並べ、条件付きの集計関数を一つ書いてコピーするだけです。

さらに、並べ替えも絞り込みも標準の機能が使えます。横持ちではこれらが使えません。

持ち替える手間は一度きりですが、以降の作業がすべて楽になります。長く使う表であれば、間違いなく元が取れます。


受け取る形式を変えられない場合

他部署やシステムから横持ちで受け取る場合、形式そのものは変えられないことがあります。この場合の対処を整理しておきます。

もっとも単純なのは、受け取ったシートをそのまま保持し、変換用のシートを別に作る方法です。受け取ったデータは触らず、変換後のデータを集計に使います。受け取り元の形式が変わらない限り、変換の仕組みはそのまま機能します。

変換には、行と列を入れ替える関数や、複数の範囲を一列にまとめる関数を使います。値だけでなく、月や項目の情報も同じ形で並べる必要があるため、手順はいくつかの段階に分かれます。

もうひとつの選択肢は、横持ちのまま集計する方法です。列の位置を求める処理を挟めば、特定の月を抜き出せます。ただし、月が増えるたびに範囲を広げる必要があります。

判断の目安は、その表を何回使うかです。一度きりなら横持ちのまま処理し、継続して使うなら変換の仕組みを作る。この基準で決めてください。

いずれの場合も、受け取ったままのデータは必ず残しておいてください。変換に誤りが見つかったときに、元に戻れます。


横持ちのデータをそのまま扱わない

HLOOKUPが必要になる場面の多くは、データが横方向に並んでいるためです。ただし、横持ちのまま集計を続けると、後で必ず行き詰まります。

列が増え続けます。 月ごとに列を足していく形は、数式の範囲を毎回広げる作業が発生します。

条件を足せません。 複数条件で絞り込む関数は、縦持ちを前提に作られています。

並べ替えができません。 横方向の並べ替えは、操作が限られます。

したがって、可能であればTRANSPOSEで縦に変換してから扱ってください。 一度縦持ちにすれば、VLOOKUPやXLOOKUP、FILTERといった扱いやすい関数が使えます。

元データを直接変換できない場合は、別シートに縦持ちの作業表を作ってください。 元データはそのまま残し、集計は作業表側で行う形です。

HLOOKUPを使うのは、横持ちの表を変更できない場合に限定してください。 使えないわけではありませんが、選択肢としては最後に来ます。

よくある質問

Q. VLOOKUPとどちらを使うべきですか

データが縦に並んでいるならVLOOKUP、横に並んでいるならHLOOKUPです。ただし、そもそも縦に持ち替えられないかを先に検討してください。

Q. 上方向に検索できますか

できません。検索する行は範囲の最上段である必要があります。上方向に検索したい場合は、INDEXと検索関数の組み合わせを使ってください。

Q. 行を挿入したら結果がずれました

行番号は固定の数値なので追従しません。検索関数で行番号を求める形に書き換えると壊れにくくなります。

Q. 見つからないときに空欄にしたいのですが

エラー回避の関数で包みます。ただし、本来見つかるはずのものまで隠れるので、動作確認が終わってから包んでください。

Q. 横方向のデータを集計したいのですが

集計関数は横方向の範囲も受け付けます。ただし、条件付きの集計になると書き方が煩雑になるため、縦に持ち替えるほうが楽です。

Q. 列数に上限はありますか

あります。横方向にデータを増やし続ける設計は、いずれ上限に達します。この点でも縦持ちが有利です。

Q. 印刷の都合で横並びにしています

元データを縦に持ち、印刷用の表を別に用意する構成にできます。行と列を入れ替える関数を使えば、表示用の表は自動生成できます。

Q. スプレッドシートでも同じですか

同じです。書き方も挙動も変わりません。


まとめ

  • 書式は =HLOOKUP(検索キー, 範囲, 行番号, FALSE)
  • 一番上の行を検索し、下へ数えて返す
  • VLOOKUPの縦横が入れ替わったもの
  • 行の挿入で壊れる弱点があるので、可能なら XLOOKUP を使う

関連する関数