プロが教える店舗&オフィスのセキュリティ対策術

Do until内の最後に以下のコードを記載しております。

-------------------------------------
Application.Wait DateAdd("s", 5, Now)

Loop
-------------------------------------

Loopさせる直前に5秒停止してもらいたいだけなのですが、
「コードの実行が中断されました」というエラーが出て終了してしまいます。

waitの指示を除いて時間待ち無しで実行すれば問題なくloopできます。


また、調子の良いとき(?)には問題なく5秒まってさくさくloopしてくれますが、
一度エラーが出ると一切loopしなくなります。


エラーの黄色いマーカーはこのLoopの部分に出ます。

なぜこのような現象が起こるのか全く理解できません、、、

以下のコードに変えても状況は同じです

With Application
.Wait Now + TimeValue("00:00:05")
End With


解決法ご存じの方、ご教示いただければ幸いです
よろしくお願いします。

A 回答 (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でもいいのではないか、なんて思いました。これだと、完全に一旦離脱して、再び、アクセスします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/11/05 12:06

>調子の良いとき(?)には問題なく5秒まってさくさくloopしてくれますが、


>一度エラーが出ると一切loopしなくなります。

Loopしないなら、まあ安全かなって思いますが、そのままのコードで、Escキーを押すと、Wait が抜けて、無限ループになる可能性もあります。

そのコードって、それだけ切りだされて質問されても良く分からないです。

>「コードの実行が中断されました」というエラーが出て終了
これは、他からの信号を受け取って中断したということです。VBAにも、実行中に外部信号を遮断する(Interactive)プロパティはあるのですが、状況によっても変わると思います。
経験的には、そのコードのタイプで、5秒間隔ですと、OLEやDDEからの外部信号を受け取るものが多いです。

このマクロは、どうやって止めるのですか?

通常は、Waitの代わりに、Win32 APIのSleepを置くのが通例ですが、そうとは限らないような気がします。

このままでは、単に、私の想像の範囲を越えません。

この回答への補足

ご回答ありがとうございます
説明不足で申し訳ありません。

>これは、他からの信号を受け取って中断したということです。

単純に以下のコードを省く、あるいは " ' "を付けて無効にすれば
普通に5秒の間隔を空けずに正常に動作します。
こういった状況でも他からの信号の影響ってあるのでしょうか?

Application.Wait DateAdd("s", 5, Now)

お時間ありましたらこの件だけでもお返事いただければ幸いです。


>このマクロは、どうやって止めるのですか?

検索エンジンの検索結果をxmlhttpで取得を繰り返し、
指定した数を取得すれば止まります。
検索エンジン検索結果のスクレイピングです、
間隔を空けないとスパムと判断されてしまうからです。


>通常は、Waitの代わりに、Win32 APIのSleepを置くのが通例ですが、

実行してみようと思います。

補足日時:2012/10/22 12:26
    • good
    • 0

再現性に乏しいようですからあまりテストしていませんが、下記を見直したらなおりませんか。



・ループ内の連続処理が溜まったりしてしまうのでしょうから
DoEvents: DoEvents: DoEvents
を入れてみたらどうでしょう。

・時間にかかわる関数が同時に3つ使われているのも気になります。
Application.Wait DateAdd("s", 5, Now)

この回答への補足

ありがとうございます。
タイムスタンプを利用した暗号の生成(別ファイルを使用)などがありますので
全部のコードが載せられませんが、

帰ったらDoEvents試してみます、

これは
Application.Wait DateAdd("s", 5, Now)
のコードの真上にDoEventsを3回入力するという事ですよね?

初心者の質問で申し訳ありません。

補足日時:2012/10/22 12:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!