- ベストアンサー
VBAでのOLE操作の完了を待ち続ける方法
- VBAを使ってHFSSというソフトウェアを外部制御しようとしています。ソフトウェアの起動や終了、図形の形状編集、ファイル出力などは問題なく動作しますが、重たい処理を行うと「別のプログラムでOLEの操作が完了するまで待機を続けます」というエラーメッセージが表示され、処理が停止してしまいます。
- エラーメッセージが表示されたら自動でOKボタンをクリックするか、エラーメッセージを無視する方法があります。エラーメッセージが表示された場合に自動でOKボタンをクリックするには、タイマーを使用して一定時間ごとにOKボタンをクリックする処理を行えばよいです。また、エラーメッセージを無視するには、On Error Resume Nextステートメントを使用することでエラーが発生しても処理を続行することができます。
- 重たい処理が終了した後に手動で「OK」ボタンをクリックすることで次の処理に進めるため、自動化するための方法があります。タイマーを使用して一定時間ごとに「OK」ボタンをクリックする方法や、エラーメッセージを無視する方法で処理を続行することができます。これにより、VBA側で「別のプログラムでOLEの操作が完了するまで待機を続けます」というエラーメッセージに対処することができます。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 話は簡単なのですが、解決は難しいです。 >「別のプログラムでOLEの操作が完了するまで待機を続けます。」 私の方も同様の問題でしたが、IE のアドオンのActiveX なので、私の状況とは違うようです。 本来は、マクロを使用するときに、OLEプログラムを外して動かせばよいのですが、たぶん、HFSS自体が、OLEで、Excelに繋がっているのでしょうね。 今回の原因は、OLE側の本体のソフトが終了する前に、マクロが終わろうとしてしまうということが原因です。それで、良くコードをごらんになって、「ソフトの起動&終了や図形の形状編集、各種形式のファイル出力」の、それぞれの作業の終わり目があるはすでず。その終わり目の前に、Wait を入れればよいのではないかと思います。 Application.Wait でも良いのですが、 負担の少ないAPIの Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'モジュールの最上に書く で、適当の待ち時間を入れてあげればよいのではないか、と思います。 Call Sleep 1000 '1000/1000秒...1秒 状況からすると、1秒以上は掛かると思いますが……。 それから、 Application.ScreenUpdating = False 'や Application.Calculation = xlCalculationManual '(<--> = xlCalculationAutomatic) この二つぐらいが、効をそうするのではないかと思います。 また、On Error Resume Next などの、エラートラップは、あくまでも、VBA の内部の問題ですから、トラップには掛かりません。
お礼
ご回答頂きどうもありがとうございます。 WaitやApplication.ScreenUpdating = False、Application.Calculation = xlCalculationManualを全て試してみましたがダメでした。 しかし、頂いたアドバイスを元に、VBAで全てを操作する事を諦め、VBAを使っていったん複数のVBSを作っておいた上で、Shellを使ってそれぞれをMSDOS経由でVBSを実行させてみた所、意図した通りの動作をさせる事が出来ました。本当にどうもありがとうございました。