• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAでdo内にてWAITを使うとエラーが出る)

VBAでdo内にてWAITを使うとエラーが出る

このQ&Aのポイント
  • VBAのdo内でWAITを使用すると、「コードの実行が中断されました」というエラーが発生します。
  • WAITを除外した場合は問題なくループが実行されますが、一度エラーが発生すると以降はループが実行されません。
  • 解決策をご存じの方は教えていただけるとありがたいです。

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

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

なるほど、スクレイピングですね。 >検索エンジン検索結果のスクレイピングです、 >間隔を空けないとスパムと判断されてしまうからです。 経験ないですね。ただ、純粋にマクロコードだけみて、判断したのですが、実際の場では、アクセスする以外は、Wait Now+時間 という方法は、しないものなのです。たぶん、VBA側だけだと、負担が大きいからだと思います。 検索エンジンの検索結果ですと、画面が変わりますから、その画面で判定するというわけにはいかなかったのですか?(といって、突っ込んでも、最近は、VB/VBAも離れていますので、Webのイベントを取得する方法は、思い出すまで時間がかかりそうです。確か、IE Objectイベントと呼んでいたのですが……) >単純に以下のコードを省く、あるいは " ' "を付けて無効にすれば >普通に5秒の間隔を空けずに正常に動作します。 >こういった状況でも他からの信号の影響ってあるのでしょうか? >Application.Wait DateAdd("s", 5, Now) それは、内部(稼働しているApplication)自体の問題ではないはずです。つまり、マクロではないとは思います。何が、そうさせているかは、たぶん、私自身が実際のコードを直すにあたってもかなり大変だと思います。ProcessMonitor辺りでログを取るにしても、一瞬のことですから、かなり探しだすのが困難だと思います。だから、Interactive プロパティについて触れました。 なぜ、私が止める方法を聞いたかというと、Interactiveを発行すると、特殊な方法以外は、マクロが完了するまでは、手動では止まらなくなるのです。私個人としては、こういう場合は、Do ~Loopともう一つ、Flgを立てておいて、時間で終わるような、安全に終了する仕掛けを作っておきます。もちろん、PCですから、最後はタスクマネージャーという手段もあります。   Application.Interactive = False   'マクロ・コード   Application.Interactive = True 5秒というのが、微妙なんですね。もう少し、間を空けるなら、いっそのこと、OnTimeでもいいのではないか、なんて思いました。これだと、完全に一旦離脱して、再び、アクセスします。

master817199
質問者

お礼

お返事遅くなりました。 アドバイス通りに色々と試行錯誤した結果ようやく正常に動くようになりました。 ご親切にどうもありがとうございました。

その他の回答 (2)

回答No.2

>調子の良いとき(?)には問題なく5秒まってさくさくloopしてくれますが、 >一度エラーが出ると一切loopしなくなります。 Loopしないなら、まあ安全かなって思いますが、そのままのコードで、Escキーを押すと、Wait が抜けて、無限ループになる可能性もあります。 そのコードって、それだけ切りだされて質問されても良く分からないです。 >「コードの実行が中断されました」というエラーが出て終了 これは、他からの信号を受け取って中断したということです。VBAにも、実行中に外部信号を遮断する(Interactive)プロパティはあるのですが、状況によっても変わると思います。 経験的には、そのコードのタイプで、5秒間隔ですと、OLEやDDEからの外部信号を受け取るものが多いです。 このマクロは、どうやって止めるのですか? 通常は、Waitの代わりに、Win32 APIのSleepを置くのが通例ですが、そうとは限らないような気がします。 このままでは、単に、私の想像の範囲を越えません。

master817199
質問者

補足

ご回答ありがとうございます 説明不足で申し訳ありません。 >これは、他からの信号を受け取って中断したということです。 単純に以下のコードを省く、あるいは " ' "を付けて無効にすれば 普通に5秒の間隔を空けずに正常に動作します。 こういった状況でも他からの信号の影響ってあるのでしょうか? Application.Wait DateAdd("s", 5, Now) お時間ありましたらこの件だけでもお返事いただければ幸いです。 >このマクロは、どうやって止めるのですか? 検索エンジンの検索結果をxmlhttpで取得を繰り返し、 指定した数を取得すれば止まります。 検索エンジン検索結果のスクレイピングです、 間隔を空けないとスパムと判断されてしまうからです。 >通常は、Waitの代わりに、Win32 APIのSleepを置くのが通例ですが、 実行してみようと思います。

  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.1

再現性に乏しいようですからあまりテストしていませんが、下記を見直したらなおりませんか。 ・ループ内の連続処理が溜まったりしてしまうのでしょうから DoEvents: DoEvents: DoEvents を入れてみたらどうでしょう。 ・時間にかかわる関数が同時に3つ使われているのも気になります。 Application.Wait DateAdd("s", 5, Now)

master817199
質問者

補足

ありがとうございます。 タイムスタンプを利用した暗号の生成(別ファイルを使用)などがありますので 全部のコードが載せられませんが、 帰ったらDoEvents試してみます、 これは Application.Wait DateAdd("s", 5, Now) のコードの真上にDoEventsを3回入力するという事ですよね? 初心者の質問で申し訳ありません。

関連するQ&A