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

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/1423:50:102013/8/150:20:10
2013/8/1423:55:102013/8/150:25:10
2013/8/150:00:102013/8/150:30:10

これで、タイマー作業が 途切れます。
0:00:00 超える事に 問題があるなら 0:00:10 は 実行されないハズ・・・・

反復時刻は yyyy/mm/dd & ” ” & ”hh:mm:ss” です。
試しに 時刻だけでやっても 同じでした。

さて、如何でしょ?

実は これで、動いていたのですが、3日ほど前から 0:00以降 突然タイマーが動かなくなったのです
PCは 3台 同じ現象です よって WINの設定では無い・
エクセル オプションに 何か設定でもあるのか??

どうも VBAのタイマーは不可解で
エクセル終了させず、 プログラムだけ終了、再ロードだと、前のタイマー残ったまま、ダブルでタイマー動くとか・・・・

それと、WIN32とかの 別のタイマー使った方が 良いのでしょうか??

A 回答 (1件)

日付を跨ぐ際の処理



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 反復時刻 , "必要な作業を行うマクロ", 待ち時間

の2行にしましょう。

バグの原因は「素直に足し算すれば良いのに、Format関数で余計な事をするから」です。

「ただ足すだけ」で、日付を跨ぐ場合も問題ありません。

直したいなら「Format関数は、デバッグ表示以外では使わない」ようにしましょう。

この回答への補足

お手数です

このくだりは 反復時間に 月日を入れていないときの ドジで 時間だけだと 23:59 の次が 0:00 と思い込みで、月日を入れたものです。反復時間の 初めに 月日入れてしまえば お説の通り。

で、そのごの テストでは 
Application.OnTime 反復時刻 , "必要な作業を行うマクロ", 待ち時間

の 再実行の 待ち時間 を入れると 0:00 以降 動かなくなることが分かりましたが
Public 待ち時間 As Variant
待ち時間 = TimeValue("00:01:00") 分でも 秒でも 同じ

さて、??
といった 次第

補足日時:2013/08/14 18:58
    • good
    • 0

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