Access VBAを開発していると、
- 顧客コードから顧客名を取得したい
- 商品コードから単価を取得したい
- 設備番号から設備名を取得したい
- レコードが存在するか確認したい
- DAOを書くほどではない簡単な検索をしたい
という場面が頻繁に発生します。
結論から言うと、1件だけデータを取得したい場合はDLookup関数が非常に便利です。
DAOのRecordsetを使わなくても、
DLookup
だけで簡単にデータを取得できます。
実際の業務システムでは、
顧客管理
商品管理
マスタ参照
入力チェック
設備管理
などでよく利用されています。
- DLookupとは
- 基本構文
- なぜDLookupが便利なのか
- 逆引き① 顧客名を取得したい
- 逆引き② 商品単価を取得したい
- 逆引き③ レコード存在確認したい
- 逆引き④ 設備名を取得したい
- 逆引き⑤ フォームの値から検索したい
- Null対策は必須
- 実務活用例① 顧客管理システム
- 実務活用例② 商品管理システム
- 実務活用例③ 設備管理システム
- 実務活用例④ ログ管理システム
- 実務活用例⑤ 承認システム
- DLookupとDAOの使い分け
- DCountとの違い
- ベテラン開発者の定番コード
- Copilot活用術① DLookupコード生成
- Copilot活用術② Null対策追加
- Copilot活用術③ DAOとの比較
- DLookup利用時の注意点
- DLookupが向いている処理
- 開発現場での利用頻度
- まとめ
DLookupとは
DLookupは、
テーブル
↓
条件指定
↓
1項目取得
を行う関数です。
基本構文
DLookup(取得項目, テーブル名, 条件)
サンプル
DLookup("顧客名", "T_CUSTOMER", "顧客コード='C001'")
結果
東京商事
などが取得できます。
なぜDLookupが便利なのか
DAOの場合です。
Set rs = CurrentDb.OpenRecordset(strSQL)
さらに、
EOF確認
値取得
Close
が必要です。
DLookupなら、
strName = DLookup(...)
だけです。
メリット
簡単
記述量が少ない
初心者向き
です。
逆引き① 顧客名を取得したい
最も利用されます。
Dim strName As String
strName = Nz(DLookup("顧客名", "T_CUSTOMER", "顧客コード='C001'"), "")
結果
顧客名取得
できます。
逆引き② 商品単価を取得したい
商品管理です。
Dim lngPrice As Long
lngPrice = Nz(DLookup("単価", "T_PRODUCT", "商品コード='P001'"), 0)
結果
単価取得
逆引き③ レコード存在確認したい
入力チェックです。
If Not IsNull(DLookup("顧客コード", "T_CUSTOMER", "顧客コード='C001'")) Then
MsgBox "存在"
End If
効果
重複登録防止
逆引き④ 設備名を取得したい
設備管理システムです。
strMachine = Nz(DLookup("設備名称", "T_MACHINE", "設備番号='EQ001'"), "")
効果
設備情報表示
逆引き⑤ フォームの値から検索したい
実務でよく利用します。
Me!顧客名 = Nz(DLookup("顧客名", "T_CUSTOMER", "顧客コード='" & Me!顧客コード & "'"), "")
効果
自動入力
Null対策は必須
DLookup最大の注意点です。
危険な例
strName = DLookup(...)
問題
対象データがなければ
Null
になります。
安全な例
strName = Nz(DLookup(...), "")
非常に重要です。
実務活用例① 顧客管理システム
顧客コード入力時です。
Private Sub 顧客コード_AfterUpdate()
Me!顧客名 = _
Nz(DLookup("顧客名", "T_CUSTOMER", "顧客コード='" & Me!顧客コード & "'"), "")
End Sub
効果
自動表示
実務活用例② 商品管理システム
単価取得です。
Me!単価 = _
Nz(DLookup("単価", "T_PRODUCT", "商品コード='" & Me!商品コード & "'"), 0)
効果
入力効率向上
実務活用例③ 設備管理システム
設備検索です。
Me!設備名称 = _
Nz(DLookup("設備名称", "T_MACHINE", "設備番号='" & Me!設備番号 & "'"), "")
効果
入力ミス削減
実務活用例④ ログ管理システム
ユーザー名取得です。
strUserName = _
Nz(DLookup("氏名", "T_USER", "社員番号='" & strUserID & "'"), "")
効果
表示情報補完
実務活用例⑤ 承認システム
承認者取得です。
strApprover = _
Nz(DLookup("承認者", "T_APPROVAL", "部門='" & strSection & "'"), "")
効果
ワークフロー自動化
DLookupとDAOの使い分け
初心者が迷うポイントです。
DLookup
向いている用途
1件取得
簡易検索
フォーム連携
DAO
向いている用途
複数件取得
大量データ処理
ループ処理
判断基準
1件 → DLookup
複数件 → DAO
です。
DCountとの違い
似た関数です。
DLookup
DLookup
取得
値
DCount
DCount
取得
件数
用途が異なります。
ベテラン開発者の定番コード
入力補助です。
Private Sub 商品コード_AfterUpdate()
Me!商品名 = _
Nz(DLookup("商品名", "T_PRODUCT", "商品コード='" & Me!商品コード & "'"), "")
End Sub
実務で非常によく利用します。
Copilot活用術① DLookupコード生成
Copilotへの依頼例です。
Access VBAです。
商品コードから商品名を取得する
DLookupコードを
作成してください。
Copilot活用術② Null対策追加
DLookup利用コードです。
Nz関数を追加して
安全なコードへ
改善してください。
Copilot活用術③ DAOとの比較
このDLookup処理は
DAOへ変更した方が良いですか?
レビューしてください。
DLookup利用時の注意点
Null対策必須
Nz(…)
を利用します。
繰り返し実行に注意
大量ループ内で実行すると遅くなります。
複数件取得は不可
取得できるのは
1件
です。
インデックス設定推奨
検索対象項目にはインデックスを設定しましょう。
DLookupが向いている処理
特に活躍するのは次の用途です。
- 顧客名取得
- 商品名取得
- 単価取得
- 設備名称取得
- 利用者名取得
- 入力補助
- 存在確認
開発現場での利用頻度
| 順位 | 用途 |
|---|---|
| 1位 | マスタ参照 |
| 2位 | 顧客名取得 |
| 3位 | 商品名取得 |
| 4位 | 入力補助 |
| 5位 | 存在確認 |
Accessフォーム開発では非常によく利用されます。
まとめ
DLookup関数はAccess VBAで最も手軽にデータを参照できる関数です。
特に、
- 顧客管理
- 商品管理
- 設備管理
- 入力補助
- マスタ参照
などで大きな効果を発揮します。
まずは次のコードを覚えましょう。
Nz(DLookup("項目名", "テーブル名", "条件"), "")
これだけで実務でよくあるマスタ参照処理の多くに対応できます。
Copilotを活用すれば、
- DLookupコード生成
- Null対策追加
- DAOへの改善判断
も効率的に進められます。
Access VBA開発者なら必ず使う関数の一つなので、ぜひ習得しておきましょう。


コメント