- ベストアンサー
VBAマクロの操作エラーについて
- VBAマクロを実行中に、オブジェクトが開かれている場合は操作が許可されません。
- マクロの中断中に、オブジェクトを閉じてから再度オープンしてもエラーが発生します。
- エラーが発生した場合でも、マクロを停止せずにコードを修正して続行する方法があります。
- みんなの回答 (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 を繰り返す必要がある、 ということでしたら、詳しい説明と共に、 新しい質問として立て直した方が、適切な回答が得られ易くなる と思います(その場合は、このスレを未解決のまま締切にしてください)。 以上です。
お礼
回答頂きありがとうございました。