アプリ版:「スタンプのみでお礼する」機能のリリースについて

「一定の時間間隔で5秒毎にMacro1を実行する」
一応startマクロ、stopマクロは作成してみたのですが、
下記stopコマンド実行しても止まらなかったような気がします。
ここから改変するとしたらどうですか?

Public timestop As Boolean

Sub test()
Dim tt As Double
Dim wt As Double


tt = Now + TimeValue("00:00:05") '5秒後
wt = TimeValue("00:00:02") 'インターバル2秒
Application.OnTime tt, "Macro1", wt

If (timestop = False) Then
Time = Timer
Application.OnTime earliesttime:=(Now + TimeValue("00:00:01")), procedure:="test"
End If
End Sub

----------------------------------------
ここからstart,stopマクロ

Sub t_start()
timestop = False
Call test
End Sub

Sub t_stop()
timestop = True
End Sub

A 回答 (3件)

OnTimeを解除するときは、設定した時と同時刻を指定して解除を実行しなければなりませんので、前に設定した時刻を記憶させておかねばなりません。



Dim tt As Double
Sub test()
Dim wt As Double
tt = Now + TimeValue("00:00:05") '5秒後
wt = TimeValue("00:00:02") 'インターバル2秒
Application.OnTime tt, "Macro1", wt
End Sub

Sub macro1()
MsgBox ""
Call test
End Sub
'----------------------------------------
'ここからstart , stopマクロ

Sub t_start()
Call test
End Sub

Sub t_stop()
Application.OnTime earliesttime:=tt, procedure:="Macro1", Schedule:=False
End Sub
    • good
    • 1
この回答へのお礼

ありがとうございました。
またよろしくお願いします。

お礼日時:2014/07/25 11:57

#2、cjです、忘れものがあったので自己レス、です。



  If flgEsc Then ' タイマーを止めるフラグが立っていたら、↓止める。
の次の行から
    If dtNext = 0 Then
      flgEsc = False
      Exit Sub
    End If
の4行が必要でした。
これは、タイマー非実行時に、タイマーをストップさせようとした場合には何もしない、
という意味で、#2、の記述のままではエラーになってしまいます。

因みに、
    Application.OnTime EarliestTime:=dtNext, Procedure:="TimerProc", Schedule:=False
の一行を、
    On Error Resume Next
    Application.OnTime EarliestTime:=dtNext, Procedure:="TimerProc", Schedule:=False
    On Error GoTo 0
のようにしても、同じ様にタイマー非実行時にタイマーをストップさせようとした場合のエラー
を回避することは、可能です。

どちらかひとつ、追加、修正をお願いします。

失礼しました。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2014/07/25 11:57

こんにちは。



Double 型ではなくて、Date 型です(Double 型とDate 型では同値にならない場合があります)。

常に次回実行時刻(の値を)を確保しておいて、
今回実行時刻(の値)の5秒後にスケジュールを追加するようにしないと、
「5秒間隔」とは違ってしまうことがあります。
もしも「実行したタイミングの5秒後」という意味でしたら、少し修正が必要です。

stopの命令があれば、次回実行時刻を(キャンセルし)待たずに
タイマーを即、終了します。

startのタイミングではMacro1を実行せずに、
startのタイミングの5秒後からMacro1を実行するように書いていますが、
初回も実行したいなら、1行(Macro1と)追記してください。

' ' 〓〓〓〓〓シートモジュール〓〓〓〓〓
'Option Explicit
' ' =====================
Private Sub CommandButton1_Click() ' 例えば仮に、startボタン(Sub t_start()の代り)
  TimerProc True
End Sub
' ' ーーーーーーーーーーーーーーーー
Private Sub CommandButton2_Click() ' 例えば仮に、stopボタン(Sub t_stop()の代り)
  flgEsc = True ' タイマーを止めるフラグ(パブリック)を立てる
  TimerProc
End Sub
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓


' ' 〓〓〓〓〓標準モジュール〓〓〓〓〓
' ' ===モジュール上部の宣言セクション===
'Option Explicit

Public flgEsc As Boolean ' タイマーを止めるフラグ(パブリック)
Private dtNext As Date ' 次回実行時刻(プライベート)
' ' =====================
Sub TimerProc(Optional ByVal flg1st As Boolean) ' (Sub test()の代り)
  Dim dtLatest As Date
  If flgEsc Then ' タイマーを止めるフラグが立っていたら、↓止める。
    ' ' 次回のスケジュールを解除
    Application.OnTime EarliestTime:=dtNext, Procedure:="TimerProc", Schedule:=False
    dtNext = Empty ' 初期値に戻す
    flgEsc = False ' 初期値に戻す
  Else ' タイマーを↓継続。Macro1を実行後、次のスケジュールを設定。
    If flg1st Then
    ' ' 初回実行時刻(今から5秒後)を確定する。
      dtNext = DateAdd("s", 5, Now())
    Else
      ' ' 実行プロシージャをコール
      Macro1
    ' ' 次回実行時刻(今回の実行時刻から5秒後)を確定する。
      dtNext = DateAdd("s", 5, dtNext)
    End If
    ' ' 次回実行時刻に他の処理が優先的に実行されていたら、いつまで待つかを決める。
    ' ' 次回実行時刻の2秒後(今回の実行時刻から7秒後)
    dtLatest = DateAdd("s", 2, dtNext)
    ' ' 次回のスケジュールを登録
    Application.OnTime EarliestTime:=dtNext, Procedure:="TimerProc", LatestTime:=dtLatest
  End If
End Sub
' ' ーーーーーーーーーーーーーーーー
Sub Macro1() ' 実行プロシージャ
  Cells(1) = Cells(1) + 1 ' ← 例えば仮に、便宜的な仮の処理
End Sub
' ' 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2014/07/25 11:57

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A