要点 —
DGET(database, field, criteria)は、条件範囲が ちょうど1行に一致する列から、その唯一の値を返します。真骨頂はわざとエラーを 出すこと——一致が2行以上あれば#NUM!、1つもなければ#VALUE!。誰もが最初は バグとして出会いますが、これこそが機能です。VLOOKUP が 複数ある重複の先頭を黙って返すのに対し、DGETは拒否し、あなたの「一意」なキーが 一意でないと教えてくれます。そして条件は条件表に置かれるので、DGETは複数列の検索 (Region かつ Product)を補助列なしで行います。一致がちょうど1件のはずで、それを Excel に証明してほしいときに手を伸ばしましょう。すべての Excel バージョンで動作します。
=DGET(A1:E200, "Amount", H1:H2) ' H1:H2 に一致する唯一の行の Amount
=DGET(A1:E200, "Rep", H1:I2) ' 2つの条件(H1:I2)= AND 検索、補助列なし
=IFERROR(DGET(A1:E200, "Amount", H1:H2), "一意でない/見つからない") ' 本番向けに安全
VLOOKUP と XLOOKUP は寛容に作られています——キーを渡せば、最初に一致したものを
返し、それ以上は探しません。たいていはそれが望みどおりですが——ときに大惨事になります。
重複したキーが、警告もなしにもっともらしい間違った答えを返すからです。DGET は正反対の
気質です。一致は一意だと仮定し、それが偽になった瞬間にエラーで止まります。これを
欠点ではなく目的だと捉えられれば、DGET は Excel でもっとも切れ味のよいデータ検証用の
検索関数になります。
この記事で学べること
- 考え方の軸:推測する代わりに一意性を主張する検索
- 3つの引数、そして
DGETが条件範囲の発想をどう再利用するか #NUM!と#VALUE!——実は何かを教えてくれている2つのエラー- 文字列連結の小技なしで行う複数条件の検索(Region かつ Product)
DGETがXLOOKUPに勝つとき——そして間違った道具になる場面- エラーの意味を隠さずに、安全に包む方法
考え方の軸:推測を拒む検索
DGET は、契約を持った検索だと考えてください——「一致する行はちょうど1つある。
そこからフィールドを1つ取り出せ」。契約が守られていれば、値が得られます。守られて
いなければ——一致が0件でも、2件でも——DGET はそれを取り繕いません。この1つの
振る舞いの選択こそ、他のあらゆる検索から DGET を分けるものです。
' 条件ブロック H1:H2 — 条件は1つ:
' H1: OrderID
' H2: 10248
=DGET(A1:E200, "Amount", H1:H2) ' -> 注文 10248 の Amount、ただしその ID が一意なら
VLOOKUP なら、ID が3回現れていても最初の注文 10248 を平気で返します。DGET は
代わりに #NUM! を返します——OrderID が主キーのはずなら、それはまさに欲しい警報です。
「これを検索する」を「これを検索し、しかもキーが本当に一意かを確かめる」に、タダで
変えてくれるのです。
3つの引数(一族と同じ形)
=DGET(database, field, criteria)——DSUM や DCOUNTと同一です。
database— 見出し行を含めた表(A1:E200)。見出しは、フィールドと条件を列に 対応づける手がかりです。省くとDGETは壊れます。field— 値を取り出す列。引用符つきの見出し("Amount")、見出しの入った セル、または列番号で指定します。引用符つきの見出しが、読みやすく編集にも強い選択です。criteria— 見出しと条件のブロックを収めた範囲で、他の D関数とまったく同じです。 ルールも同じ——同じ行は AND、行を重ねると OR、見出しはデータと一字一句一致していなけ ればなりません。
条件範囲の組み立てについて知っていることは、そっくりそのまま通用します。変わるのは
約束ごとだけ——DGET は、そのブロックが1つの行を選ぶことを期待します。
#NUM! と #VALUE! こそが肝心
たいていの関数は、エラーの状態を1つしか持ちません。DGET は2つ持ち、しかも正反対の
ことを意味します——この2つを読み分けられるようになることが、DGET を使いこなす90%です。
=DGET(A1:E200, "Amount", H1:H2)
' -> 値 : ちょうど1行が一致(幸せな道)
' -> #NUM! : 2行以上が一致 — キーが一意でない
' -> #VALUE! : 一致が0行 — 条件に合うものがない
#NUM!は「多すぎる」。 2行以上が条件を満たしています。そのフィールドが一意な キーのはずだったなら、知らなかった重複をたった今見つけたわけです——本当に役立つ発見 です。もし複数の一致を見込んでいたなら、DGETはそもそも間違った関数です(欲しいのは 合計、フィルター、あるいは先頭一致の検索でしょう)。#VALUE!は「ゼロ」。 何も一致しませんでした——打ち間違えたキー、データと一致 しない条件見出し、あるいはそもそも存在しない値です。
2つのエラーは診断の役に立つので、まとめて IFERROR("") で飲み込みたい衝動はこらえ
ましょう。「キーの重複」と「見つからない」は別の問題であり、しばしば別の扱いに値します。
複数条件の検索、補助列なし
ここが、DGET が VLOOKUP を静かに設計で上回るところです。条件は条件表に置かれる
ので、2つ目の条件を足すのはただ列を1つ足すだけ——連結した補助キーなしで AND 検索が
手に入ります。
' West + Widgets の行の Rep を探す:
' H1: Region I1: Product
' H2: West I2: Widgets
=DGET(A1:E200, "Rep", H1:I2) ' 2つの列で同時に一致
2列のキーに対する VLOOKUP の定番の回避策は、Region&Product の補助列を作って
"West"&"Widgets" を検索することです——もろく、ごちゃつきます。DGET にはそれが一切
不要です——上端の行に見出しを2つ、その下に条件を2つ置けば、一致は行方向の AND に
なります。しかも一意性の保証はそのまま——West + Widgets が一意でなければ、ちゃんと
分かります。
DGET が XLOOKUP に勝つとき、勝たないとき
DGET は専門家です。持ち場の外で使うことが、報告される不満のほとんどを生みます。
次のとき DGET に手を伸ばす:
- 一致が一意のはずで、それを強制したいとき——請求書番号での照合、設定値を1つ取り 出す、キーの検証など。
- 複数列の AND 検索が必要で、補助キーを作りたくないとき。
- 条件が、シート上で目に見えて編集できる状態であるべきとき。
代わりに XLOOKUP か INDEX/MATCH を使う:
- 重複が前提で、エラーではなく最初(または最後)の一致が欲しいとき。ここで
DGETは ひたすら#NUM!を投げるだけです。 - 検索を何百行にもコピーしていくとき——行ごとに条件ブロックを作るより、
XLOOKUPの 方が無駄がありません。 - 近似/最も近い一致が必要なとき。
DGETは完全一致のみです。
一行のテスト:複数の一致はエラーか、それとも織り込み済みか? エラーなら、それを
エラーとして扱う検索は DGET だけです。
本番向けに包む(ただし目を塞がずに)
本番の数式が、生の #NUM!/#VALUE! をエンドユーザーに見せるべきではありませんが、
何もかもまとめて捕まえると診断を捨ててしまいます。大事な場面では、2つを区別しましょう。
' シンプル、どちらの問題も利用者にとって同じ意味なら:
=IFERROR(DGET(A1:E200, "Amount", H1:H2), "一意な一致なし")
' より良い、重複と不在で扱いを変えたいなら:
=IF(DCOUNT(A1:E200, "Amount", H1:H2) = 1,
DGET(A1:E200, "Amount", H1:H2),
IF(DCOUNT(A1:E200, "Amount", H1:H2) = 0, "見つからない", "キーが重複!"))
2つ目のパターンは、同じ条件に対して DCOUNT を使い、どちらの
失敗が起きたかを知らせます——DGET の厳格さを、エラーコードではなく明確なメッセージに
変えるのです。これこそ DGET の真価です——口うるさい検索ではなく、不正なデータを
無視できなくする検索なのです。
ExcelMaster の使いどころ
DGET は、正確な条件ブロックには報い、いいかげんな条件ブロックには罰を与えます——
まさにそこが厄介な部分です。ExcelMaster に「West + Widgets のあの1件の注文の
Amount を取って」と伝えれば、2列の条件表を組み、見出しをあなたのデータに合わせ、
=DGET(...) を書きます。#NUM! を投げている DGET を渡せば、どの行が衝突している
のかを説明し——エラーをただ隠すのではなく、気づいていなかった重複キーを浮かび上がら
せます。
よくある質問
DGET が #NUM! を返すのはなぜ?
条件に2行以上が一致しているからです。DGET はちょうど1つの値を返し、複数の一致を
エラーとして扱います——一意だと思っていたキーがそうでないという意味なので、しばしば
役立つエラーです。本当に複数の一致を見込んでいるなら、代わりに SUMIFS、FILTER、
または XLOOKUP のような先頭一致の検索を使いましょう。
DGET が #VALUE! を返すのはなぜ?
1行も一致しないからです。よくある原因は、打ち間違えた条件、データベースの見出しと 完全一致しない条件見出し、あるいは単にテーブルに存在しない値です。まず見出しのつづりを 確かめましょう——すべてのデータベース関数を通じて、最もよくある犯人です。
DGET は VLOOKUP とどう違う?
VLOOKUP は最初の一致を返し、重複は黙って無視します。DGET は単一の一致を
求め、2つ以上あればエラー(#NUM!)にします。DGET は条件範囲を通じて複数の列で
一致させられますが、VLOOKUP には連結した補助キーが必要です。寛容な先頭一致の検索には
VLOOKUP/XLOOKUP を、一意性を保証しなければならないときには DGET を使いましょう。
DGET は複数の列で一致させられる?
できます——それが中核的な強みです。条件範囲の上端の行に各見出しを、その真下に各条件を
置き、AND ロジックにするには同じ行にそろえます:Region=West と Product=Widgets を
1行に並べると、両方を満たす行だけに一致し、補助列は要りません。
DGET は Excel 2016 やそれ以前で使える?
使えます。DGET は、他のデータベース関数と同じく何十年も Excel に入っており、Excel
2016、2019、2021、365 でまったく同じように振る舞います。バージョンによる可用性の落とし穴を
心配する必要はありません。
検証環境
検証環境: Excel 365(Windows 11)— 最終確認 2026-07-20。
関連ガイド: ExcelのDSUM・DCOUNT · Excelのデータベース関数 · ExcelのVLOOKUP関数 · ExcelのINDEX & MATCH · XLOOKUP(2025)
