[三流君] −−>
[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でした。
※評価は↓で投票してね。感想は掲示板かメールでくださいね。
フィードバック
VBA系の→[掲示板]←を覗く、質問を書き込む
評価・感想
ページフッター(リンクや広告など)
[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます
広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列
情報を探す
情報を探すならGoogleかな?
↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
書籍の購入
Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??
コンピュータ書籍の発送がハヤイ専門店
コンピュータの本・専門店
|
※種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり
|
amazon.co.jpでキーワード別チェック
下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・