メインフォーム上にサブフォームコントロールを貼り、
メインフォーム上のコマンドボタンクリック時に、
外部データをテーブルに取得し、そのテーブルを元にした
クエリ(Qry_xyz")をサブフォームコントロールの
レコードソース(連結)に設定しています。
Me.subForm.Form.RecordSource = "select * from Qry_xyz"
データ取得は何度も繰り返すのですが、時々、稀にエラーが発生するので、
デバッグをしてみますと、上記のコードで止まっています。
このSQL(select * from Qry_xyz)をクエリのデザインで確認してみますと、
問題なくデータが表示されています。
エラーのある状態で、そのまま閉じ、フォームを開き直すとデータは正しく表示されます。
エラー内容:指定した式に、Recoo\rdSourceプロパティに対する正しくない参照が含まれます。
原因が全く分からずご相談させて頂きました。
よろしくお願いいたします。
この処理の影響もありそうですが、
まずは、VBAでレコードソースを変更するのは避けて、フォームのデザインビューでレコードソースプロパティにクエリ名を設定しておいて、VBAでは再クエリするだけにした方が安定しそうです。
あと、外部データをテーブルに取得した後に少し、待機してから再クエリするといいかもしれません。
VBAで指定した秒数だけ処理を止める方法【Sleep関数(API)】|CATIAマクロの作成方法 | LiCLOG
どうもありがとうございます。
アドバイスをいただきまして、私の説明が足りなかったと感じた部分もあり、また、今後の対応の方向性が少し見えたこともありましたので、コメントさせていただきます。
1点目ですが、少し補足させていただくと、デザインビューでレコレードソースにはクエリを物理的に設定はしています。
データ取得後、なんでレコレードソースを
再設定してるかというと、メインフォームのヘッダにザブフォームのレコードを抽出するためのテキストボックス、コンボボックス等が十数個あり、それぞれの更新後処理から、レコードソースのwhere条件を生成してレコレードソースを設定するfunctionプロシージャを呼び出しています。
このヘッダの抽出条件を設定するコントロールのいくつかにはデフォルト値が設定しているため、データ読み込み後、この条件でデータを更新したいため、前述のfunctionプロシージャを呼び出してもいて、この時のエラーになっています。
データ取得後なら更新と、ユーザーが抽出条件を与えての更新で処理を分けてみるとかも検討してみたいです。
そして、このクエリ自体も少し重いものなので、2点目でアドバイスいただきましたように、待機処理をいれてみようと思います。
奇しくも、この投稿をしてから十数回この処理を繰り返し行っていますが、エラーは1回も出ていません。