web-dev-qa-db-ja.com

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

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

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


[〜#〜] edit [〜#〜]

提供された回答に基づくクロスポストは、次の場所にあります。 Excel VBA Application.OnTime。これを使用するのは悪い考えだと思います...どちらにでも考えますか?

38

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

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
60
Alain

はい、これに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

StartTimerプロシージャをAuto_Openイベントに入れて、Timer手続きで行うことを変更できます(現在は、A1の時間をActiveSheet.Cells(1, 1).Value = Time)。

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

22
Todd Main

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

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分の遅延を追加します

8
Alex P

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

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

Sub Form_Timer()
    'Do Stuff
End Sub
2
PowerUser

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

  1. コーディングしようとしていて、イベントがトリガーされるたびにウィンドウのフォーカスが中断されます。
  2. 複数のワークブックを開いており、タイマーを使用することになっているワークブックを閉じて、ワークブックのトリガーと再オープンを続けます(イベントを適切に終了するのを忘れた場合)。

Chip Pearsonによるこの記事 は非常に明るいものでした。 OnTimeではなく、Windowsタイマーを使用することを好みます。

0
Gravity Grave

私の解決策:

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
Julian