プロが教えるわが家の防犯対策術!

DAOでテーブルの内容を検索したいのですが…
アクセス初心者です。
フォームで取得した値をテーブルで検索して命令するために,次のようなことをしてみましたが,FindFirstのところでエラーがでます。
どうしたらよいのかご指導ください。

コマンドボタンのイベントプロシージャで


Private Sub テストテーブル作成_Click()
Dim gakki As Integer
Dim test As Integer

Me.学期 = gakki
Me.テスト = test

Call testテーブル作成


End Sub


として,標準モジュールに

Sub testテーブル作成()


Dim myDB As DAO.Database
Dim myRS As DAO.Recordset

Set myDB = CurrentDb
Set myRS = myDB.OpenRecordset("T_生徒テスト")
myRS.FindFirst "学期ID=" & "" & "gakki" & "" & "AND テストID =" & "" & "test" & ""

If myRS.NoMatch = False Then
DoCmd.OpenQuery "Q_TSテストA"
DoCmd.OpenForm "F_テスト"
DoCmd.Close

Else

DoCmd.OpenQuery "Q_TSテスト"
DoCmd.OpenQuery "Q_テスト"
DoCmd.Close
DoCmd.OpenForm "F_テスト"

End If

myRS.Close: Set myRS = Nothing
myDB.Close: Set myDB = Nothing

End Sub

としました。よろしくお願いします。

A 回答 (8件)

F_テストではテキストボックスなどの名前は


あらかじめ設定してあるものとして、以下のように
変更してみてください。


>Forms(F_テスト).RecordSource = "Q_TSテストA"
>Forms(F_テスト).Visible = True



Forms!F_テスト.RecordSource = "Q_TSテストA"
Forms!F_テスト.Visible = True


>Forms(F_テスト).RecordSource = "TS_テスト"
>Forms(F_テスト).Visible = True



Forms!F_テスト.RecordSource = "TS_テスト"
Forms!F_テスト.Visible = True
    • good
    • 0
この回答へのお礼

ありがとうございます。うごきました。

お礼日時:2010/08/27 00:21

ELSE時のみで実行したいクエリは※箇所で記述というのでなく、フォームの閉じるときのアクションにて状態判断し実行、でできるのでは?、と思ってます。



構造ややこしくさせていれば逆効果なので、まず2フォームで作って動作確認し確実なものにしてから、レコードソース切替たりした1フォーム化での合併を考える方が修正作業が少ないように思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。その通りだと思います。その方向で考えてみます。

お礼日時:2010/08/27 18:30

質問を良く見たら、



>また,ELSEのときだけ,F_テストの閉じるときに,
>クエリを入れたいのですが…

は、

>elseのときだけF_テストのフォームを閉じるときに
>追加クエリを実行させたい

ということなのですね。

では閉じるときにRecordsourceにクエリを入れる
という解釈は読み間違いだということならば、
方法はやはり#6での回答のように閉じるボタンを
設定し、ElseのときのRecordsourceがTS_テスト
であることを確認して追加クエリを実行する、という
タイミングが一番わかりやすい、と思われます。
少し、確認してみます。

この回答への補足

ありがとうございます。
自分としてはNo.2の補足に書いたプログラムの

Else

DoCmd.OpenQuery "Q_TSテストB"
DoCmd.OpenQuery "Q_テスト"
DoCmd.OpenForm "F_テスト", , , , , acHidden

Forms(F_テスト).Visible = True
Else

DoCmd.OpenQuery "Q_TSテストB"
DoCmd.OpenQuery "Q_テスト"
DoCmd.OpenForm "F_テスト", , , , , acHidden
Forms(F_テスト).RecordSource = "TS_テスト"

Forms(F_テスト).Visible = True

End If

の※のところに「F_テストを閉じるときのイベントプロシージャに,Q_テストadd(追加クエリ)を行う」という命令をいれなさい。

というプログラムを入れればいいと思っていますが,どう書けばいいのかわかりません…

補足日時:2010/08/27 12:38
    • good
    • 0
この回答へのお礼

いろいろありがとうございました。
わかりにくいと思いますが,以下のようにしたことで解決しました。
本当にありがとうございました。
If myRS.NoMatch = False Then
DoCmd.OpenForm "F_テスト"

Else

DoCmd.OpenQuery "Q_TSテストB" '生徒全員が入った空のテーブルをつくる(学期ID,生徒ID,テストID入り)
DoCmd.OpenQuery "Q_テストadd" '空のテーブルをデーターテーブルに連結する
DoCmd.OpenForm "F_テスト" 'データテーブルからデータを読み込む

End If

お礼日時:2010/08/27 19:51

もし、一連の処理が


Private Sub テストテーブル作成_Click()
Dim gakki As Integer
Dim test As Integer

Me.学期 = gakki
Me.テスト = test

Call testテーブル作成

End Sub

を設定しているフォームを開いたままならば、
このフォームにF_テストを閉じるボタンを
くっつけてF_テストのレコードソースが
Elseの場合のTS_テストであるかを取り出して
コードを実行できるかもしれませんが。
まだ、確認していないので結論は後ほど、
というところです。
    • good
    • 0

質問の積み残しがありました。



>また,ELSEのときだけ,F_テストの閉じるときに,
>クエリを入れたいのですが…

どこかで、以下のコードを入れればいいのですが、

DoCmd.OpenForm "F_テスト", acDesign, , , , acHidden
Forms!F_テスト.RecordSource = "Qaaa"
DoCmd.Close acForm, "F_テスト", acSaveYes

フォームにボタンをくっつけてそのイベントで
試してみてください。

Private Sub ボタン_Click()
DoCmd.OpenForm "F_テスト", acDesign, , , , acHidden
Forms!F_テスト.RecordSource = "Qaaa"
DoCmd.Close acForm, "F_テスト", acSaveYes
End Sub

このような感じ。


ただ、これを入れると、F_テストのRecordsourceは
クエリ"Qaaa"で確定することになります。
もちろん、コードで必要に応じて実行時の
Recordsourceは変更できますから問題では
ないのですが。どうしても確定させておくことが
必要ですか。

ただ、これをどこで入れるかが問題のような感じです。
要望では「ELSEのときだけ,F_テストの閉じるときに」
の閉じる時の場合を設定しなければなりません。
Elseのときに閉じる場合にF_テストに引導を渡す
タイミングをどのように取り出すかが問題です。
つまり、いったんF_テストをデザインビューで
開く必要があるからです。こうしないといくら
ノーマルの状態でRecordsourceを設定しても
閉じてしまうとRecordsourceは元に戻ってしまうからです。

このあたりを検討してみてください。
変更はどこかで可能だと思いますが。
    • good
    • 0

似たような存在チェック質問がありますので、今後の参考


http://oshiete.goo.ne.jp/qa/2061114.html
Accessでのレコード存在チェック


>ただ,フォームのレコードソースが変わりません…
レコードソースを変えたのに表示内容が変わらない、でしょうか。
記述省略しているのかどうだかわかりませんが、
レコードソースを変えたあとには再クエリを実行してみてください。


>また,ELSEのときだけ,F_テストの閉じるときに,クエリを入れたいのですが…

同じフォームを開くけども条件が異なる。
ELSEのときだけの処理を追加したい、でしょうか。

F_テストの閉じるときに「If myRS.NoMatch = True 」と同意のIF条件を追加し判定できれば
THENのときは偽なのでスルーし、
ELSEのとき真なので処理されるかと思います。


件数カウント=0時
 "Q_TSテストA"のレコードソースで "F_テスト"を開く
 閉じるときで、「件数カウント>0時クエリ実行」としても何もしない
件数カウント>0時
 "TS_テスト"のレコードソースで "F_テスト"を開く
 閉じるときで、「件数カウント>0時クエリ実行」としたらクエリは実行される


実際にシュミレーション、確認まではしていませんので
参考レベルです。

この回答への補足

いつもありがとうございます。elseのときだけF_テストのフォームを閉じるときに追加クエリを実行させたいのですが,どうやって書けばよいのかわからないため,質問させていただきました。自分でも勉強しますので,時間があればよろしくお願いします。

補足日時:2010/08/27 00:29
    • good
    • 0

Set myRS = myDB.OpenRecordset("T_生徒テスト")





Set myRS = myDB.OpenRecordset("T_生徒テスト", dbOpenDynaset)

にしてみてください。

この回答への補足

ありがとうございます。
修正して以下のようにすればエラーはなくなりました。
ただ,フォームのレコードソースが変わりません…
また,ELSEのときだけ,F_テストの閉じるときに,クエリを入れたいのですが…
もしお時間があればご指導お願いします。

Sub testテーブル作成()
Dim myDB As DAO.Database
Dim myRS As DAO.Recordset
Dim gakki As Integer
Dim test As Integer

gakki = Forms![F_test]![学期]
test = Forms![F_test]![テスト]


Set myDB = CurrentDb
Set myRS = myDB.OpenRecordset("T_生徒テスト", dbOpenDynaset)
myRS.FindFirst "学期ID=" & "" & gakki & "" & "AND テストID =" & "" & test & ""

If myRS.NoMatch = False Then
DoCmd.OpenForm "F_テスト", , , , , acHidden
Forms(F_テスト).RecordSource = "Q_TSテストA"
Forms(F_テスト).Visible = True

Else

DoCmd.OpenQuery "Q_TSテストB"
DoCmd.OpenQuery "Q_テスト"
DoCmd.OpenForm "F_テスト", , , , , acHidden
Forms(F_テスト).RecordSource = "TS_テスト"
Forms(F_テスト).Visible = True


End If

myRS.Close: Set myRS = Nothing
myDB.Close: Set myDB = Nothing

End Sub

補足日時:2010/08/26 21:34
    • good
    • 0

クエリの妥当性はわかりませんが



OpenRecordSetでテーブル指定でなく求めたい条件のSQLを指定してはどうですか?。
SELECT * FROM 生徒テスト WHERE 学期ID~


それが1件でもあれば、ならDCOUNTで求めるだけでもよさそうです。
    • good
    • 0
この回答へのお礼

毎回いろいろと教えていただいてありがとうございます。勉強になります。

お礼日時:2010/08/26 21:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!