回答:
Waitメソッドを使用します。
Application.Wait Now + #0:00:01#
または(Excel 2010以降の場合):
Application.Wait Now + #12:00:01 AM#
Application.Wait(Now + #0:00:01#)
乾杯!
Application.Wait (Now + TimeValue("0:00:01"))
Application.wait(now + 1e-5)
、秒間Application.wait(now + 0.5e-5)
0.5秒など
これをモジュールに追加します
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
または、64ビットシステムの場合:
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
マクロで次のように呼び出します。
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
Sleep (1000) ' delay 1 second
Loop
End Sub
Sleep()
秒未満の待機時間を指定できるため。Application.Wait
時々細かすぎます。
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
使用する代わりに:
Application.Wait(Now + #0:00:01#)
私は好む:
Application.Wait(Now + TimeValue("00:00:01"))
後で読む方がずっと簡単だからです。
これは完璧に機能します。「do until」ループの前または後にコードを挿入します。あなたのケースでは、5行(time1 =&time2 =& "do until"ループ)をdoループ内の最後に置きます
sub whatever()
Dim time1, time2
time1 = Now
time2 = Now + TimeValue("0:00:01")
Do Until time1 >= time2
DoEvents
time1 = Now()
Loop
End sub
Timer
ため、このソリューションは、以下で使用する同様のソリューションよりもTimer
うまく機能します。
kernel32.dllでのスリープの宣言は、64ビットのExcelでは機能しません。これはもう少し一般的です:
#If VBA7 Then
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
クリーンアップされたクレモのコードのバージョン-Application.Wait関数を持たないAccessで動作します。
Public Sub Pause(sngSecs As Single)
Dim sngEnd As Single
sngEnd = Timer + sngSecs
While Timer < sngEnd
DoEvents
Wend
End Sub
Public Sub TestPause()
Pause 1
MsgBox "done"
End Sub
Timer
午前0時からの秒数を指定する場合、午前0時の直前に実行すると(つまり、sngEnd
86,400以上)、このアプローチは失敗します。真夜中に、0にTimer
リセットされるため、sngEnd
永久に残ることはありません。
提示されたソリューションのほとんどはApplication.Waitを使用します。これは、現在の秒数のカウントが開始されてから既に経過した時間(ミリ秒)を考慮しないため、本質的に1秒までの不正確さがあります。
タイマーアプローチが最適なソリューションですが、真夜中にリセットを考慮する必要があるため、タイマーを使用した非常に正確なスリープメソッドを次に示します。
'You can use integer (1 for 1 second) or single (1.5 for 1 and a half second)
Public Sub Sleep(vSeconds As Variant)
Dim t0 As Single, t1 As Single
t0 = Timer
Do
t1 = Timer
If t1 < t0 Then t1 = t1 + 86400 'Timer overflows at midnight
DoEvents 'optional, to avoid excel freeze while sleeping
Loop Until t1 - t0 >= vSeconds
End Sub
これを使用して任意のスリープ機能をテストします:(デバッグイミディエイトウィンドウを開く:CTRL + G)
Sub testSleep()
t0 = Timer
Debug.Print "Time before sleep:"; t0 'Timer format is in seconds since midnight
Sleep (1.5)
Debug.Print "Time after sleep:"; Timer
Debug.Print "Slept for:"; Timer - t0; "seconds"
End Sub
Function Delay(ByVal T As Integer)
'Function can be used to introduce a delay of up to 99 seconds
'Call Function ex: Delay 2 {introduces a 2 second delay before execution of code resumes}
strT = Mid((100 + T), 2, 2)
strSecsDelay = "00:00:" & strT
Application.Wait (Now + TimeValue(strSecsDelay))
End Function
ここに睡眠の代替があります:
Sub TDelay(delay As Long)
Dim n As Long
For n = 1 To delay
DoEvents
Next n
End Sub
次のコードでは、ユーザーが「問題を抱えている」場合にスピンボタンを「グロー」効果で点滅させて、ユーザーにその効果を伝えています。ループで「スリープ1000」を使用すると、点滅は見えませんが、ループはうまく機能しています。
Sub SpinFocus()
Dim i As Long
For i = 1 To 3 '3 blinks
Worksheets(2).Shapes("SpinGlow").ZOrder (msoBringToFront)
TDelay (10000) 'this makes the glow stay lit longer than not, looks nice.
Worksheets(2).Shapes("SpinGlow").ZOrder (msoSendBackward)
TDelay (100)
Next i
End Sub
私はこれを問題に答えるために作りました:
Sub goTIMER(NumOfSeconds As Long) 'in (seconds) as: call gotimer (1) 'seconds
Application.Wait now + NumOfSeconds / 86400#
'Application.Wait (Now + TimeValue("0:00:05")) 'other
Application.EnableEvents = True 'EVENTS
End Sub
通常、タイマー機能を使用してアプリケーションを一時停止します。このコードをあなたのものに挿入してください
T0 = Timer
Do
Delay = Timer - T0
Loop Until Delay >= 1 'Change this value to pause time for a certain amount of seconds
Timer
午前0時からの秒数を指定する場合、午前0時の直前に実行すると(つまり、T0
午前0時からの遅延秒数よりも少ない場合)、このアプローチは失敗します。午前0時に、Timer
遅延制限に達する前に0にリセットされます。Delay
遅延制限に到達しないため、ループは永久に実行されます。
Loop Until Delay >= 1
あります。そうしないと、1を超えてループを終了するリスクがなくなります。
待機およびスリープ機能はExcelをロックし、遅延が終了するまで他に何もできません。一方、ループの遅延では、待機する正確な時間がわかりません。
だから、私はこの回避策を両方の概念の少しに参加させました。時間はあなたが望む時間になるまでループします。
Private Sub Waste10Sec()
target = (Now + TimeValue("0:00:10"))
Do
DoEvents 'keeps excel running other stuff
Loop Until Now >= target
End Sub
遅延が必要な場所でWaste10Secを呼び出すだけです
DoEvents
、ここで毎日