🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

ExcelのDGET関数 — レコードを1件だけ取り出し、なければ堂々とエラーにする

|

ExcelのDGET関数 — レコードを1件だけ取り出し、なければ堂々とエラーにする

要点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), "一意でない/見つからない")   ' 本番向けに安全

VLOOKUPXLOOKUP は寛容に作られています——キーを渡せば、最初に一致したものを 返し、それ以上は探しません。たいていはそれが望みどおりですが——ときに大惨事になります。 重複したキーが、警告もなしにもっともらしい間違った答えを返すからです。DGET は正反対の 気質です。一致は一意だと仮定し、それが偽になった瞬間にエラーで止まります。これを 欠点ではなく目的だと捉えられれば、DGET は Excel でもっとも切れ味のよいデータ検証用の 検索関数になります。

この記事で学べること

  • 考え方の軸:推測する代わりに一意性を主張する検索
  • 3つの引数、そして DGET が条件範囲の発想をどう再利用するか
  • #NUM!#VALUE!——実は何かを教えてくれている2つのエラー
  • 文字列連結の小技なしで行う複数条件の検索(Region かつ Product)
  • DGETXLOOKUP に勝つとき——そして間違った道具になる場面
  • エラーの意味を隠さずに、安全に包む方法

考え方の軸:推測を拒む検索

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("") で飲み込みたい衝動はこらえ ましょう。「キーの重複」と「見つからない」は別の問題であり、しばしば別の扱いに値します。

複数条件の検索、補助列なし

ここが、DGETVLOOKUP を静かに設計で上回るところです。条件は条件に置かれる ので、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 検索が必要で、補助キーを作りたくないとき。
  • 条件が、シート上で目に見えて編集できる状態であるべきとき。

代わりに XLOOKUPINDEX/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つの値を返し、複数の一致を エラーとして扱います——一意だと思っていたキーがそうでないという意味なので、しばしば 役立つエラーです。本当に複数の一致を見込んでいるなら、代わりに SUMIFSFILTER、 または XLOOKUP のような先頭一致の検索を使いましょう。

DGET が #VALUE! を返すのはなぜ?

1行も一致しないからです。よくある原因は、打ち間違えた条件、データベースの見出しと 完全一致しない条件見出し、あるいは単にテーブルに存在しない値です。まず見出しのつづりを 確かめましょう——すべてのデータベース関数を通じて、最もよくある犯人です。

DGET は VLOOKUP とどう違う?

VLOOKUP最初の一致を返し、重複は黙って無視します。DGET単一の一致を 求め、2つ以上あればエラー(#NUM!)にします。DGET は条件範囲を通じて複数の列で 一致させられますが、VLOOKUP には連結した補助キーが必要です。寛容な先頭一致の検索には VLOOKUPXLOOKUP を、一意性を保証しなければならないときには 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)