IT系/VBA/基本/タイマー処理

Last-modified: 2020-07-24 (金) 22:59:41

目次


概要

タイマー処理に関するVBAのTIPS。になればよいけどリンク集。

タイマー処理とは

タイマー処理は、一定時間間隔で処理を行う方法。
Application.OnTime メソッドを使用する方法と、WindowsAPIのSetTimerを使う方法がある。

Application.OnTime メソッド

  • Application.OnTime メソッドは、指定された時刻 (特定の日時、または特定の期間の経過後) にプロシージャを実行するメソッド。
    Application.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
    Application.OnTime TimeValue("17:00:00"), "実行するプロシージャー名"    ' 17時に実行
    Application.OnTime Now + TimeSerial(0, 0, 5), "実行するプロシージャー名"    ' 5秒後に実行
    Application.OnTime Now + TimeValue("00:00:05"), "'sample2 ""時間ですよ""'"    ' 引数を渡して、5秒後に実行
  • 以下のように、OnTimeで自メソッドを呼び出すことで、定期実行をすることも可能。
    Option Explicit
    Public mOnTime As Date
    Sub TimerProc()
     Range("A1") = Now()
    End Sub
    Sub OnTimeStart()
      Call TimerProc
      mOnTime = Now() + TimeSerial(0, 0, 1)
      Call Application.OnTime(mOnTime, "OnTimeStart")
    End Sub
    Sub OnTimeStop()
      '同一のProcedureとEarliestTimeがないとエラーになる
      On Error Resume Next
      Call Application.OnTime(mOnTime, "OnTimeStart", , False)
    End Sub
  • 上記が実行されている間も、他のExcel作業は普通に行える。
  • 上記のOnTimeStopプロシージャを呼び出すと、実行スケジュールを解除し(Falseを指定)、定期実行を終了する。

SetTimer(WindowsAPI)

  • タイマー処理機能のWindowsAPI関数であるSetTimerを使用する方法。
    上記OnTimeの定期処理の内容と同じことを行うには、以下のようになる。
    Option Explicit
    Public Declare PtrSafe Function SetTimer Lib "USER32" _
                        (ByVal hwnd As Long, _
                        ByVal nIDEvent As Long, _
                        ByVal uElapse As Long, _
                        ByVal lpTimerFunc As LongPtr) As Long
    Public Declare PtrSafe Function KillTimer Lib "USER32" _
                        (ByVal hwnd As Long, _
                        ByVal nIDEvent As Long) As Long
    Public mTimerID As Long
    Sub TimerProc()
      If mTimerID = 0 Then End '終了できない時の対策
      On Error Resume Next 'デバッグ出すとExcelが固まるので
      Range("A1") = Now()
    End Sub
    Sub TimerStart()
      If mTimerID <> 0 Then
        MsgBox "起動済です。"
        Exit Sub
      End If
      mTimerID = SetTimer(0&, 1&, 1000&, AddressOf TimerProc)
    End Sub
    Sub TimerStop()
      Call KillTimer(0&, mTimerID)
      mTimerID = 0
    End Sub

TIPS

別ページの一覧を入れる。

'IT系/VBA/基本/タイマー処理/' には、下位層のページがありません。

リンク集

重複を恐れないリンク集。

動画

その他メモ