文書番号: 285866 - 最終更新日: 2005年6月10日 - リビジョン: 5.2

[ACC2003] DLookup() の使い方、例、トラブルシューティング

お知らせお使いのオペレーティング システムには適用しない情報が含まれている場合があります。
この記事は、以前は次の ID で公開されていました: JP285866
難易度 : 低。シングル ユーザー コンピュータのユーザー インターフェイスに関する知識が必要です。

この資料は Microsoft Access データベース (.mdb)、および Microsoft Access プロジェクト (.adp) について記述したものです。

Microsoft Access 2000 については、次の資料を参照してください。 208786? (http://support.microsoft.com/kb/208786/ )
Microsoft Access 97 または 95 については、次の資料を参照してください。 136122? (http://support.microsoft.com/kb/136122/ )
すべて展開する | すべて折りたたむ

概要

この資料では、DLookup() 関数の使用法、例およびヒントを示します。

この資料では、以下の項目を取り扱います。
  • DLookup() 関数の構文と使用法
  • DLookup() 関数の例
    • 抽出条件を指定しない場合
    • 数値抽出条件を指定する場合
    • フォーム上のフィールドによる数値抽出条件を指定する場合
    • テキスト抽出条件を指定する場合
    • フォーム上のフィールドによるテキスト抽出条件を指定する場合
    • 日付抽出条件を指定する場合
    • 抽出条件に複数フィールドを指定する場合
  • DLookup() 式のトラブルシューティングとデバッグに関するヒント
DLookup() 関数の使用に伴う問題の多くは、抽出条件式を正しく設定および指定していない場合に発生します。抽出条件式は、DSum()、DFirst()、DLast()、DMin()、DMax()、DCount() など、他の多くの集計 (合計) 関数に共通するものです。したがって、以下の内容は DLookup() 関数だけでなく、定義域集計関数を理解するためにも役立ちます。

詳細

DLookup() 関数の構文と使用法

DLookup() 関数を式または Visual Basic for Applications (VBA) 関数の中で使用すると、定義域のフィールド値や指定されたレコードの集合を返すことができます。

DLookup() 関数の構文は次のとおりです。
   DLookup(Expression, Domain [, Criteria])
				
この関数は、ExpressionDomain、および Criteria という 3 つの引数を受け付けます (Criteria 引数は省略可能です)。

Expression 引数は、対象となる定義域内のデータが含まれているフィールドを指定したり、そのフィールドのデータを使用して計算を実行したりするために使用します。

Domain 引数は、定義域を指定するレコードセットの名前です。この引数には、テーブルまたはクエリを指定することができます。

Criteria 引数は省略可能な文字列式で、DLookup() 関数の実行対象となるデータの範囲を制限できます。Criteria 引数は SQL 式の WHERE 句に相当します (ただし、キーワード WHERE は使用しません)。

DLookup() 関数は、複数のレコードが抽出条件を満たす場合であっても、1 つのフィールドからは 1 つの値を返します。抽出条件を満たすレコードがない場合や、定義域にレコードが含まれていない場合、DLookup() は Null を返します。

DLookup() 関数の例

以下の例は、DLookup() を使用して、テーブルやクエリの値を検索または取得する方法を示したものです。以下の例では、サンプル データベースの Northwind.mdb を参照します。また、それぞれの例は、フォームやレポート上にあるテキスト ボックスの ControlSource プロパティに入力することができます。

: 以下の例の行末にあるアンダースコア (_) は行継続文字として使用されています。これらの式を作成し直す場合は、行末のアンダースコアを削除して次の行と連結してください。

抽出条件を指定しない場合

この例では、抽出条件を一切指定しない最も単純な形式で DLookup() 関数を使用する方法を示します。この例は、[社員] テーブルにある最初のレコードの [氏名] フィールドに含まれる値を返します。
=DLookup("[氏名]", "社員")
				

数値抽出条件を指定する場合

社員コードが 7 である社員の氏名を検索するには、次のように、使用するレコードの範囲を限定する抽出条件を指定します。
=DLookup("[氏名]", "社員", "[社員コード] = 7")
				

フォーム上のフィールドによる数値抽出条件を指定する場合

先の例では式の中に特定の値を指定しましたが、抽出条件でパラメータを使用することもできます。次の例は、現在のフォーム上にある別のフィールドから抽出条件を指定する方法を示したものです。サンプル データベース Northwind.mdb の [受注] フォームでこれらの例を試すことができます。
=DLookup("[氏名]", "社員", _
"[社員コード] = Form![社員コード]")
=DLookup("[氏名]", "社員", _
"[社員コード] = " & [社員コード])
=DLookup("[氏名]", "社員", _
"[社員コード] = " & Forms![受注]![社員コード])
				
上記 3 つの例は、同じ結果を返します。

最初の例では、Form![社員コード] が抽出条件の引用符の中に置かれています。"Form" は、フィールド参照の "社員コード" が現在のフォームのものであることを示します。"Form" を指定しないと、"社員コード" と [社員] テーブルの社員コードそのものとが比較され、[社員] テーブルにある最初のレコードから氏名が返されます (抽出条件を何も指定しなかった場合と同じ結果になります)。なぜなら、[社員] テーブルにある最初のレコードは "社員コード" フィールドが 1 であるため、
"[社員コード] = [社員コード]"
				
という引数は次のように変換され、
   "1 = 1"
				
抽出条件に一致する最初のレコードとして抽出されるためです。

残り 2 つの例の抽出条件は、アンパサンド (&) を使用して 2 つの文字列式を連結したものになっています。3 番目の例では、抽出条件の最後がフォーム フィールドの参照になっています。

抽出条件の評価に際しては、まず抽出条件の各部が評価され、それらを追加または連結して全体の値が求められます。

[受注] フォーム上にある "社員コード" フィールドの現在の値が 7 の場合、元の抽出条件式
"[社員コード] = " & [社員コード]
				
は、次のように変換されます。
"[社員コード] = " & 7
				
これらを連結すると次のようになります。
"[社員コード] = 7"
				
(上記 2 番目の例のように) 完全なフォーム参照を指定しない場合、Microsoft Access では現在のフォームを参照するものと見なされます。

次の例は、上記 3 番目の例から派生したものです。
=DLookup("[氏名]", "社員", _
"[社員コード] = Forms![受注]![社員コード]")
				
この例では、完全なフォーム参照が、抽出条件の引用符の中に囲まれています。この場合、フォームが最初に開いたときには Microsoft Access によって正しく値が照会されます。しかし値が正しく照会されるのは、レコードの修正やレコードの追加によって "社員コード" フィールドが変更されるまでの間に限られます。そのような変更が発生した場合、Microsoft Access によって自動的に社員の氏名が再計算されることはありません。コントロールの上にカーソルを置いて F9 キーを押すことで、式を手動で再計算させることができます。

抽出条件が変更されたときにフィールドが自動的に更新されるようにする場合は、前述のように、式の各部を連結する方法を使用して、抽出条件を変数にします。新しいレコードに移動する際、[社員コード] ボックスに何かを入力するまでは、自動更新される DLookup() のテキスト ボックスには "#エラー" と表示されることに注意してください。

テキスト抽出条件を指定する場合

以上の例はすべて、数値抽出条件と一緒に DLookup 関数を使用する方法を示したものです。抽出条件フィールドがテキストの場合は、次の例に示すように、単一引用符でテキストを囲みます。
=DLookup("[Title]", "社員", "[氏名] = '川村 匡'")
				
単一引用符の使用を推奨しますが、単一引用符の代わりに二重引用符も使用できます。単一引用符 1 つを置き換えるには、2 つの二重引用符を使用します。次の例は二重引用符を使用したもので、上記の例と等価です。
=DLookup("[Title]", "社員", "[氏名] = ""川村 匡""")
				

フォーム上のフィールドによるテキスト抽出条件を指定する場合

次の例は、[受注] フォームの得意先に対応する得意先名を検索する方法を示したものです。"得意先コード" フィールドは抽出条件のテキスト キー フィールドであるため、DLookup() ステートメントは次のようになります。
=DLookup("[得意先名]", "[得意先]", _
"[得意先コード]='" & [得意先コード] & "'")
				
または
=DLookup("[得意先名]", "[得意先]", _
"[得意先コード]='" & Forms![受注]![得意先コード] & "'")
				
2 番目の例では、抽出条件が 3 つの文字列式を連結したものになっています。最初の部分が "[得意先コード] = '"、2 番目が "得意先コード" フィールドに実際に含まれている値、3 番目が閉じる側の単一引用符を二重引用符で囲んだものです。

この抽出条件が評価されるとき、最初に個々の部分が評価され、その結果が追加または連結されます。その後で、全体の値が求められます。

[受注] フォームの [得意先コード] ボックスで現在選択されている値が "笹の葉食料品店" の場合、このコンボ ボックスに連結した列が得意先コードとして "0033" を返します。元の抽出条件の
"[得意先コード] = '" & [得意先コード] & "'"
				
は、次のように評価されます。
"[得意先コード] = '" & "0033" & "'"
				
これらを連結して評価すると次のようになります。
"[得意先コード] = 0033"
				

日付抽出条件を指定する場合

抽出条件フィールドが日付や時刻の値の場合、日付や時刻の値をシャープ記号 (#) で囲みます。指定した日付が誕生日の社員を検索するには、たとえば、次の抽出条件を使用します。
=DLookup("[氏名]", "社員", "[誕生日] = #68-12-08#")
				

抽出条件に複数フィールドを指定する場合

抽出条件式には、任意の有効な SQL WHERE 句 (キーワード WHERE は除きます) を指定できます。つまり、複数のフィールドを使用して、DLookup() 関数の抽出条件を指定できるということです。

たとえば、社員コードが 204 (数値) の社員 "川村 匡" が販売した受注のうち、得意先コードが 0005 (オートナンバー) である得意先 "居酒屋ななべえ" に対応するものを検索するには、次の DLookup() ステートメントを使用します。
=DLookup("[受注コード]", "受注", _
"[得意先コード] = '0005' And [社員コード] = 204")
				
このステートメントは "受注コード" 1011 を返します。これは上記の抽出条件に一致する最初の "受注コード" です。"受注コード" 1056 もこの抽出条件に一致します。

上記の例では、ハードコードされた (特定の) "得意先コード" と "社員コード" の値が使用されています。抽出条件で特定の値の代わりに変数を使用するには、Visual Basic for Applications (VBA) を使用して、複数の文字列式を連結することができます。次の Visual Basic の例は、この方法を示したものです。
Sub subTest
    ' 変数の宣言
    Dim CustID As String
    Dim EmpID As Long
    Dim Result
    ' 抽出条件で使用する変数に値を代入します。
    CustID = "0005"
    EmpID = 204
    Result = DLookup("[受注コード]", "受注", _
             "[得意先コード] = '" & CustID & "' And [社員コード] = " & EmpID)
   MsgBox Result
End Sub
				
DLookup() 関数が失敗した場合は、変数 Result に Null が入ります。

抽出条件は 4 つの部分から構成されています。それぞれの部分が個別に評価された後、各部分の結果が連結され、全体が評価されます。元の抽出条件の
"[得意先コード] = '" & CustID & "' And [社員コード] = " & EmpID
				
は、次のように評価されます。
"[得意先コード] = '" & "0005" & "' And [社員コード] = " & 204
				
これらを連結して評価すると次のようになります。
"[得意先コード] = '0005' And [社員コード] = 204"
				
次の例を使用すると、今日が誕生日の社員を検索することができます。
=DLookup("[氏名]", "社員", _
"Month([誕生日]) = " & Month(Date) & " And Day([誕生日]) _
      = " & Day(Date))
				
今日の日付が 2001 年 12 月 2 日の場合、元の抽出条件式の
"Month([誕生日]) = " & Month(Date) & " And Day([誕生日]) = " _
      & Day(Date)
				
は、次のように評価されます。
"Month([誕生日]) = " & 12 & " And Day([誕生日]) = " & 2
				
これらを連結して評価すると次のようになります。
"Month([誕生日]) = 12 And Day([誕生日]) = 2"
				

DLookup() 式のトラブルシューティングとデバッグに関するヒント

式のトラブルシューティングを行うには、式を小さな部分に分解し、各部分を個別に [イミディエイト] ウィンドウ内でテストして、それらが正常に動作するかどうかを確認します。個々の小さい構成要素が正しく動作すれば、それらを 1 つずつ、最終的な式が正しく動作するまで元に戻していくことができます。

[イミディエイト] ウィンドウを使用すると、Visual Basic のモジュールをデバッグする際に便利です。[イミディエイト] ウィンドウを使用して、フォームやマクロで使用されている式を単独でテストおよび評価します。[イミディエイト] ウィンドウに式を設定し、それらを実行すると、結果が即座に表示されます。

次の例は、[イミディエイト] ウィンドウでテストできるように、DLookup() の式を小さな要素に分解する方法を示したものです。次のステートメントで問題が発生したとします。
=DLookup("[受注コード]", "受注", _
"[得意先コード] = '" & Forms![MyForm]![得意先コード] _
& "' And [社員コード] = " & Forms![MyForm]![社員コード])
				
検索条件には複数の抽出条件フィールドが含まれており、1 つが数値、1 つはテキストです。

この式のトラブルシューティングを行うには、次の手順を実行します。
  1. Ctrl + G キーを押して [イミディエイト] ウィンドウを開きます。
  2. 抽出条件を何も指定せずに関数をテストします。これを行うには、[イミディエイト] ウィンドウに次のように入力して、Enter キーを押します。
    ? DLookup("[受注コード]", "受注")
    					
  3. フォームの参照が正しいことを確認します。これを行うには、サンプル データベース Northwind.mdb の [受注] フォームを開き、次の各行を [イミディエイト] ウィンドウに入力します。それぞれの行の最後で Enter キーを押します。
    ? Forms![MyForm]![得意先コード]
    					
    および
    ? Forms![MyForm]![社員コード]
    					
  4. 式に値をハードコードして、抽出条件の各フィールドが単独で正常に動作するかどうかを確認します。これを行うには、[イミディエイト] ウィンドウに次の各行を入力し、それぞれの最後で Enter キーを押します。
    ? DLookup("[受注コード]", "受注", "[得意先コード] = '0005'")
    					
    および
    ? DLookup("[受注コード]", "受注", "[社員コード] = 2)
    					
  5. クエリにパラメータを使用して、抽出条件の各フィールドが単独で正常に動作するかどうかを確認します。これを行うには、[イミディエイト] ウィンドウに次の各行を入力し、それぞれの最後で Enter キーを押します。
    ? DLookup("[受注コード]", "受注", _
       "[得意先コード] = '" & Forms![MyForm]![得意先コード] & "'")
    					
    および
    ? DLookup("[受注コード]", "受注", _
       "[社員コード] = " & Forms![MyForm]![社員コード])
    					

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 285866? (http://support.microsoft.com/kb/285866/EN-US/ ) (最終更新日 2004-05-28) を基に作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

この資料は以下の製品について記述したものです。
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
キーワード:?
kbprogramming kbfunctions kbdta kbfaq kbhowto KB285866
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"