メールで下記の質問をもらいました。
---------------
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] & "'")
と
””&〜と強引に文字列にする、なんて逃げ方もあります。
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