トップ回答者
ACCESSクエリを利用したRecordset(DAO)の再オープンが出来ない

質問
-
現在ACCESS2013で簡単な開発を行っています。
DAOのRecordsetにかけたフィルタを実行するため、Recordsetを再オープンしたいのですが、
そこでエラーが発生してしまいます。この件については Microsoftコミュニティで既に質問をポストしていますが、
十分な回答が得られなかったためこちらのMSDNフォーラムにて再質問させてください。
なお、MicrosoftコミュニティではADOについても聞いていますが、今回はDAOのみ質問します。[Microsoftコミュニティ] - ADO/DAOのRecordsetでクエリを開けない
http://answers.microsoft.com/ja-jp/office/forum/office_2013_release-access/adodao%e3%81%aerecordset%e3%81%a7%e3%82%af/2e062f5c-4130-4a80-a045-0102f891ea00
■質問下記のコードを実行すると最後の行で実行時エラーが発生します。
原因が分かりますでしょうか。
また、エラーで指摘されているオブジェクトが不明(空文字)なのですが、どのような現象なのでしょうか。//コード
Const strSQL As String = "Q_注文_直近"
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(strSQL)
rs.Filter = "注文日>" & Date - 7
Set rs = rs.OpenRecordset ' ←ここでエラー
//エラーダイアログ
「実行時エラー '3011':
オブジェクト '' が見つかりませんでした。オブジェクトが存在していること、名前やパス名が正しいことを確認してください。'' がローカル オブジェクトでない場合は、ネットワークの接続を確認するか、サーバー管理者に問い合わせてください。」
//補足
定数strSQLに代入した「Q_注文_直近」はクエリ名です。
→ クエリのSQL文 = "SELECT T_注文.* FROM T_注文;"
このSQL文を直接代入してもエラーは変わりません。
このクエリはSQL直打ちではなく、ACCESSのデザインビューで作成し、ACCESS上では問題無く開きます。
パラメータを含め、抽出条件はありません。フィールドの1つが複数値フィールドであるため疑いましたが、
クエリのフィールド指定でアスタリスク(ワイルドカード)をやめて、1つずつ全フィールドを指定した場合でもエラーは発生しません。
アスタリスクが問題なのでしょうか。(可能ならワイルドカードを利用したい)
rs.Filterプロパティを設定してもしなくてもエラーは発生します。宜しくお願いします。
- 編集済み junnny 2015年9月15日 11:29
回答
-
ご回答、ありがとうございました。
さて、私の方でAccess 2013を用いて簡単なテストを行ってみましたが、ご紹介されたリンク先のMicrosoft コミニュティでも書かれている通り、特にエラーは発生しませんでした。よって、何か特殊な条件下でエラーが発生するのかもしれません。
junnnyさんのところではエラーが発生しているとのことですから、エラーが発生するできるだけ最小のコードやテーブルなどの環境を示していただけたらと思います。ひょっとするとその過程で何かに気づかれるかもしれません。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク junnny 2015年9月24日 10:24
-
さて、私の方でAccess 2013を用いて簡単なテストを行ってみましたが、ご紹介されたリンク先のMicrosoft コミニュティでも書かれている通り、特にエラーは発生しませんでした。よって、何か特殊な条件下でエラーが発生するのかもしれません。
テストしていただきありがとうございます。
ファイルの新規作成、最小のコードだと開くのですが、本番環境が複雑で再構築まで手が回りませんでした。折角回答をいただいているのにすみません。ただ、気付いたらエラー無く再オープンできる様になっていました。
変えた所は最初のRecordsetのオープンをQueryDefオブジェクトで行ったこと。Set rs = CurrentDb.OpenRecordset(strSQL)
↓上の1行を下の2行に置き換え。
Set qdf = CurrentDb.QueryDefs(strSQL)
Set rs = qdf.OpenRecordset(dbOpenSnapshot)
その後「フィルタ設定」「再オープン」を行ってもエラーは出ず。
因果関係は不明ですが、一応回避出来ました。
雑な終わり方ですみませんが、お付き合いいただき本当に感謝します。- 回答としてマーク junnny 2015年9月24日 10:25
すべての返信
-
フィールドの1つが複数値フィールドであるため疑いましたが、
クエリのフィールド指定でアスタリスク(ワイルドカード)をやめて、1つずつ全フィールドを指定した場合でもエラーは発生しません。
アスタリスクが問題なのでしょうか。(可能ならワイルドカードを利用したい)確認させて下さい。ワイルドカードを止めた場合は、エラーが発生せずに正常に動作するという状況でしょうか?
また、「オブジェクト '' が見つかりませんでした」ということですので、ひょとするとどこかに全角のスペースが入っているとか、そういうことはないでしょうか?
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
-
返信ありがとうございます。
確認させて下さい。ワイルドカードを止めた場合は、エラーが発生せずに正常に動作するという状況でしょうか?
また、「オブジェクト '' が見つかりませんでした」ということですので、ひょとするとどこかに全角のスペースが入っているとか、そういうことはないでしょうか?
1つ目の質問はその通りです。
クエリのフィールド指定(SELECT句)でACCESSのワイルドカードであるアスタリスクを使用せず、フィールド名を一つずつ指定した場合、エラー無くクエリを開く(データシートビューでレコードを表示する)ことができます。2つ目の質問の、全角スペースがどこかに、とは、SQL文とかフィールド名に、でしょうか?
少なくともSQL文をメモ帳にコピペして検索してもヒットはしませんでした。あるいはコード側の、エラーになるOpenRecordsetメソッドの後ろに、でしょうか?
こちらも余計なスペース文字はありません。後ろにカッコをつけて「rs.OpenRecordset()」としても同様です。クエリの設定(SQL文)に対する変更で結果に差が生じたため、クエリ側の問題かと思ってましたが、そうでない可能性もあるのでしょうか。
-
ご回答、ありがとうございました。
さて、私の方でAccess 2013を用いて簡単なテストを行ってみましたが、ご紹介されたリンク先のMicrosoft コミニュティでも書かれている通り、特にエラーは発生しませんでした。よって、何か特殊な条件下でエラーが発生するのかもしれません。
junnnyさんのところではエラーが発生しているとのことですから、エラーが発生するできるだけ最小のコードやテーブルなどの環境を示していただけたらと思います。ひょっとするとその過程で何かに気づかれるかもしれません。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク junnny 2015年9月24日 10:24
-
さて、私の方でAccess 2013を用いて簡単なテストを行ってみましたが、ご紹介されたリンク先のMicrosoft コミニュティでも書かれている通り、特にエラーは発生しませんでした。よって、何か特殊な条件下でエラーが発生するのかもしれません。
テストしていただきありがとうございます。
ファイルの新規作成、最小のコードだと開くのですが、本番環境が複雑で再構築まで手が回りませんでした。折角回答をいただいているのにすみません。ただ、気付いたらエラー無く再オープンできる様になっていました。
変えた所は最初のRecordsetのオープンをQueryDefオブジェクトで行ったこと。Set rs = CurrentDb.OpenRecordset(strSQL)
↓上の1行を下の2行に置き換え。
Set qdf = CurrentDb.QueryDefs(strSQL)
Set rs = qdf.OpenRecordset(dbOpenSnapshot)
その後「フィルタ設定」「再オープン」を行ってもエラーは出ず。
因果関係は不明ですが、一応回避出来ました。
雑な終わり方ですみませんが、お付き合いいただき本当に感謝します。- 回答としてマーク junnny 2015年9月24日 10:25