• ベストアンサー

エクセルVBAでタイマーコントロールは使えますか

エクセルVBAでタイマーコントロールは使えますか。 エクセルVBAで、ある時刻になったらマクロを実行させたいと思っています。 無限ループの中にTIME関数で時刻を呼び出し、それをIF文で判定して、 一定時刻にマクロを実行させるものは作りましたが、CPU負荷が高く、24時間 連続で動作させることに不安を感じています。 この他に、VBのタイマーコントロールのような機能を持つオブジェクトや 便利機能等があったら教えていただけませんか。 (一応、VBで時刻管理をするプログラムを作ってそこからエクセルVBAを呼 び出す方法やタスクスケジューラでエクセルVBAを呼び出す方法、ATコマンド 等も考えていますが、可能ならエクセルVBAで閉じて処理をしたい)。 尚、私はWindowsMe+エクセル2000でVBAを作成しています。 実際にVBAを動かすのは、WinsowNT4.0サーバー+エクセル2000を予定してい ます。

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

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

考え方としてですが ループとIFでのチェックではなく、 毎日一回、指定時刻に実行なら 1.初回は開始時に、現在時刻から逆算して 開始時間までの秒数を設定 2.次回からは、開始時刻がきた時、起動と同時に 次の開始時刻を計算してセット 処理したらwaitして次回を待つ。 という形にしてループとIFでの時刻監視を 一切やめてしまうことをおすすめします。 #1さんのものでも同じだと思いますが 書かれたコードを単独で実行した時には 負荷はそれほどではないと思います。 OnTimeメソッドのループは不要だと思います。 開始時刻をセット済みなので。 時刻をセットして、監視の処理(ループ) をはずす、という処理へ変更できませんか。 質問の内容と違っていましたらお手数ですが 質問ください。

kirokiro
質問者

補足

kenken0001さん、ありがとうございます。 kenken0001さんのおっしゃることは、 Dim i as Integer for i=1 to 365   ...           ’次回実施時刻の計算   ~OnTime~ 又は~Wait~ ’処理の実行   ... next という意味でしょうか。これなら、1年間は動き続けますね。この考え方は 思いつきませんでした。 それとも、~OnTime~ 又は~Wait~は、時刻設定をすると、ループでまわ さなくても何度でもステートメントを動作するのでしょうか。 もしまたここをご覧になって、私の解釈に間違いがあったら、教えていただ けませんでしょうか。 それから、やはりVBAでタイマーコントロールは使えないのでしょうか。

その他の回答 (4)

回答No.5

補足に書いていただいたものは その通りです。 365だと1年しか動きませんので カウンタiをリセットして いつまでもループする方が良いのではないでしょうか。 for i=1 to 2   ’次回実施時刻の計算・セット   ~OnTime~ 又は~Wait~ ’処理の実行   ... i=0 next 予定では、次回まではウェイト状態で 待っていて時間が来るとその度に動くと思います。 VBの知識が無いのでタイマーコントロールが 分かりません。 Private Sub Timer1_Timer() Label1.Caption = Time End Sub VBではこういう書き方があるようですが 個人的な理解ですが Excelは、オブジェクトである シートやフォームに対して イベントを設定する考え方なので タイマーというものが 無い(今は)のではないかと思います。 シートを開いた時や マクロがキックされた時など 実体のあるものだけで 時間を扱わない(扱えない) のでしょうか?? 便利そうな機能なので勉強になりました。 将来VBをやる時に使ってみます。 Excel97なので以降のバージョンでは あるのかもしれませんし わたしが知らないだけかもしれません。 不勉強のため、確かなことを書けず 申し訳ありません。 何か分かったら教えて下さい。 がんばって下さい。 ではでは。

kirokiro
質問者

お礼

takao_kwさん、kenken0001さん、ありがとうございました。 勉強になりました。 始めは、無限ループの中でIF文をつかって時刻判定をしていたので、 グルグルまわってしまい、CPUパワーをフルに使っていたようです。 ということで、~OnTime~ 又は~Wait~構文使用時の待ち時間中に どの位CPUパワーを使うかどうかは未確認ですが、皆さんから教えて いただいたことを解決の一方法として、検討してみます。

回答No.3

下のものでも結果は同じでしょうか。 待ち時間 = InputBox("待ち時間(秒)", "題名", "5") 開始 = TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 待ち時間) Application.Wait 開始 Nowで時刻を取得、開始時刻を秒単位で算定 で変更して使えませんか。

  • takao_kw
  • ベストアンサー率30% (14/46)
回答No.2

申し訳ありません。 私には、これ以上のことはわかりません。 お役に立てなくてごめんなさい。

  • takao_kw
  • ベストアンサー率30% (14/46)
回答No.1

下記は11時22分33秒に『時間です』と表示するモジュールです。 こういう意味でよろしいのですか? Sub DUMMY() 指定時刻 = TimeValue("11:22:33") Application.OnTime TimeValue(指定時刻), "DUMMY_MODULE" End Sub Sub DUMMY_MODULE() MsgBox "時間です" End Sub

kirokiro
質問者

補足

takao_kwさん、ご回答ありがとうございます。 エクセルVBAのOnTimeメソッドも試してみましたが、 これを実行すると、実行部分(プロシジャ)を実行するまで、 待機時間中はCPUがフル稼働します。 また、毎日一定時刻に決まったプロシジャを実行しようとすると、 OnTimeメソッドをループでまわす必要があります。本当は、VBの タイマーコントロールを使ってこの処理をしたかったのですが、 エクセルVBAにタイマーコントロールが見当たらなかったので、 ここで私は無限ループを使ったのですが、ここでもCPUがフル稼働 してしまいます。 このプログラムは24時間稼動のサーバーで実行させて、一定 時刻にデータベースからデータを抽出してデータ処理をさせる もので、サーバーは他のサービスも提供しているので、CPU負荷 をさげてVBAを実行させたいのです。他に手はありませんでしょうか。

関連するQ&A

  • Excel-VBAでタイマー処理

    お世話になります。 Excel-VBAでユーザフォームを操作したいのですが、VBの場合ツールボックスにタイマーコントロールがありますが、Excel-VBAの場合ツールボックスにタイマーコントロールがありません。 タイマー処理はどうしたら良いのでしょうか?

  • エクセル VBA タイマー 0:00:00で

    5分ピッチで 仕事させます。 ブックオープンで インターバル = TimeValue("00:05:00") Application.OnTime Format(開始時刻, "hh:mm:ss"), "orgdata.必要な作業を行うマクロ", 待ち時間 Debug.Print "st" & 開始時刻 Call timer_set 反復時刻 = 開始時刻 If Format(反復時刻, "hh:mm:ss") > "23:54:00" Then 反復時刻 = Format(DateAdd("d", 1, 反復時刻), "yyyy/mm/dd") & " " & TimeValue("0:00:10") Else 反復時刻 = Format(反復時刻, "yyyy/mm/dd") & " " & TimeValue(反復時刻) + インターバル End If ループで5回ほど Application.OnTime Format(反復時刻, "hh:mm:ss"), "orgdata.必要な作業を行うマクロ", 待ち時間 Debug.Print "loopexit" & 反復時刻 で、デバッグアウトが end 2013/08/15 3:02:00 st 2013/08/14 23:50:10 loop2013/08/14 23:55:10 loop2013/08/15 00:00:10 loop2013/08/15 00:05:10 loop2013/08/15 00:10:10 loopexit2013/08/15 00:15:10 makuro 2013/08/15 00:20:10 makuro 2013/08/15 00:25:10 makuro 2013/08/15 00:30:10 で、「必要な作業を行うマクロ」 で 仕事のあと タイマー追加します。 If Format(反復時刻, "hh:mm:ss") > "23:54:00" Then 反復時刻 = Format(DateAdd("d", 1, 反復時刻), "yyyy/mm/dd") & " " & TimeValue("0:00:10") Else 反復時刻 = Format(反復時刻, "yyyy/mm/dd") & " " & TimeValue(反復時刻) + インターバル ' End If Application.OnTime Format(反復時刻, "hh:mm:ss"), "必要な作業を行うマクロ", 待ち時間 (反復時刻を 時間だけの時 formatを 入れて・・・) Debug.Print "makuro " & 反復時刻 ’これが デバッグで出力されています。 で、ダミーの作業が clup = clup + 1 orgdata.Cells(clup, 10) = Format(Now, "yyyy/mm/dd") orgdata.Cells(clup, 11) = Format(Now, "hh:mm:ss") orgdata.Cells(clup, 12) = Format(反復時刻, "yyyy/mm/dd") orgdata.Cells(clup, 13) = Format(反復時刻, "hh:mm:ss") 結果 2013/8/14 23:50:10 2013/8/15 0:20:10 2013/8/14 23:55:10 2013/8/15 0:25:10 2013/8/15 0:00:10 2013/8/15 0:30:10 これで、タイマー作業が 途切れます。 0:00:00 超える事に 問題があるなら 0:00:10 は 実行されないハズ・・・・ 反復時刻は yyyy/mm/dd & ” ” & ”hh:mm:ss” です。 試しに 時刻だけでやっても 同じでした。 さて、如何でしょ? 実は これで、動いていたのですが、3日ほど前から 0:00以降 突然タイマーが動かなくなったのです PCは 3台 同じ現象です よって WINの設定では無い・ エクセル オプションに 何か設定でもあるのか?? どうも VBAのタイマーは不可解で エクセル終了させず、 プログラムだけ終了、再ロードだと、前のタイマー残ったまま、ダブルでタイマー動くとか・・・・ それと、WIN32とかの 別のタイマー使った方が 良いのでしょうか??

  • エクセルVBA コントロールのプロパティの変更

    エクセル2003でシート上に割り付けたラベルコントロールをVBAでCaptionプロパティで 変更するプログラムを作ってみました。(同じ様にボタンコントロールのCaptionプロパティに ついても作りました。) ステップ実行(F8)では、思ったとおり変更されますが、普通の実行(F5)では思ったとおり 変更されず、遅れて最後のコマンド分しか変更されませんでした。 *条件ループでセルのテキストを順番に読みコントロールのCaptionとして変更するプログラム  です。  なぜ出来ないのか分かりません。  原因又は、方法を教えていただけないでしょうか?    VBAでは、オブジェクト名に配列を使えないらしかったのでOLEObjects(コントロール?、  コレクション?)でオブジェクト名の配列のように使っています。  あまり、詳しくないので用語が間違っていたらすいません。  後、途中にインターバルタイマー入れたりして、動作確認しましたがやはりダメでした。

  • エクセル2007のVBAを使って、サウンドコントロールのフリーソフトを

    エクセル2007のVBAを使って、サウンドコントロールのフリーソフトを操作しようとしています。 具体的には、「3RVX]というフリーソフトで、パソコンの音量をミュートしたいのです。 このソフトは起動させるとタスクトレーに常駐して、自分で割り当てたホットキーを押すとミュート、ミュート解除ができます。私は「End」キーを割り当てたので、「End」キーを押すとミュートされます。これは他のソフトで動画を見ている最中でも動作しますし、今ここに質問を入力している間でも動作します。 問題は、これをエクセルのVBA(マクロ)で動作させたいのですが、上手くいかないのです。 マクロの記述は次の通りです。 Sub タイマー開始() MsgBox "タイマーがセットされました" SendKeys "{END}" End Sub メッセージボックスは表示されます。「OK」を押すと、次の命令である「SendKeys」が作動するはずなのですが、音声はミュートされません。 「End」キーの代わりに、「Delete」キーを割り当てて、マクロもSendKeys "{DELETE}"にしてみたところ、エクセル上でセルにあった文字が消えたので、「Delete」機能は作動しているのだと思います。ただ、エクセル内で作動してしまっているようです。 エクセルがアクティブであっても、手動で「End」キーを押せばミュートされるので、マクロでこれと同じ動作ができないものでしょうか? ※そもそも目的は、DVD再生している状態で、ある時刻になったら音を消したり出したりするタイマー機能を作りたいというものです。それが実現できれば、他の方法でも構いません。

  • ExcelVBAで、タイマー割り込みって使える?

    エクセルのVBAでインターバルタイマーによる定期的なマクロの起動を考えていますが、エクセルにはそのようなコマンドが見当たりません。 ループ処理をしても実現は可能だと思いますが、CPUの独占状態となると思うのですが、Accessのタイマー割り込みみたいなのってエクセルでは実現できないのでしょうか?よろしくお願いいたします

  • VBのタイマーコントロールについて

    VB2005のタイマーコントロールで疑問があります。 ピクチャーボックスコントロールにラベルを貼り付けて タイマーコントロールで文字がスクロールする プログラムを作ったのですが、 タイマーコントロールのインターバルを10msから120msまで 500回タイマーのイベントをカウントしたタイムとストップウォッチで 計ったタイムを比べたらズレが生じることが分かりました。 人間の手で計っていますが、計測方法としては、タイマーをスタートするボタンと同時にストップウォッチのスタートを押し、カウンターが500回で止まった時点でストップウォッチを止める方法でWindowXPでCPUがCore2 DuoのパソコンとWindowsMeでCPUがPentiumIIIのノートパソコンで下記のように計測しました。 WindowsXP 10ms…8秒24、20ms…15秒84、30ms…15秒82、40ms…24秒64、50ms…31秒60、60ms…31秒72、70ms…41秒21、80ms…47秒40、90ms…47秒32 後省略 WindowsMe 10ms…28秒25、20ms…28秒21、30ms…28秒10、40ms…28秒23、50ms…28秒28、60ms…57秒20、70ms…57秒43、以下ほぼ一緒なので省略110ms…56秒93でした。 その後、VBのヘルプの検索で、Windowsのタイマーの精度は55msとあるのを発見したのですが、WindowsMeのノートパソコンでは、55msの精度にあったデータが帰ってきたのですが、 WindowsXPのパソコンは、どう見ても内部精度は違うような結果に見えます。 どなたかタイマーの精度について知っておられる方、教えてもらえますか? よろしくお願いします。

  • Excelマクロにて、タイマーで自動更新は出来るのでしょうか?

    Excelマクロにて、タイマーで自動更新は出来るのでしょうか? Excelマクロの初心者です。 最近関数にて、時間の計算を行うbookを作成しましたが、 下記の様に手動で現時刻欄を更新している状態です。 (これは1カ所ですが、実際には複数箇所を行いたいです。) Sub 残り時間を更新() ' Range("C21").Select '現時刻欄を選択 ActiveCell.FormulaR1C1 = "=NOW()" '使用開始時刻欄に現時刻を再設定 Application.CutCopyMode = False End Sub これを別のマクロにくっつけて、例えば10分おき位に自動で 更新が出来る様な事は出来ますでしょうか? 理想は、セルに自動更新時間が任意に設定でき、その数字の基で タイマーが時間が決まり、実行ボタンでタイマー開始、停止ボタン で実行キャンセルといった、VB上では出来そうな事をExcel上 でも可能でしょうか? 良きアドバイスをいただきたいと思います。 よろしくお願いいたします。

  • エクセル コントロールツールボックスが使えない

    エクセル2007を使っています。 VBAで書いたコマンドをシートに貼り付けたボタンで実行させたいのですがVBのツールバーを開くと「コントロールボックス」の部分がグレーアウトしていて使えません。 有効にする方法をご存知の方教えてください。

  • Excel_VBAでキーバッファへのデータの転送?

    ExcelのVBAで、実行したマクロは、エクセルの戻る操作が出来ないように思います!!少なくとも私のスキルでは・・!! で、考えたのですが、エクセルの機能の内、キー入力だけで実行できる操作であれば、キーバッファ(はるか昔にはこのように呼んでいたとおもいます。具体的には、キーボードで入力した情報を一時的に溜める部分)に模擬的にキー情報を転送すれば、エクセルの戻る機能が使えると思いました。で、どうすれば、いいのでしょうか?思いついたもののどのようにすればいいのか?解りません! VBAもしくは、VBに詳しい方教えて頂けないでしょうか?宜しくお願い致します。できれば、マクロで、戻る操作が有効になる方法を教えて頂くと嬉しいです。よろしくお願いいたします。

  • EXCEL VBAからの転向

    EXCEL VBA初心者ですが、 仕事で必要だったので、EXCELマクロからはじめ、 ある程度の条件分岐やループなどのコーディングを 独学で勉強しました。 参考書を読みながら、やっているうちに プログラミングの面白さにはまっています。 まだまだ初心者なんですが、 今後VBAから、もっと実用的で、主流な言語に転向してみようかと 考えています。 VBAからの転向は、やっぱりVBへ進んだほうが 入り易いのでしょうか? 他に入門しやすい言語があれば、教えてください

専門家に質問してみよう