120秒ごとにコードを実行する必要があります。 VBAでこれを行う簡単な方法を探しています。 Auto_Open
イベントからタイマー値を取得してマジックナンバーを使用することを防ぐことができることは知っていますが、タイマーを起動して120秒ごとに実行するものを取得する方法は得られません。
私はそれを避けることができれば、スリープで無限ループを実際に使用したくない。
[〜#〜] edit [〜#〜]:
提供された回答に基づくクロスポストは、次の場所にあります。 Excel VBA Application.OnTime。これを使用するのは悪い考えだと思います...どちらにでも考えますか?
ワークブックが最初に開いたときに、次のコードを実行します。
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
はい、これに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
以外)が必要です。ワークシートモジュールに含まれている場合、コードを少し変更する必要があります。
ワークブックイベントで:
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分の遅延を追加します
(これはMS Accessのヘルプファイルからの言い換えです。XLには同様のものがあると確信しています。)基本的に、TimerIntervalはフォームレベルのプロパティです。設定したら、サブForm_Timerを使用して、目的のアクションを実行します。
Sub Form_Load()
Me.TimerInterval = 1000 '1000 = 1 second
End Sub
Sub Form_Timer()
'Do Stuff
End Sub
OnTime
を使用すると、特に次の場合に苦痛を感じることがわかりました。
Chip Pearsonによるこの記事 は非常に明るいものでした。 OnTime
ではなく、Windowsタイマーを使用することを好みます。
私の解決策:
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