none
ACCESSクエリを利用したRecordset(DAO)の再オープンが出来ない RRS feed

  • 質問

  • 現在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
    2015年9月15日 11:23

回答

  • ご回答、ありがとうございました。

    さて、私の方でAccess 2013を用いて簡単なテストを行ってみましたが、ご紹介されたリンク先のMicrosoft コミニュティでも書かれている通り、特にエラーは発生しませんでした。よって、何か特殊な条件下でエラーが発生するのかもしれません。
    junnnyさんのところではエラーが発生しているとのことですから、エラーが発生するできるだけ最小のコードやテーブルなどの環境を示していただけたらと思います。ひょっとするとその過程で何かに気づかれるかもしれません。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク junnny 2015年9月24日 10:24
    2015年9月17日 2:34
    モデレータ
  • さて、私の方で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
    2015年9月24日 10:24

すべての返信

  • フィールドの1つが複数値フィールドであるため疑いましたが、
    クエリのフィールド指定でアスタリスク(ワイルドカード)をやめて、1つずつ全フィールドを指定した場合でもエラーは発生しません。
    アスタリスクが問題なのでしょうか。(可能ならワイルドカードを利用したい)

    確認させて下さい。ワイルドカードを止めた場合は、エラーが発生せずに正常に動作するという状況でしょうか?

    また、「オブジェクト '' が見つかりませんでした」ということですので、ひょとするとどこかに全角のスペースが入っているとか、そういうことはないでしょうか?


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年9月16日 2:57
    モデレータ
  • 返信ありがとうございます。

    確認させて下さい。ワイルドカードを止めた場合は、エラーが発生せずに正常に動作するという状況でしょうか?

    また、「オブジェクト '' が見つかりませんでした」ということですので、ひょとするとどこかに全角のスペースが入っているとか、そういうことはないでしょうか?

    1つ目の質問はその通りです。
    クエリのフィールド指定(SELECT句)でACCESSのワイルドカードであるアスタリスクを使用せず、フィールド名を一つずつ指定した場合、エラー無くクエリを開く(データシートビューでレコードを表示する)ことができます。

    2つ目の質問の、全角スペースがどこかに、とは、SQL文とかフィールド名に、でしょうか?
    少なくともSQL文をメモ帳にコピペして検索してもヒットはしませんでした。

    あるいはコード側の、エラーになるOpenRecordsetメソッドの後ろに、でしょうか?
    こちらも余計なスペース文字はありません。後ろにカッコをつけて「rs.OpenRecordset()」としても同様です。

    クエリの設定(SQL文)に対する変更で結果に差が生じたため、クエリ側の問題かと思ってましたが、そうでない可能性もあるのでしょうか。

    2015年9月16日 14:27
  • ご回答、ありがとうございました。

    さて、私の方でAccess 2013を用いて簡単なテストを行ってみましたが、ご紹介されたリンク先のMicrosoft コミニュティでも書かれている通り、特にエラーは発生しませんでした。よって、何か特殊な条件下でエラーが発生するのかもしれません。
    junnnyさんのところではエラーが発生しているとのことですから、エラーが発生するできるだけ最小のコードやテーブルなどの環境を示していただけたらと思います。ひょっとするとその過程で何かに気づかれるかもしれません。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク junnny 2015年9月24日 10:24
    2015年9月17日 2:34
    モデレータ
  • さて、私の方で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
    2015年9月24日 10:24