2016-11-04 10 views
0

私は以下のようなapplication.ontimeルーチンを持っています。なぜ私のapplication.ontimeはif文で動かないのですか? VBA

Sub timer() 

If Hour(Time) <= 15 Or Hour(Time) >= 22 Then 

    On Error Resume Next 

    Application.OnTime EarliestTime:=ThisWorkbook.Worksheets("Sheet1").Range("K5"), Procedure:="dataextract", Schedule:=False 

    On Error GoTo 0 

    ThisWorkbook.Worksheets("Sheet1").Range("K5") = Now + TimeSerial(0, WorksheetFunction.Floor(Minute(Now), 5) + 5 - Minute(Now), 1 - Second(Now)) 

    Application.OnTime EarliestTime:=ThisWorkbook.Worksheets("Sheet1").Range("K5"), Procedure:="dataextract", Schedule:=True 

End If 


End Sub 

私は、このルーチンがそうでday 1に午後4時までday 0で午後10時間で実行し、その後day 2に午後4時までday 1に午後10時に独自に再起動し、したいと思います。コードは午後4時に停止しますが、午後10時には再起動しません。あなたが見ることができるように、私はschedule:=falseを回していないので、なぜそれが再開しないのか理解できません。

+0

'Timer'がすでに組み込まれているVBAの意味を私はどこかここでミスをしたと確信していますが、アイデアを得る必要があります。おそらく名前を変更します。私はこれが問題だとは思っていませんが、そうかもしれません。 –

+1

あなたが撮影しているインターバルは何ですか?私はここであなたのTimeSerialの使用に従っているか分からない。そして、 'timer'はどのように呼び出されますか?いったん停止するとコードを再起動するものは何もありません。すなわち、「タイマー」が午後3時および午後10時の間に呼び出された場合、アクションは実行されず、他の実行はスケジュールされない。 –

+0

私は5分ごとにそれを呼んでいます。 floor関数は最初の実行をちょうど次の5分間隔に丸めます。たとえば、午後9時43分に申請を開始し、午後9時45分に実行されます。また、application.ontimeのインスタンスが1つだけ実行されていることを確認します。 – A1122

答えて

1

...

Sub timer() 

    Const PROC As String = "dataextract" 
    Const INTV_MIN As Long = 5 

    Dim rTime As Range 

    Set rTime = ThisWorkbook.Worksheets("Sheet1").Range("K5") 

    On Error Resume Next 
    Application.OnTime EarliestTime:=rTime.Value, Procedure:=PROC, Schedule:=False 
    On Error GoTo 0 

    If Hour(Time) <= 15 Or Hour(Time) >= 22 Then 
     '5min from now 
     rTime.Value = Now + TimeSerial(0, _ 
         WorksheetFunction.Floor(Minute(Now), INTV_MIN) + INTV_MIN - Minute(Now), _ 
         1 - Second(Now)) 
    Else 
     '10pm today 
     rTime.Value = Date + TimeSerial(22, 0, 0) 
    End If 
    Application.OnTime EarliestTime:=rTime.Value, Procedure:=PROC, Schedule:=True 

End Sub 
+0

'Timer'プロシージャが' dataextract'プロシージャによって呼び出された場合、これらの行は必要ありません: 'On Error Resume Next'' Application.OnTime EarliestTime:= rTime.Value、Procedure:= PROC、Schedule:= False''エラー時にはGoTo 0 'となる。また、Johnによって以前に言及されたように、[TimerはVBA機能です](https://msdn.microsoft.com/en-us/library/office/gg264416(v = office.15) .aspx) – EEM

関連する問題