こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBAで指定時刻まで一時停止するコード

VBA初心者です。
業務で使用するため、VBAで指定時刻まで一時停止するコードを作りたいのですが、うまくいきません。

設定したい条件は
(1)当日の午前9時から実行

(2)記述しているコードの実行が終了したら、当日の午後6時まで一時停止
(このとき他の業務でExcelを使用するので、Excelの動作を止めないためにDoEventsと記述してOSに制御を移しています)

(3)当日午後6時になったら、コードの実行を再開する

以上です。
今のところ、午後6時まで動作が停止せず、すぐに午後6時以降に実行したいコードが実行されてしまいます。

どういうコードを記述すればいいでしょうか?教えてください。
------------------------------------------------------------------------------------------------------------------
~(中略)~
Dim PauseTime As Single
Dim Start As Variant
Dim Finish As Date
Dim TotalTime As Variant

Start = Now()
Do
PauseTime = Start + TimeValue("08:59:20")
DoEvents
Loop While Now() < Finish
Finish = TimeValue("18:00:03")

~(中略)~
------------------------------------------------------------------------------------------------------------------

投稿日時 - 2020-07-21 17:53:01

QNo.9775614

困ってます

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

Sub testz()

 Dim PauseTime As Date

 PauseTime = Now() + TimeValue("0:2:0")

 Do
  DoEvents
  'If Now() > PauseTime Then Exit Do
 Loop While Now() < PauseTime

 MsgBox "AAA"

End Sub

とすれば期待の動きになるものと思いますが、
長時間待つ間に、
他のマクロブックを開く、他のマクロを実行する
といったことが行われると
課題マクロが停止してしまうんじゃないかと思います。
(未検証です。)

私だったら、
9時に行うマクロと18時に行うマクロを
マクロブック単位で分け
タスクスケジューラーを使います。

9時に行うマクロが正しく動作したかどうかを
18時に行うマクロでチェックしたいということであれば
例えば、
9時に行うマクロが正しく終了するときにダミーファイルを書き出し
18時に行うマクロがこのダミーファイルの有無をチェックする
といった仕組みを組み込んではいかがでしょうか。

投稿日時 - 2020-07-22 00:11:33

お礼

ご回答いただいたコードで実行してみましたが、他のExcelブックが開けない状態です。タイムスケジューラーを使う方法でやることにします。
ご回答ありがとうございました!

投稿日時 - 2020-07-22 09:49:47

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

> Loop While Now() < Finish

今のコードでは、この部分が実行されるときにはFinishに値が入っていません。
なので、すぐにループを抜けてしまうのでしょう。

投稿日時 - 2020-07-22 09:26:37

お礼

そういうことなんですね。まだまだ勉強中の身ですが、精進していきたいと思います。
ご回答ありがとうございました!

投稿日時 - 2020-07-22 09:51:12

ANo.3

> Ontimeですと、Excelが固まってしまって(午後6時まで動作を中断し続けるので)、他の業務でExcelが使えません。

そうですか、なにかとバッティングするんでしょうか。単純なコードで試してみましたがtを実行したあと普通に使えて再度tが実行されました。

Sub t()
Dim i As Long
MsgBox "DDD"
For i = 1 To 10
Cells(i, "A").Value = i
Next
Application.OnTime TimeValue("19:30:00"), "t"
End Sub

投稿日時 - 2020-07-21 19:32:56

お礼

そうですか。。
こちらでは何か別の要因があるのかもしれません。調べてみます。ご回答ありがとうございました!

投稿日時 - 2020-07-22 09:48:18

ANo.2

OnTimeメソッドでどうでしょう
https://excel-ubara.com/excelvba1/EXCELVBA420.html

投稿日時 - 2020-07-21 18:24:03

補足

Ontimeですと、Excelが固まってしまって(午後6時まで動作を中断し続けるので)、他の業務でExcelが使えません。

使用はしましたが、上記のような都合でDoWhile構文にした次第です。

投稿日時 - 2020-07-21 18:47:16

ANo.1

タイマー割込み
https://excel-ubara.com/excelvba4/EXCEL299.html

二重起動防止とか割り込み禁止とか
やらないといけないから APIの知識は必須だと思う

投稿日時 - 2020-07-21 18:07:38

お礼

ありがとうございます。参考にします。

投稿日時 - 2020-07-22 09:46:49

あなたにオススメの質問