Yanıtlar:
Bekle yöntemini kullanın :
Application.Wait Now + #0:00:01#
veya (Excel 2010 ve sonrası için):
Application.Wait Now + #12:00:01 AM#
Application.Wait(Now + #0:00:01#)
Şerefe!
Application.Wait (Now + TimeValue("0:00:01"))
Application.wait(now + 1e-5)
, bir saniye Application.wait(now + 0.5e-5)
yarım saniye vs
Bunu modülünüze ekleyin
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Veya 64 bit sistemler için şunları kullanın:
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Makronuzda şöyle arayın:
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
Sleep (1000) ' delay 1 second
Loop
End Sub
Sleep()
1 saniyeden daha kısa bekleme süreleri belirlemenize izin verir. Application.Wait
bazen çok ayrıntılı.
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
kullanmak yerine:
Application.Wait(Now + #0:00:01#)
tercih ederim:
Application.Wait(Now + TimeValue("00:00:01"))
çünkü sonradan okumak çok daha kolay.
bu benim için kusursuz çalışıyor. "yapana kadar" döngüsünden önce veya sonra herhangi bir kod ekleyin. Sizin durumunuzda, 5 satırı (time1 = & time2 = & "do to" döngüsü) do döngünüzün sonuna koyun
sub whatever()
Dim time1, time2
time1 = Now
time2 = Now + TimeValue("0:00:01")
Do Until time1 >= time2
DoEvents
time1 = Now()
Loop
End sub
Timer
çünkü Timer
yaklaşım gece yarısından hemen önce başarısız oluyor.
Kernel32.dll'deki Uyku bildirimi 64 bit Excel'de çalışmaz. Bu biraz daha genel olurdu:
#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
Yalnızca clemo kodunun temizlenmiş bir sürümü - Application.Wait işlevine sahip olmayan Access'te çalışır.
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
gece yarısından itibaren saniye sayısını verir sadece gece yarısından önce yürütülür, sonra bu yaklaşım başarısız (yani öyle ki sngEnd
> = 86.400) olduğunu. Gece yarısı Timer
0'a sıfırlanır ve bu nedenle sngEnd
sonsuza kadar kalmaz .
Sunulan çözümlerin çoğu, akımın saniye sayımının başlamasından bu yana geçen süreyi (milisaniye) hesaba katmayan Application.Wait'i kullanır, bu nedenle 1 saniyeye kadar içsel bir belirsizliğe sahiptirler .
Zamanlayıcı yaklaşımı en iyi çözümdür , ancak gece yarısı sıfırlamayı hesaba katmanız gerekir, bu yüzden işte Zamanlayıcı kullanan çok hassas bir Uyku yöntemi:
'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
HERHANGİ BİR UYKU FONKSİYONUNU TEST ETMEK İÇİN BUNU KULLANIN: (hata ayıklama Anında penceresini aç: 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
Application.Wait Second(Now) + 1
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
İşte uyumaya bir alternatif:
Sub TDelay(delay As Long)
Dim n As Long
For n = 1 To delay
DoEvents
Next n
End Sub
Aşağıdaki kodda, kullanıcıları "sorun yaşıyorlarsa" yönlendirmek için bir döndürme düğmesinde "parlama" efekti yanıp sönerim, döngüde "uyku 1000" kullanmak görünür bir yanıp sönmeye neden olmaz, ancak döngü harika çalışıyor.
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
soruna cevap vermek için bunu yaptırdım:
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
Uygulamayı duraklatmak için genellikle Zamanlayıcı işlevini kullanıyorum . Bu kodu kendinize ekleyin
T0 = Timer
Do
Delay = Timer - T0
Loop Until Delay >= 1 'Change this value to pause time for a certain amount of seconds
Timer
gece yarısından itibaren saniye sayısını verir sadece gece yarısından önce yürütülür, sonra bu yaklaşım başarısız (yani öyle ki T0
daha az yarısından gecikme saniye sayısı daha). Gece yarısı, Timer
gecikme sınırına ulaşılmadan önce 0'a sıfırlanır. Delay
asla gecikme sınırına ulaşmaz, bu nedenle döngü sonsuza kadar çalışır.
Loop Until Delay >= 1
, yoksa 1'in üzerine çıkıp döngüden asla çıkmama riskini alırsınız.
Bekleme ve Uyku işlevleri Excel'i kilitler ve gecikme bitene kadar başka bir şey yapamazsınız. Öte yandan, Döngü gecikmeleri size beklemek için kesin bir zaman vermez.
Bu yüzden, her iki kavramı da biraz birleştirerek bu geçici çözümü yaptım. Saat, istediğiniz zaman olana kadar döngüye girer.
Private Sub Waste10Sec()
target = (Now + TimeValue("0:00:10"))
Do
DoEvents 'keeps excel running other stuff
Loop Until Now >= target
End Sub
Gecikmeye ihtiyaç duyduğunuz yerde Waste10Sec'i aramanız yeterlidir
Application.wait now + timevalue ("00:00:01") veya Application.wait now + timeserial (0,0,1) kullanabilirsiniz
DoEvents
burada demo olarak istediğinizi tahmin ediyorum dailydoseofexcel.com/archives/2005/06/14/stopwatch