• ベストアンサー

Excel TimeValueをしようしたループマクロの待機中のCPU開放について教えて頂けませんでしょうか?

質問1: 10秒間隔で”解析1”のマクロを実行する下記のPrgですと待機の10秒間 ビジーになってしまいます。解決方法ご存知の方教えて下さい。 Sub 解析1実行用ループマクロ() Do 指定時刻 = Now + TimeValue("0時00分10秒") '10秒後 待ち時間 = TimeValue("0時00分05秒") Application.OnTime TimeValue(指定時刻), "解析1", TimeValue(待ち時間) Loop End Sub  (マクロ集引用しただけで理解はあまりできていません。) 質問2: ループを終了させるのにEscで終わらせています。Escをボタンに登録しようと思ってますが他にスマートな方法有りますでしょうか?

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 >Wendy02さん助言の +待ち時間 の件ですが まだうまく機能していません。 というか、マクロ自体が違っていませんか? 私は、うっかりしていたけれども、そのマクロでは、数限りなく設定したら、終われないです。あくまでも、私の考える方法ではありませんが、OnTime のループは以下のようにするのではないでしょうかしらね。 'こちらは、必ず標準モジュールです。 Public flg As Boolean Sub 実行用ループマクロ() Dim 指定時刻 As Date Dim 待ち時間 As Date 指定時刻 = Now + TimeValue("0時00分10秒") '10秒後 待ち時間 = 指定時刻 + TimeValue("0時00分05秒")  If flg = True Then Exit Sub  Application.OnTime TimeValue(指定時刻), "実行用ループマクロ", TimeValue(待ち時間)  Call 解析1 End Sub 本来は、ボタンにしたほうがよいです。 以下は、トグルになっています。スタートを押すと、次は、ストップになります。 Sub StartMacro() 'スタート・終了ボタン  flg = Not flg  If flg = False Then    Call 実行用ループマクロ  Else    MsgBox "終了しました", 64  End If End Sub

39verymach
質問者

お礼

すみません有り難うございます。遅世代cpuで一生懸命 思考試行 してみます。(PCはまともなんですが)とりあえずお礼を。

39verymach
質問者

補足

大大大成功です!終了もEscで逃げていたんですがスマートに終了できるようになりました。(理解できてない点が悲しいですが…  勉強します。)ポップアップされる終了ボタンは待機時間(10秒)内に押すと マクロが再起動してしまいますが 商品ではないので 全く問題ないです。有り難うございました。助かりました。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。 うまく行ってよかったです。本当は、まったく違う方法を考えていたのです。ただ、単に、RSSだけではないとなると、現在の方法が良いのかもしれません。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 #2 の回答者です。一応、今回は、「経験者」ということにさせていただきます。 >2~3秒間隔ぐらいのRSS入力detaを使用しています。 やっぱりそうですか。とりあえず、ちょっと様子を見させていただいてよいですか? もし、現行で、可能なら、あえて私の考えた方法は必要ありません。 私としては、元の「解析1」のマクロが気になります。2~3秒では、かなり忙しいですね。 いろんなサイクルでおっしゃる人がいます。1~2分だという人もいました。 あまり短いと、その実行マクロ側の内容によっては、場合によって、マクロが画面の変化に影響を受ける可能性があるのと、もうひとつは、RSSも一種のマクロなので、割り込みされてしまうかもしれません。本来、RSSでデータが入ってくるときに、マクロが動いていれば、どちらかがとまるはずだと思っています。 それは、新しいバージョンの、RSS ですよね。私は、そちらに加入していないのですが、一応、前の版は、前のパソコンにインストールしてあります。今年になってから、バージョンが上がって、OLEになったような気がします。 それは、本来、OnTime ではなく、イベント方式のほうが良いのですが、実際に、今のバージョンで試したわけではないので、あまり自信があって書いているわけではありません。数ヶ月前の人は、私の考えた方法で、"問題なし"とおっしゃっていたいています。それは、そのマクロ止める方法も同時に可能です。

39verymach
質問者

お礼

こんばんは お世話になります。 最終目的は社内のサーバーに集まってくるdata処理を思考したいと思っているのですが 今は楽天証券のRSSdata を利用してテストしています。数秒間隔(言葉上はリアルタイム)でメインの同一シート内のdataが順次書き換えられていきます。(同時に別の処理もしていますがフリーズとかは発生していません。)定期的(ここでは10秒ごと)にフィルーターで抽出し、dataを比較等処理しようとしています。これをマクロ化したいのですが いろいろと難問にぶつかって…。 AnsNo1 zap35 さん助言の DoEvents は現状のマクロを停止して 次のマクロ(など)を処理する場合のようなので 別のところで使わせていただきます。(Functionの警告の件解決できました。)有り難うございました。 AnsNo2 Wendy02さん助言の +待ち時間 の件ですが まだうまく機能していません。もう少し試させて下さい。 (前列で定義された指定時刻の内容が( )内に代入されると思っていたのですが。)バックバージョン探して読んでみます。 (苦しんでた不起動はマクロ内のカーソルで指定する位置がずれて処理できないところがわかったので解決しました。) 皆さん有り難うございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 ご質問の趣旨とは違いますが、 待ち時間 = TimeValue("0時00分05秒") とありますが、OnTime で、待ち時間が入れられましたでしょうか? (指定時刻 +待ち時間) を入れるように思います。 以前も、同じようなコード見たことがありますが、その「解析1」プロージャーの解析に対応するデータは、10秒後に変わるという意味ですね。そのデータは、どのように入るのですか?DoEvent で成功すればよいのですが、そうでないとすると、そのデータの入り自体を調べたほうがよいと思います。ExcelのワークシートはRSSのアドインやDDEインポートではありませんか? もし、そうなら、今の状態では、かなり難しいように思います。

39verymach
質問者

お礼

助言ありがとうございます。何も入れずにコピーのまま使ってます。2~3秒間隔ぐらいのRSS入力detaを使用しています。 (マクロの再登録何度もトライしてたら「RangのSortメソッドが失敗」?とかでボタン起動ができなくなり苦しんでます。)解決したら追記してみます。ありがとうございます。 

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

Sub Auto_open()  Call 解析1 End Sub Sub 解析1() '解析処理 ' 解析処理を記述  指定時刻 = Now + TimeValue("0時00分10秒") '10秒後 待ち時間 = TimeValue("0時00分05秒") Application.OnTime TimeValue(指定時刻), 解析1, TimeValue(待ち時間) DoEvents End Sub

39verymach
質問者

お礼

真夜中にもかかわらず誠に有難うございます。さっそくトライしてみます。 取り急ぎ まずはお礼まで。

39verymach
質問者

補足

すみません教えて頂けませんか? prgコピー してトライしてますが 解析1 内末部に 追記入した「Application.OnTime TimeValue(指定時刻), 解析1, TimeValue(待ち時間)」行の 、解析1、のところにカーソルが点灯して 「Function又は変数が必要です」と警告がでます。記入間違いないか 他のprg 名に置き換えとか試行してるのですが 同じ結果です。お時間有る時で結構ですので 助言頂けたら有難いです。(Auto_openと解析1のマクロ名は内容によって変更してます。登録済みの名称を使用しています)