VBAでのOLE操作の完了を待ち続ける方法

このQ&Aのポイント
  • VBAを使ってHFSSというソフトウェアを外部制御しようとしています。ソフトウェアの起動や終了、図形の形状編集、ファイル出力などは問題なく動作しますが、重たい処理を行うと「別のプログラムでOLEの操作が完了するまで待機を続けます」というエラーメッセージが表示され、処理が停止してしまいます。
  • エラーメッセージが表示されたら自動でOKボタンをクリックするか、エラーメッセージを無視する方法があります。エラーメッセージが表示された場合に自動でOKボタンをクリックするには、タイマーを使用して一定時間ごとにOKボタンをクリックする処理を行えばよいです。また、エラーメッセージを無視するには、On Error Resume Nextステートメントを使用することでエラーが発生しても処理を続行することができます。
  • 重たい処理が終了した後に手動で「OK」ボタンをクリックすることで次の処理に進めるため、自動化するための方法があります。タイマーを使用して一定時間ごとに「OK」ボタンをクリックする方法や、エラーメッセージを無視する方法で処理を続行することができます。これにより、VBA側で「別のプログラムでOLEの操作が完了するまで待機を続けます」というエラーメッセージに対処することができます。
回答を見る
  • ベストアンサー

VBA「別のプログラムでOLEの操作が完了するまで待機を続けます。」

VBAを使ってHFSSというソフトウェアを外部制御したいと考えています。 そのソフトの起動&終了や図形の形状編集、各種形式のファイル出力といった軽い操作は難なく動作させる事が出来るのですが、数GBのメモリを使用するような重たい処理をさせたりすると「別のプログラムでOLEの操作が完了するまで待機を続けます。」といったメッセージがVBA側に表示される事があり、その時点でFor文が途中で止まってしまい困っています。どうすればよろしいでしょうか? なお、そのソフトウェア側で重たい処理が終了したのちに手動で「OK」ボタンをクリックすると次の処理へ進ませる事は出来ます。ですので、上記エラーメッセージが表示されたら自動でOKを選択したり、On Error Resume Nextのような感じでエラーメッセージを無視出来るだけでも結構です。

  • VAN613
  • お礼率82% (141/170)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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 の内部の問題ですから、トラップには掛かりません。

VAN613
質問者

お礼

ご回答頂きどうもありがとうございます。 WaitやApplication.ScreenUpdating = False、Application.Calculation = xlCalculationManualを全て試してみましたがダメでした。 しかし、頂いたアドバイスを元に、VBAで全てを操作する事を諦め、VBAを使っていったん複数のVBSを作っておいた上で、Shellを使ってそれぞれをMSDOS経由でVBSを実行させてみた所、意図した通りの動作をさせる事が出来ました。本当にどうもありがとうございました。

関連するQ&A

  • 別のプログラムでのOLEの操作が完了するまで待機し

    エクセルvbaで他のファイルを開こうとすると 「別のプログラムでのOLEの操作が完了するまで待機します」 と出て、いつまでたっても開けません。 中止やキャンセルボタンがない為、 無限ループに陥ります。 こういう場合、どうすればvbaの中断ができるのでしょうか? 開こうとしているファイルは既に開いているわけではありません。 手作業で開くと開けます。

  • 別のプログラムでのOLEの操作が完了するまで待機

    Excel 2016 で作った表をコピーしてWordで型式を選択して貼り付けを行い完成したので保存終了しています。 もとのExcel一部変更し終了しようとしたら、「別のプログラムでのOLEの操作が完了するまで待機します」のメーセージがでて画面が動かず終了できません。 どうしたら良いのでしょうか。

  • 昨日から「別のプログラムでOLEの操作が完了するまで待機を続けます」と

    昨日から「別のプログラムでOLEの操作が完了するまで待機を続けます」というメッセージが消えません。 メールに添付されていたファイルを開こうとしたところ、上記のようなメッセージが出ましたが、いつまでたっても終わらず、おまけに消せません。 また、待機状態に入っているためかネットはできるのですが、他のファイルは開くことも出来ないため仕事にならずとても困っています。 この操作を中止したいのですがOLEの説明はあってもキャンセルの仕方が探せません。 どなたか至急教えていただけませんか?よろしくお願いします。

  • 別のプログラムでのOLEの操作が完了するまで待

    エクセルvbaで作業をしていたら 「別のプログラムでのOLEの操作が完了するまで待機します」 と出てフリーズするのですが、何が起きてるのでしょうか? 原因を教えてください。 オフィス2010です。

  • 起動プログラムを操作したい

    コマンドプロンプトでもPowerShellでもいいのですが、例えばメモ帳を起動させて、そのメモ帳が起動したあと最大化させ、数秒待機してから最小化させる、という動きはできるものでしょうか? 起動時に説明文を表示して数秒後に自動で最小化させるようなイメージです。 表示されているウィンドウはメモ帳だけではない場合でも指定したメモ帳だけを対象に処理を行いたいです。 ソフトウェアの導入は極力さけたいところです。よいやり方はないでしょうか。

  • VBAでIE操作メニュー選択完了まで待機したい

    VBAでIE操作メニュー選択完了まで待機したい ●経緯: VBAを利用し、IEを操作するマクロを組んでいますが、下記の部分で処理が終わるまで待つ方法がわかりません。 IEで、あるWebサイト内にある複数のプルダウンメニューを順に選択して行きますが、このプルダウンメニューはそれぞれ順番に入力していかないと入力できないタイプの物です。 説明がわかりにくいかもしれませんが、下記のような3つのメニューがあり、MenuName1は最初から選択可能な状態。 MenuName2と3はグレーアウトしており選択できないが、MenuName1を選択するとMenuName2が選択可能になり、MenuName2を選択するとMenuName3がそれぞれ選択可能になります。  MenuName1 → 選択可能  MenuName2 → グレーアウト  MenuName3 → グレーアウト 該当のプルダウンメニュー部分のWebソースは後述しますが、上記各メニューを選択後、 fireEvent ("onchange") を実行し、そのまますぐに次のメニューを選択しようとすると、Web側の処理が追いつかずにエラーになってしまいます。 現状、下記のように無理やり一定時間待機させてから次のメニュー選択に移っていますが、他にメニューのグレーアウトが終わるまで待つ方法はありませんでしょうか? While Now < DateAdd("s", second, Now) DoEvents Wend ●HTMLソース: それぞれ、該当メニュー部分のコードは下記のとおりです。 ・アクティブになっているプルダウンメニュー <select name="MenuName1" onchange="javascript:setTimeout('__doPostBack(\'MenuName1\' ,\'\')', 0)" id="MenuName1" style="width:110px;"> ・非アクティブのプルダウンメニュー <select name="MenuName2" onchange="javascript:setTimeout('__doPostBack(\'MenuName2\' ,\'\')', 0)" id="MenuName2" disabled="disabled" style="width:110px;"> ●試したこと: 1) Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop で、一番最初のWebページ読み込み完了まで待つことはできますが、該当 プルダウンメニューの選択完了を待つことはできませんでした。 2) Do ~~~ DoEvents Loop 上記コードをMenuName2、3の実行直前にいろいろ試してみましたが、どうにもうまくいきません。 それぞれ下記のような条件文で記載しましたが、記載のとおりの失敗でした。 2-1) Do While InStr(objIE.Document.getElementById("MenuName2").outerHTML, "disabled") > 0 →「書き込みできません」 2-2) Do Until IsNull(objIE.Document.getElementById("MenuName2").disabled) →無限ループ?ここで止まる 2-3) Do While objIE.Document.getElementById("MenuName2").disabled = True →「オブジェクト変数またはwithブロック変数が設定されていません」 2-4) Obj1 = objIE.Document.getElementById("MenuName2").disabled Do Until Obj1 Is Nothing →「オブジェクトが必要です」 ※Obj1はVariant型で宣言 しかも上記、それぞれ何度も繰り返しているうちに、タイミングの問題なのかたまに成功したりします。 さらに、Debug.Print等で各条件文入れてみると、ちゃんと条件結果の値が出てくるので、ますますうまくいかない理由がわかりません。 本件、各プルダウンメニューのグレーアウトが解除されるまで待つ方法を教えてください。 ※書き込みには上記(↑)に対する回答を含めてください。 ※該当WebサイトのHTMLソース、マクロの全文は長いので抜粋にて記載しています。  不足がある場合は該当部分を探してきますので、どの部分が必要か補足してください。 ※該当Webサイトは関係者専用のため、URLは公開できません。 ※該当Webサイトは委託先に発注しているもので、Web側の改変は不可能です。 ※「検索したけど解決法はありませんでした」と言う旨の回答はご遠慮願います。 ※書き込みは他のユーザーの迷惑にならないようにお願いいたします。

  • Access2003 メモリ不足のためこの操作を完了できません

    Access2003で納品書入力フォームを作っています。昨日フォームに手書き入力する必要ができたため、元となるテーブルにフィールドを追加し、クエリにも追加しました。でフォームのレイアウトを変更し保存をしたらエラーがでました。詳しい語句は覚えていませんが(情けないですが・・・)ご不便をおかけして申し訳ありません。とこのエラーを送信する・送信しないのボタンがありました。 送信しないをクリックして、再度Accessを操作しようとフォームを開くと「メモリ不足のため、この操作を完了できません。不要なアプリケーションを終了し、再度実行してください」と表示されます。 フォーム以外は普通に開くことができます。 Access以外のアプリケーションは起動していません。再起動しても同じです。常駐ソフトも最低限にしました。 Backupファイルが出来上がっていたのですが、元のファイルからなら大丈夫かと思い、そちらでも同様にフォームを開こうとすると同じメッセージがでます。 すごくがんばって作ったので再度作り直すと思うと悲しいです。 Accessはあまり詳しくないので、VBAとかはわからないです。 WindowsXP メモリは512MB(ちょっと少なめです)です。 めちゃ困っています。泣きそうです。どなたかわかる方がみえましたらよろしくお願いします。

  • excel VBA ファイル操作 マクロ について

    excel VBA ファイル操作 マクロ についてです。 ファイルAを基本ファイルとし、ファイルBのマクロB1をファイルB上で実行させる方法はあるのでしょうか? (ファイルBのマクロB1をファイルA上で実行する方法はわかるのですが。。。) ファイルBを開いてB1を実行すれば問題ないのですが、ファイルがB~Zなど多数ある場合に、作業効率化したいのです。 その際ファイルBは開いても開かなくてもOKですが、ファイルB上に表示される実行結果は保存したいです。 その結果、エラーが出なければ「正常終了」、エラーが出れば「異常終了」などを、ファイルAに記録するものを作りたいのです。 どなたかご教授お願いいたします。

  • 特定のエクセルファイルが止まってしまう

    エクセルの特定のファイルを修正中に必ず「OLEの操作が完了するまで待機を続けます」というメッセージがでて、何回OKボタンを押しても先に進みません。 これはいったいどういう状況なのでしょうか? 改善する手段をご存知の方いらっしゃいましたら 教えてください。よろしくお願いします。

  • アプリケーション()の応答がないため、操作を完了で

    たまにですがアクセスvbaを実行中に 画像のような画面が出て、どうすることもできなくなるのですが どういう意味のエラー何でしょうか? 「アプリケーション()の応答がないため、操作を完了できません。 問題を解決するには、切り替えを選択して を起動してください。」 と書いてあります。 切り替えを押しても再試行を押しても何も変化ありません。 そもそも アプリケーション() とは、何を指しているのでしょうか? あと、「 を起動」となってますが、何を起動すればいいのでしょうか? 結局タスクマネージャーから 強制終了しています。

専門家に質問してみよう