「担当者名から売上金額を1件だけ引っ張りたい」「部署と商品の組み合わせで単価を取得したい」。こんな場面、VLOOKUPで頑張ろうとして数式がぐちゃぐちゃになっていませんか。
VLOOKUPは左端列でしか検索できないので、条件が複雑になると工夫が必要です。検索値を結合して連結キーを作ったり、列の並びを入れ替えたり、INDEX+MATCHの組み合わせに切り替えたり。「ちょっと条件を増やしたいだけなのに、なぜこんなに大ごとになるんだろう」と感じた経験は、Excelやスプレッドシートを使う人なら一度はあるはずです。
そんなときに使えるのがDGET関数です。条件を別のセル範囲に書いておくだけで、一致するレコードから指定した列の値を1つ返してくれます。条件を増やしたいときは条件範囲に列を足すだけ。検索キーが何列目にあっても気にする必要がありません。条件を変えたいときも、セルを書き換えるだけで結果が即座に切り替わります。
この記事では、DGET関数の基本構文から、複数条件の書き方、比較演算子・ワイルドカードを使った高度な条件指定、VLOOKUPやINDEX+MATCHとの使い分け、よくあるエラーの対処法、FAQまでまとめて紹介します。読み終わるころには「条件付きで1件取得するならDGETで一発」と自信を持って言えるようになりますよ。
スプレッドシートのDGET関数とは? — 条件に合う1件の値を取り出す
DGET関数(読み方: ディー ゲット)は、データベース形式の表から条件に合うレコードを探し、指定した列の値を1つ返す関数です。
名前は「Database GET(データベースから取得)」の略です。DSUM(条件付き合計)やDCOUNT(条件付き個数)と同じ「データベース関数」の仲間で、引数の指定方法はファミリー全体で共通です。1つ覚えれば、芋づる式に他のデータベース関数も使えるようになります。
DGET関数の特徴をまとめると、次のとおりです。
- 条件をセル範囲(条件範囲)で指定するスタイル
- 条件に一致するレコードが1件だけのとき、指定した列の値を返す
- 一致するレコードが2件以上あると #NUM! エラー になる(仕様)
- 一致するレコードが0件だと #VALUE! エラー になる
- 複数条件(AND条件)にも対応
- 比較演算子(
>・<・<>)やワイルドカードも使える - 見出し付きのリスト形式のデータが前提
NOTE
DGET関数はGoogleスプレッドシートの全バージョンで使えます。Excelにも同じ関数があるので、ファイル形式を変換しても式が壊れません。社内でExcel派とスプレッドシート派が混在していても安心して使えます。
DGET関数が活きる場面
DGET関数が特に便利なのは、こんなシチュエーションです。
- マスターから1件だけピンポイントで取り出したい -- 顧客IDから氏名、商品コードから単価、社員番号から所属部署、など
- 検索キーが左端列にない -- VLOOKUPでは左端列でしか検索できないため、列の並びを変えずに検索したいときはDGETが便利
- 複数条件で1件に絞り込みたい -- 「部署 × 担当者 × 商品」のように、3つ以上の条件で1レコードを特定したいケース
- 検索条件を頻繁に切り替えたい -- ドロップダウンと組み合わせて検索フォームのような仕組みを作りたい場合
逆に、複数件ヒットする可能性がある検索や、近似一致が必要なケースには向きません。そういう場面ではVLOOKUP関数やFILTER関数のほうが適切なので、後ほど使い分けを整理します。
DGET関数の書き方(構文と引数)
基本構文
=DGET(データベース, フィールド, 条件)
引数は3つです。すべて必須で、省略はできません。
引数の説明
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| データベース | 必須 | 見出し行を含むデータ範囲(例: A1:D100) |
| フィールド | 必須 | 値を取得する列の見出し名(文字列)または列番号(数値) |
| 条件 | 必須 | 条件を記述したセル範囲(見出し行+条件行) |
それぞれ詳しく見ていきましょう。
データベース(第1引数)
データベースには、見出し行を含めたデータ範囲を指定します。先頭行に列の見出し(「部署」「担当者」「金額」など)が入っている必要があります。見出しがないとフィールドの参照ができないので、必ずヘッダー行を含めてください。
データが今後増えていくシートでは、A1:D7 のような固定範囲ではなく A1:D のように列指定(最終行を省略)で書くと、行が増えても式を直さずに済みます。ただし範囲全体のスキャンが入るので、シートが極端に巨大なときは固定範囲のほうが軽くなります。
フィールド(第2引数)
取得したい値がある列を指定します。指定方法は2つあります。
- 文字列で指定:
"金額"のように、見出しと同じ文字列をダブルクォーテーションで囲む - 数値で指定: データベースの左端列を1として、列の位置を数値で指定する(3列目なら
3)
文字列で指定するほうが、何の列かわかりやすいのでおすすめです。列の挿入や並び替えがあっても式が壊れにくいというメリットもあります。逆に数値指定だと、列を1つ追加しただけで参照先がズレるので注意してください。
条件(第3引数)
条件範囲には、見出し行と条件行の2行以上のセル範囲を指定します。データベース関数に共通する書き方です。
条件範囲はシートのどこに作っても構いません。ただし、データベースの直下に作ると行を追加するたびにレイアウトを直す羽目になるので、別の場所(右側の空きエリア・別シートなど)に切り出すのが定番です。
TIP
フィールドに列番号を使う場合、データベース範囲の左端が1です。シートのA列が1とは限らないので注意してください。たとえば
=DGET(C1:F100, 2, ...)ならD列が取得対象になります。
DGET関数の基本的な使い方
サンプルデータ
次のような売上データを使って説明します。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 部署 | 担当者 | 商品 | 金額 |
| 2 | 営業部 | 田中 | ノートPC | 150000 |
| 3 | 総務部 | 鈴木 | プリンター | 35000 |
| 4 | 営業部 | 佐藤 | モニター | 48000 |
| 5 | 経理部 | 高橋 | ノートPC | 150000 |
| 6 | 営業部 | 田中 | キーボード | 8000 |
| 7 | 総務部 | 伊藤 | モニター | 48000 |
条件範囲の設定方法
DGET関数の条件は、別のセル範囲に書きます。条件範囲の作り方は他のデータベース関数と共通です。
- 1行目に見出しを書く -- データベースの見出しと完全に同じ文字列を使う
- 2行目に条件値を書く -- 一致させたい値を入力する
たとえば「鈴木」さんの金額を取得したい場合、シートの空いているエリア(たとえばF1:F2)に次のように書きます。
| F | |
|---|---|
| 1 | 担当者 |
| 2 | 鈴木 |
数式はこうなります。
=DGET(A1:D7, "金額", F1:F2)
結果は 35000 です。担当者が「鈴木」のレコードは1件だけなので、その金額が返されます。
TIP
条件範囲の見出しは、データベースの見出しと1文字でも違うと正しく動きません。全角・半角やスペースの違いも不一致扱いになります。コピー&ペーストで作ると確実ですよ。
フィールドを変えるだけで違う列を取得する
同じ条件範囲(鈴木)のままフィールドだけ変えれば、別の列の値を一発で取り出せます。
=DGET(A1:D7, "部署", F1:F2) → 総務部
=DGET(A1:D7, "商品", F1:F2) → プリンター
=DGET(A1:D7, "金額", F1:F2) → 35000
担当者名から所属・取扱商品・金額をまとめて引き出せるので、検索フォームのようなUIを作るのに便利です。条件セルを書き換えるだけで全部の値が連動して切り替わります。
比較演算子を使った条件
条件値には比較演算子も使えます。
| 条件値の書き方 | 意味 |
|---|---|
鈴木 | 「鈴木」と完全一致 |
>=50000 | 50,000以上 |
<100000 | 100,000未満 |
<>営業部 | 「営業部」以外 |
>=2024/4/1 | 2024年4月1日以降(日付列) |
ただしDGET関数は条件に合うレコードが1件だけのときに値を返します。比較演算子を使って複数件ヒットすると #NUM! エラーになるので、条件は絞り込みが十分かどうか確認しましょう。「金額が10万円以上」だけだと2件以上ヒットする可能性が高いので、別の列の条件と組み合わせて1件に絞るのがコツです。
DGET関数の実践的な使い方・応用例
複数条件(AND条件)で値を取得する
「営業部」かつ「担当者が田中」の商品名を取得したい、というケースです。
AND条件は、条件範囲の同じ行に複数の見出し・条件値を横に並べて書きます。
| F | G | |
|---|---|---|
| 1 | 部署 | 担当者 |
| 2 | 営業部 | 田中 |
しかし、このサンプルデータでは営業部の田中さんは2件(ノートPCとキーボード)あるため、このまま実行すると #NUM! エラー になります。
条件をもう1つ追加して、一意に絞り込みましょう。
| F | G | H | |
|---|---|---|---|
| 1 | 部署 | 担当者 | 商品 |
| 2 | 営業部 | 田中 | キーボード |
=DGET(A1:D7, "金額", F1:H2)
結果は 8000 です。3つの条件すべてに一致するレコードが1件に絞り込まれたので、正しく値が返ります。
DGET関数は「結果が1件に絞り込まれること」が大前提です。条件を組み合わせてレコードを一意に特定するのがポイントですよ。
条件に合うレコードが複数あるときの対処
DGET関数で #NUM! エラーが出たら、条件に一致するレコードが2件以上あるということです。対処方法は3つあります。
- 条件を追加して絞り込む -- 上の例のように、AND条件で列を増やしてレコードを1件にする
- 集計で代用する -- 合計が欲しければDSUM関数、平均ならDAVERAGE関数、個数ならDCOUNT関数・DCOUNTA関数を使う
- FILTER関数で全件取得する -- 該当レコードをすべて表示したい場合はFILTER関数が適しています
「最大値だけ取り出したい」「最小値だけ取り出したい」というケースなら、DMAX関数やDMIN関数に切り替えるのも選択肢です。用途に合わせて使い分けてみてください。
条件範囲を切り替えて検索対象を変える
DGET関数の強みは、条件をセルに書いているため、セルの値を書き換えるだけで取得結果が即座に変わる点です。
たとえば条件範囲のF2セルを「鈴木」から「高橋」に変えるだけで、DGET関数の結果が自動的に切り替わります。数式を修正する必要はありません。
ドロップダウンリスト(データの入力規則)と組み合わせれば、担当者を選ぶだけで対応する金額が表示される検索フォームのような仕組みが作れますよ。複数のDGET関数を並べておけば、ID入力 → 氏名・所属・連絡先・契約金額がまとめて表示される顧客カードのようなUIも数式だけで実現できます。
完全一致したいときは ="=○○" の書き方
条件値が "営業" だけだと、デフォルトで「営業で始まる」(前方一致)として解釈されます。たとえば「営業部」「営業1課」も拾ってしまうのです。完全一致で「営業」だけを拾いたいときは、特殊な記法を使います。
| F | |
|---|---|
| 1 | 部署 |
| 2 | ="=営業" |
ダブルクォーテーションの中に =営業 と書くのがポイントです。これで「営業」と完全一致するレコードだけが対象になります。前方一致のせいで複数件ヒットして #NUM! エラーになるトラブルの定番対策なので、覚えておくと役立ちますよ。
DGET関数とVLOOKUP・INDEX+MATCHの使い分け
スプレッドシートで「条件に合う値を取得する」なら、VLOOKUP関数やINDEX+MATCHの組み合わせも定番です。どれを選ぶか迷う方が多いので、違いを整理します。
| 比較項目 | DGET関数 | VLOOKUP関数 | INDEX+MATCH |
|---|---|---|---|
| 条件の指定方法 | セル範囲(条件範囲) | 数式の引数に検索値を直接書く | 数式の引数に検索値を直接書く |
| 検索できる列 | どの列でも条件にできる | 左端列でしか検索できない | どの列でも検索できる |
| 複数条件 | 条件範囲に列を追加するだけ | 作業列で連結キーが必要 | 配列数式で対応可能(やや上級) |
| 結果が複数件のとき | #NUM! エラー(1件のみ対応) | 最初に見つかった値を返す | 最初に見つかった値を返す |
| 結果が0件のとき | #VALUE! エラー | #N/A エラー | #N/A エラー |
| 近似一致 | 非対応 | 第4引数で切り替え可能 | MATCH の第3引数で対応 |
| 条件の切り替えやすさ | セルを書き換えるだけ | 数式を編集する必要あり | 数式を編集する必要あり |
| 数式の長さ | 短くシンプル | 短い | やや長い |
使い分けのポイント:
- 「名前で検索して値を1つ取得」のシンプルな用途 → VLOOKUP関数のほうが手軽
- 検索列が左端にない、または複数条件で絞り込みたい → DGET関数が便利
- 条件を頻繁に切り替えたい → DGET関数がおすすめ(セルを変えるだけで結果が変わる)
- 該当が複数件あっても最初の1件を取得したい → VLOOKUP関数 / INDEX+MATCHを使う
- 近似一致(〜以下の最大値など)が必要 → VLOOKUP関数 / INDEX+MATCHを使う
- 検索キーが右側の列にある → DGET関数 / INDEX+MATCH
実務では、マスターテーブルからの単純な検索にはVLOOKUP関数、複数条件でピンポイントに値を取り出す場面にはDGET関数、と使い分けるとスムーズです。INDEX+MATCHは数式が少し長くなりますが、近似一致と複数条件の両方に対応できる中間的な選択肢として覚えておくと便利ですよ。
他のデータベース関数との連携
DGET関数は単独で使うだけでなく、他のデータベース関数と組み合わせると検索ダッシュボードの幅が広がります。同じ条件範囲を使い回せるので、入力欄1つで複数の指標が同時に切り替わる仕組みが作れます。
| 関数 | 役割 | 用途例 |
|---|---|---|
| DGET | 条件に合う1件を取得 | 顧客IDから氏名・所属を抽出 |
| DCOUNT | 条件付きで「数値」だけカウント | 該当レコードが何件あるか確認 |
| DCOUNTA | 条件付きで「空白以外」をカウント | 担当者がアサイン済みの件数 |
| DSUM | 条件付き合計 | 部署別売上合計 |
| DAVERAGE | 条件付き平均 | 部署別平均単価 |
| DMAX | 条件付き最大値 | 部署別最高売上 |
| DMIN | 条件付き最小値 | 部署別最低売上 |
たとえば「顧客カード」のレポートを作るなら、F1:F2 に「顧客ID / 1001」と書くだけで、氏名(DGET)・所属(DGET)・契約件数(DCOUNT)・売上合計(DSUM)が一気に切り替わります。条件範囲を共有するアーキテクチャはダッシュボード作りの王道です。
DGET関数を使う前に「該当レコードが何件あるか」をDCOUNT関数で先にチェックしておくと、#NUM! エラーの予防になります。=IF(DCOUNT(A1:D7,"金額",F1:F2)=1, DGET(A1:D7,"金額",F1:F2), "条件を絞ってください") のようにIFと組み合わせると、エラー表示の代わりにメッセージを出せて親切です。
よくあるエラーと対処法
DGET関数で「思った結果にならない」ケースをまとめました。
| 症状 | 原因 | 対処法 |
|---|---|---|
| #NUM! エラー | 条件に一致するレコードが2件以上ある | 条件を追加して1件に絞り込む。集計が目的ならDSUM/DAVERAGEを使う |
| #VALUE! エラー | 条件に一致するレコードが1件もない | 条件値のスペルミスや全角・半角の違いを確認する |
| #VALUE! エラー | フィールドに存在しない列名を指定している | データベースの見出しと同じ文字列を使う |
| #VALUE! エラー | 引数が不足している(3つ未満) | データベース・フィールド・条件の3つすべてを指定する |
| 結果が0や空白 | 該当レコードのセルが空白 | データの入力漏れがないか確認する |
| 想定と違う値が返る | 条件範囲に空白行が含まれている | 条件範囲を必要な行だけに絞る(空白行は「すべて一致」扱い) |
| 想定と違う値が返る | 前方一致の仕様で意図しないレコードまで拾われている | ="=営業部" のように完全一致記法を使う |
| 条件が部分一致になる | 条件値にワイルドカード * が含まれている | 完全一致にしたい場合は ="=鈴木" のように先頭に = を付ける |
| 想定と違う列が取得される | フィールドの列番号を間違えている | 列番号ではなく見出し名(文字列)で指定するのがおすすめ |
| 結果が更新されない | 条件範囲のセルが文字列扱いになっている | セルの書式を「自動」に戻すか、再入力する |
TIP
DGET関数で最も多いトラブルは #NUM! エラーです。「条件に一致するレコードが何件あるか」をDCOUNT関数やDCOUNTA関数で事前に確認すると、原因の切り分けがスムーズですよ。
IFERROR でエラー表示を整える
DGET関数は #NUM! や #VALUE! エラーが出やすいので、IFERROR関数でラップして表示を整えるのが実務テクニックです。
=IFERROR(DGET(A1:D7, "金額", F1:F2), "該当なし、または複数該当")
エラーの種類で分岐させたい場合は、IFNA・IFERROR・IF を組み合わせる方法もあります。ダッシュボードに組み込むときは、ユーザーがエラーセルを見て驚かないよう、必ず IFERROR を被せておきましょう。
Excelとの違い
DGET関数はExcelとGoogleスプレッドシートで基本的に同じ動作です。
| 項目 | Excel | Googleスプレッドシート |
|---|---|---|
| 構文 | =DGET(database, field, criteria) | =DGET(データベース, フィールド, 条件) |
| 動作 | 条件に合う値を1つ返す | 条件に合う値を1つ返す |
| 条件範囲の仕様 | 見出し行+条件行 | 見出し行+条件行 |
| 複数一致時のエラー | #NUM! | #NUM! |
| 該当なし時のエラー | #VALUE! | #VALUE! |
| ワイルドカード | 対応 | 対応 |
引数名の表記は日本語と英語で異なりますが、機能は同じです。ExcelでのDGET関数の使い方はExcelのDGET関数で条件に一致するレコードを1つ抽出するでも紹介しています。スプレッドシートで作った数式をExcelに持っていっても、引数の中身(範囲・文字列)はそのまま動くので、ファイルをまたいでも安心して使えますよ。
DGET関数のFAQ
Q. DGETとVLOOKUPはどちらを使えばいい?
シンプルな1列検索ならVLOOKUP、複数条件や検索列が右側にあるケースならDGETがおすすめです。条件を頻繁に切り替えるダッシュボードでもDGETが活きます。マスター参照のような単純な用途では、VLOOKUPの方が数式が短くて済みます。
Q. DGETで複数件取得したい場合は?
DGET関数は1件のみ返す仕様なので、複数件取得したい場合は FILTER関数 や QUERY関数 に切り替えてください。=FILTER(D2:D7, A2:A7="営業部") のように書けば、条件に合う全レコードを取得できます。
Q. 条件にワイルドカードは使える?
はい、*(任意の文字列)と ?(任意の1文字)が使えます。ただしワイルドカードを使うと複数件ヒットしやすくなり #NUM! エラーになりがちです。条件をしっかり絞れる場合だけ使いましょう。
Q. 大文字・小文字は区別される?
DGET関数は大文字・小文字を区別しません。apple と APPLE は同じものとして扱われます。完全に区別したい場合は、EXACT関数とFILTER関数を組み合わせる方法に切り替えてください。
Q. 条件範囲を別シートに置ける?
はい、別シートに置いても問題なく動作します。=DGET(売上データ!A1:D7, "金額", 検索フォーム!F1:F2) のように書けば、データシートと検索フォームを分離できます。レイアウトをきれいに保ちたい業務シートではこの構成がおすすめです。
Q. DGETで近似一致(〜以下の最大値など)はできる?
DGET関数は完全一致と比較演算子のみ対応しており、VLOOKUPの近似一致のような「価格表から該当する区分を見つける」動きは苦手です。近似一致が必要な場合はVLOOKUP関数やINDEX+MATCHを使ってください。
Q. 関連するデータベース関数は?
代表的なものは以下です。条件範囲の作り方はすべて共通なので、まとめて覚えると応用が効きます。
まとめ
DGET関数は、データベース形式の表から条件に合うレコードの値を1つ取得する関数です。
ポイントを整理します。
- 構文は
=DGET(データベース, フィールド, 条件)で、引数は3つ - 条件は数式内ではなくセル範囲(条件範囲)に書くのが特徴
- 条件に一致するレコードが1件のときだけ値を返す(2件以上は #NUM!、0件は #VALUE!)
- 複数条件は条件範囲に列を追加してAND条件で絞り込む
- 比較演算子(
>・<・<>)やワイルドカードも使える - 完全一致したいときは
="=営業部"の特殊記法を使う - VLOOKUPは左端列限定だが、DGETはどの列でも条件にできる
- 単純な検索にはVLOOKUP、複数条件でピンポイント取得にはDGETがおすすめ
- #NUM! エラーが出たらDCOUNT関数で該当件数を事前に確認するとスムーズ
- IFERROR関数でラップしてエラー表示を整えるのが実務テクニック
まずは簡単な表で =DGET(A1:D7, "金額", F1:F2) から試してみてください。慣れてきたら条件範囲をプルダウンと連動させて、ID1つ入れるだけで顧客カードが切り替わる検索フォームに育てていけますよ。
