[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.087 Access DLookup関数を使ってみた

Access DLookup関数を使ってみた

メルマガ発行内容

<Access DLookup関数を使ってみた>

どうも、三流プログラマーのKen3です。 今回は、 AccessでDLookup関数を使ってみたいと思います。

/* * 1.今回のキッカケ */

メールで下記の質問をもらいました。 --------------- In message "アクセスVBAでwindowの閉じ方、グループでのデータ取得法...", >あとひとつは、やはりアクセスで、 >グループ処理のとき、次のデータから > >    fld1 fld2 fld3 >     あ  2   a >     あ  1   b >     あ  4   c > >「あ」でグループ化し、fld2から 最小値 1をえらび > fld3 については、bを表示させたいのですが、 >(fld2に属するfldsのデータを選ぶ) > >どうすればよろしいのですか。 --------------- そんな質問に対して、 よく使うだろうと思う、DLookupを使ってみたいと思います。

/* * 2.クエリーとDLookupでかわしてみようと思った */

クエリーとDLookupでできそうです。     fld1 fld2 fld3      あ  2   a      あ  1   b      あ  4   c 「あ」を条件にして、fld2で小さい順にされているクエリーから  fld3の値を取り出す。 と方針を少し変えてみました。 まぁ、軽くテストでもするかな。 ※下記失敗作です、動かないので注意。
Sub aaa()  '失敗作・・・SQL直接は記述できないのかなぁ?

    Dim data As String
    
    Dim strSQL As String
    
    'fld2の小さい順に並べたデータの集合がほしいので
    strSQL = "select * from TEST_TABLE order by fld2"

    '必要なデータfld3をstrSQLの集合から条件はfld='あ'で検索
    data = DLookup("fld3", strSQL, "fld1 = 'あ'")

    MsgBox data

End Sub
TEST_TABLE ID fld1 fld2 fld3 1 あ 2 a 2 あ 1 b 3 あ 4 c 4 い 5 a 5 い 6 b 6 い 4 c 7 い 10 d fldの小さい順に並べたデータがほしかったので、 select * from TEST_TABLE order by fld2 とオーダーして ID fld1 fld2 fld3 2 あ 1 b 1 あ 2 a 3 あ 4 c 6 い 4 c 4 い 5 a 5 い 6 b 7 い 10 d とキレイになったデータからDLookupしたかったので、 'fld2の小さい順に並べたデータの集合がほしいので strSQL = "select * from TEST_TABLE order by fld2" '必要なデータfld3をstrSQLの集合から条件はfld='あ'で検索 data = DLookup("fld3", strSQL, "fld1 = 'あ'") と書いてみたが、この書き方は、ダメなんだぁ、、 ↑実行時エラーの画面 しかたがない、ワンクッション置いたクエリーを作成するかな。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ↑fld2でソートしたクエリーの作成 で、そのクエリーを元にデータをチェックします。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 下記、Accessのフォームに貼ったコマンドボタンです。 txtA [ ___ ]に条件を入れてテスト。
Private Sub コマンド2_Click()

    Dim data As Variant

    '直接の値でやってたけど、フォームの値を利用して、
    data = DLookup("fld3", "Q_CHK", "fld1 = '" & Me![txtA] & "'")
    MsgBox "fld3=" & data

End Sub
普通に、 DLookup("取り出したい項目", "データ場所", "条件") を使用して、 DLookup("fld3", "Q_CHK", "fld1 = '" & Me![txtA] & "'") と関数を作りました。 フォームに条件""を入れて検索してみます。 ↑フォームから検索した結果 それにしてもなぜ? Dim data As Variant ~~~~~~~~~~~~~~~~~~~ えっとですね、 データが無いときに、""など見つからなかった時に、 Stringだと、Dlookupの戻り値がNULLなので、エラーが発生してしまうので。。。 ↑フォームから検索した結果 いつものかわしかたで、 Dim data As String '直接の値でやってたけど、フォームの値を利用して、 data = "" & DLookup("fld3", "Q_CHK", "fld1 = '" & Me![txtA] & "'") と ””&〜と強引に文字列にする、なんて逃げ方もあります。

/* * 3.DLookupでデータの存在チェック、そんな使用例 */

---- >質問なのですが… > >添付のファイルなのですが、移設依頼入力フォーム(メイン)内に、 >サブフォームとして照明番号・種別等を入れています。 >ここの照明番号を入力検索して、その照明が有るメインフォームを検索 >させるにはどうしたらよいのでしょうか? > >例えば、917−500という番号で検索したら、 >ID:5 のページが出てくるようなイメージなのですが。 > >ご教授のほど、よろしくお願い致します。m(__)m ---- 検索条件を入れるテキストボックスと検索実行のボタンを追加して、 入力された番号を条件に照明番号台帳サブからデータを読む(DLookup) ken3_番号 [ ________ ] とテキストボックスを作成 ken3_検索とコマンドボタンを追加。 データが無事に読めたかIsNullでチェック 読めたら、 DoCmd.GoToControl "ID" 'IDフィールドに入力コントロールを移動 DoCmd.FindRecord 探したID 'で該当レコードに移動って感じです。
Private Sub ken3_検索_Click()
    Dim 探したID
    Dim str検索条件 As String
    
    '検索条件を作成
    str検索条件 = "照明番号 = '" & Trim(Me![ken3_番号]) & "'"
    
    '該当するIDを照明番号台帳サブから検索する
    探したID = DLookup("ID", "照明番号台帳サブ", str検索条件)

    '検索がOKか判断する
    If IsNull(探したID) Then
        MsgBox "証明書番号" & Me![ken3_番号] & "は見つかりませんでした"
    Else
        'IDが見つかったら、レコードを移動させたい
        DoCmd.GoToControl "ID"     'IDフィールドに入力を移動
           '指定した条件のIDを探す
        DoCmd.FindRecord 探したID
    End If
End Sub
漢字の変数名使ったり、DoCmd.連発でプロぽくないけど、こんな感じです。 *英語が不得意ってバレてるからいっかな(笑) 検索?サーチ?スペルがわからないるFindもよくわからないけど、  記号として覚えてるようなもんかなぁ。  あっ、gotoとControl,Recordはなんとなくわかります私でも(笑) なんて言ってないで、考え方は、 人が普通に処理する時はどうするんだろう?と考えて、 テーブル照明番号台帳サブを見て、証明番号を探す、 で 見つかったらIDを覚える。 次は、IDが一致するデータを探す。 みたいな流れをプログラムで書くと、いろいろかける(だから難しいんだけど) 普通に、 DoCmd.GoToControl "ID" 'IDフィールドに入力コントロールを移動 DoCmd.FindRecord Me![ken3_番号] でもいいんだけど、該当なしデータの時、エラーが発生するので、 DLookupで、事前にテーブルやクエリーからデータを検索してみました。

/* * 5.終わりの挨拶 */

簡単な、Dlookupの使い方でした。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ※評価は↓で投票してね。感想は掲示板かメールでくださいね。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]