• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:「オブジェクトが開いている場合は操作は許可され)

VBAマクロの操作エラーについて

このQ&Aのポイント
  • VBAマクロを実行中に、オブジェクトが開かれている場合は操作が許可されません。
  • マクロの中断中に、オブジェクトを閉じてから再度オープンしてもエラーが発生します。
  • エラーが発生した場合でも、マクロを停止せずにコードを修正して続行する方法があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんにちは。 VBAということですが、アプリケーションもバージョンが判りません。 rsというのも、ADODB ? の RecordSet ? のお話なのでしょうか、 そういう前提で、とりあえずお応えします。 >  rs.Open "SELECT * FROM T明細", cn, adOpenStatic, adLockOptimistic 見たところ、SQL(Source)は(その他の引数も)固定ですから、 この記述がループの内側で繰り返し実行される理由がよく解りません。 普通は   cn.Open "Provider=""hoge""" & _       ";Data Source=""piyo""" & _       ";Extended Properties=""fuga"""   rs.Open "SELECT * FROM T明細", cn, adOpenStatic, adLockOptimistic '  rs.MoveFirst   Do Until rs.EOF     Debug.Print rs.Fields(0), rs.Fields(1)     rs.MoveNext   Loop   rs.Close   cn.Close などのように、 【開いて】 【ループで読込んで】 【閉じる】 という一連の流れで書ける内容のようにも思えますし、 場合によっては、   ...   rs.Open "SELECT * FROM T明細", cn, adOpenStatic, adLockOptimistic   配列変数() = rs.GetRows   rs.Close   ... のように配列変数に格納するだけで、RecordSetの役割は終る ようなケースもあるでしょう。 何れにしても、   開いていない状態から  【開いて】     【読み込み処理して】   開いている状態で  【閉じる】 という順番だけは守らないと、何をやってもエラーになります。 今回ご指摘の問題は、  rs.Open したまま rs.Close せずに rs.Open するから   開いている状態で  【開いて】 → エラー  rs.Open する前に rs.Close するから   開いていない状態から  【閉じる】 → エラー という処理をした結果の実行時エラーですね。 >  rs.Open "SELECT * FROM T明細", cn, adOpenStatic, adLockOptimistic を、ループの中に書くのなら(必要なのか判りませんが)、   cn.Open "Provider=""hoge""" & _       ";Data Source=""piyo""" & _       ";Extended Properties=""fuga"""   Do     rs.Open "SELECT * FROM T明細", cn, adOpenStatic, adLockOptimistic    ↓     ' 読み込み処理    ↓     rs.Close    ↓   Loop   cn.Close のような流れになるように書換えてみて下さい。 一応、   rs.MoveNext とか、   rs.MoveFirst とか、 カーソルを移動させながら処理を繰り返すことはあるでしょうけれど、 この場合は、やはり rs.Open と rs.Close を繰り返す必要は無いですね。 ここまで、パッと見で考えられる対策をお応えしましたが、もしも、 ご説明に書かれていない事情が何かしらあって rs.Open を繰り返す必要がある、 ということでしたら、詳しい説明と共に、 新しい質問として立て直した方が、適切な回答が得られ易くなる と思います(その場合は、このスレを未解決のまま締切にしてください)。 以上です。

LNXDRYOPEJ
質問者

お礼

回答頂きありがとうございました。

関連するQ&A