Accessでは、様々な場面でDLookUp関数を用いることになります。DLookUp関数自体は非常に便利であるため、多くの方が活用されていると思いますが、返す値がない場合にそのまま処理を継続するとエラーになることがあります。
そこで、DLookUp関数を用いて参照値がなかった場合の処理について紹介します。
DLookUp関数で参照値がない場合の処理
DLookUp関数の基本的な処理については、先に紹介した記事でご確認ください。引数として「criteria」を設定しますが、この際に条件に合う値がない場合は「Null」が返されることになります。
この性質を利用し、DLookUp関数を用いた際に「Null」が返された場合は、別の値に置き換えることで、得られた値を用いて継続した処理をすることが可能となります。
この際、「Null」を判定する方法としては、Nz関数を用いた方法やIf文(IIf文)を用いて「IsNull」としての判定をする方法が考えられます。
次から具体的な方法を見ていきましょう。
サンプルデータ
サンプルデータを格納するためのテーブルとして、「T_DlookUp参照元」を作成します。
この際、フィールド名は「ID」、「氏名」及び「出身地」とし、それぞれ「短いテキスト」のデータ型とします。
続いて、表1に示すように値を登録します。
表1 サンプルデータ
ID | 氏名 | 出身地 |
21001 | 鈴木 太郎 | 北海道 |
21002 | 岡本 祐司 | 愛媛県 |
21003 | 坂本 伸介 | 東京都 |
20001 | 三浦 香 | |
20002 | 花菱 咲子 | 岐阜県 |
19001 | 林 新平 | 沖縄県 |
※ ID=20001の出身地は、この後にご紹介するテストのために「Null」としています。
以上で、サンプルデータの準備ができましたので、フォームを用いてDLookUp関数の結果が「Null」の場合の処理方法を見ていきましょう。
データ閲覧用フォームの作成
ここでは、IDを入力すると「T_DlookUp参照元」テーブルの「ID」フィールドに一致したレコードの氏名と出身地が表示される「F_DlookUp確認」フォームを作成します。
フォームデザインから新たにフォームの作成を開始します。次に図1に示すように、IDを入力するための「t_ID」テキストボックスを配置します。そして、氏名、出身地を表示するためのテキストボックスとして「t_氏名」及び「t_出身地」を配置します。また、これらの「編集ロック」プロパティは「はい」とし、背景色は灰色にしました。
続いて、IDを入力すると「T_DlookUp参照元」テーブルから該当レコードの有無を確認し、「t_氏名」及び「t_出身地」テキストボックスに値が反映されるようにDLookUp関数を用いたコードを実装します。
コードの実装先として、「t_ID」テキストボックスの「更新後処理」プロパティにイベントプロシージャを設定します(図2)。
ここで、今回の目的である「Null」が返された場合の処理として2つの方法を確認しましょう。
Nz関数を用いたNullの確認
1つ目の方法として、Nz関数を用いた方法を紹介します。Nz関数については以下の記事で紹介していますので、ご確認ください。
さて、実際のコード例を見てみましょう。
Private Sub t_ID_AfterUpdate() 'Nz関数を用いてNullに対する処理を設定した場合 Me.t_氏名 = Nz(DLookup("氏名", "T_Dlookup参照元", "ID = '" & Me.t_ID & "'"), "対象のデータなし") Me.t_出身地 = Nz(DLookup("出身地", "T_Dlookup参照元", "ID = '" & Me.t_ID & "'"), "対象のデータなし") '画面の更新 Me.Requery End Sub
コードの内容自体は至って簡単です。DLookUp関数により入力したIDに一致する「ID」フィールドの値を検索し、該当レコードがあれば、「氏名」及び「出身地」フィールドの値をそれぞれ「t_氏名」及び「t_出身地」テキストボックスにコピーする処理としています。
この際、DLookUp関数から「Null」が返された場合は、Nz関数を用いて「対象のデータなし」を返すように設定しています。
コードの実装ができましたら、さっそくフォーム画面からID入力をしてみましょう。
まずは、「t_ID」に「21001」を入力しEnterキーを押下すると、上述の処理に基づき図3に示すように「T_DlookUp参照元」テーブルの「ID」フィールドに一致したレコードの氏名と出身地が「t_氏名」と「t_出身地」テキストボックスに反映されます。
続いて、「t_ID」に「21005」を入力し、Enterキーを押下すると「T_DlookUp参照元」テーブルに該当レコードが存在しないため「t_氏名」と「t_出身地」テキストボックスに「対象のデータなし」
が表示されます(図4)。
最後に、「t_ID」に「20001」を入力し、Enterキーを押下すると「T_DlookUp参照元」テーブルの該当レコードに出身地が存在しないため「t_出身地」テキストボックスに「対象のデータなし」が表示されます(図5)。
このように、該当する値がない場合に「Null」が返されますので、DLookUp関数で取得した値を用いて続けて処理をする際は、「データ型が一致しない」等のエラーにご注意ください。
IIf関数を用いた処理の確認
先ほどは、Nz関数を用いた処理を紹介しました。次は、IIf関数を用いた処理を見てみましょう。
IIf関数については以下の記事をご参考にしてください。
基本的には先ほどと同様ですが、コードとしては次のように実装します。(コードが長くなる場合は、アンダーバーを挟むことで改行することができます。)
Private Sub t_ID_AfterUpdate() 'IIf関数を用いてNullに対する処理を設定した場合 Me.t_氏名 = IIf(IsNull(DLookup("氏名", "T_Dlookup参照元", "ID = '" & Me.t_ID & "'")), "対象のデータなし", DLookup("氏名", "T_Dlookup参照元", "ID = '" & Me.t_ID & "'")) Me.t_出身地 = IIf(IsNull(DLookup("出身地", "T_Dlookup参照元", "ID = '" & Me.t_ID & "'")), "対象のデータなし", DLookup("出身地", "T_Dlookup参照元", "ID = '" & Me.t_ID & "'")) '画面の更新 Me.Requery End Sub
ここで紹介した方法は、「IsNull()」を用いて、カッコ内が「Null」であればTrueを、そうでなければFalseの処理をするものです。なお、フォーム上での画面遷移は、Nz関数を用いた場合と同じです。
IIf関数の強みとしては、判定条件を「IsNull」に限らず得られた値でその後の処理を分岐させることができる点にあります。今回詳しくは紹介しませんが、例えば、DLookUp関数を用いた検索の結果「出身地」が「北海道」の場合は、「t_出身地」テキストボックスに「札幌市」と反映させる処理を実装することもできます。
上述の例のように、実際の業務フローに合わせた形で分岐処理を設定することができますので汎用性が高いのですが、単純に「Null」の判定だけをしたいという場合は、冗長にならないようにNz関数を用いることをお勧めします。
まとめ
今回は、DLookUp関数により該当レコードがなかった場合の処理としてNz関数の組み合わせ、IIf関数の組み合わせを紹介しました。
DLookUp関数は様々なシーンで用いられますが、「Null」に対する分岐処理を施しておくことがその後の処理を円滑に進める一因となりますので、是非作成されているAccessでDLookUp関数の戻り値がエラー要因になりえる箇所がないかをご確認いただければと思います。
スポンサーリンク
コメント