36


17

設定された秒数ごとにコードを実行するVBAマクロオンタイマースタイル、つまり 120秒

120秒ごとにコードを実行する必要があります。 VBAでこれを行う簡単な方法を探しています。 `Auto_Open`イベントからタイマー値を取得してマジックナンバーを使用することを防ぐことができることは知っていますが、タイマーを起動して120秒ごとに実行するものを取得する方法を取得することはできません。

私はそれを避けることができれば、スリープで無限ループを実際に使用したくありません。

'' '' '

編集

提供された回答に基づくクロスポストは、https://stackoverflow.com/questions/2341762/excel-vba-application-ontime-i-think-its-a-bad-idea-to-use-this-thoughtsにあります-eit [Excel VBA Application.OnTime。 これを使うのは悪い考えだと思う…​ いずれにせよ考えますか?]

6 Answer


56


ワークブックが最初に開いたときに、次のコードを実行します。

alertTime = Now + TimeValue("00:02:00")
Application.OnTime alertTime, "EventMacro"

それからそれを繰り返すであろう "EventMacro"と呼ばれるワークブック内のマクロを持ってください。

Public Sub EventMacro()
    '... Execute your actions here'
    alertTime = Now + TimeValue("00:02:00")
    Application.OnTime alertTime, "EventMacro"
End Sub


21


はい、これに `Application.OnTime`を使用してループに入れることができます。 スヌーズボタンをもう一度鳴らしたいときのために、スヌーズボタンを押し続ける目覚まし時計のようなものです。 以下は、時間とともに3秒ごとにセルA1を更新します。

Dim TimerActive As Boolean
Sub StartTimer()
    Start_Timer
End Sub

Private Sub Start_Timer()
    TimerActive = True
    Application.OnTime Now() + TimeValue("00:00:03"), "Timer"
End Sub

Private Sub Stop_Timer()
    TimerActive = False
End Sub

Private Sub Timer()
    If TimerActive Then
        ActiveSheet.Cells(1, 1).Value = Time
        Application.OnTime Now() + TimeValue("00:00:03"), "Timer"
    End If
End Sub

「Start_Timer」プロシージャを「Auto_Open」イベントに入れて、「Timer」プロシージャの処理を変更できます(現在は、A1の時刻を「ActiveSheet.Cells(1、1).Value = Timeで更新しているだけです」 `)。

:ワークシートモジュールではなく、モジュール内のコード( `StartTimer`以外)が必要です。 ワークシートモジュールに含まれている場合、コードを少し変更する必要があります。


8


ワークブックイベントで:

Private Sub Workbook_Open()
    RunEveryTwoMinutes
End Sub

モジュール内:

Sub RunEveryTwoMinutes()
    //Add code here for whatever you want to happen
    Application.OnTime Now + TimeValue("00:02:00"), "RunEveryTwoMinutes"
End Sub

コードの最初の部分のみを実行した後_after_ブックを開き、 `Workbook_Open`イベントに2分の遅延を追加します


2


(これは、MS Accessヘルプファイルから言い換えられます。 XLには似たようなものがあるはずです。基本的に、TimerIntervalはフォームレベルのプロパティです。 設定したら、サブForm_Timerを使用して、目的のアクションを実行します。

Sub Form_Load()
    Me.TimerInterval = 1000 '1000 = 1 second
End Sub

Sub Form_Timer()
    'Do Stuff
End Sub


0


私の解決策:

Option Explicit
Public datHora As Date

Function Cronometro(action As Integer) As Integer
'This return the seconds between two >calls
Cronometro = 0
  If action = 1 Then 'Start
    datHora = Now
  End If
  If action = 2 Then 'Time until that moment
    Cronometro = DateDiff("s", datHora, Now)
  End If
End Function

'' '' '

使い方? 簡単…​

dummy= Cronometro(1) ' This starts the timer

seconds= Cronometro(2) ' This returns the seconds between the first call and this one


0


特に次の場合に、 `OnTime`を使用すると苦痛になることがわかりました。

  1. コーディングしようとしていますが、ウィンドウへのフォーカスが中断されます イベントがトリガーされるたび。

  2. 複数のワークブックを開いており、必要なワークブックを閉じています タイマーを使用すると、ワークブックのトリガーと再オープンが継続されます(イベントを適切に終了するのを忘れた場合)。

http://www.cpearson.com/excel/OnTime.aspx [Chip Pearsonによるこの記事]は非常に明快でした。 `OnTime`の代わりに、Windowsタイマーを使用することを好みます。