ฉันมีแผ่นงาน Excel ที่มีมาโครต่อไปนี้ ฉันอยากจะวนซ้ำทุก ๆ วินาที แต่ถ้าฉันสามารถหาฟังก์ชั่นนี้ได้ เป็นไปไม่ได้เหรอ?
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
'Here I want to wait for one second
Loop
End Sub
ฉันมีแผ่นงาน Excel ที่มีมาโครต่อไปนี้ ฉันอยากจะวนซ้ำทุก ๆ วินาที แต่ถ้าฉันสามารถหาฟังก์ชั่นนี้ได้ เป็นไปไม่ได้เหรอ?
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
'Here I want to wait for one second
Loop
End Sub
คำตอบ:
ใช้วิธีการรอ :
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)
เวลาครึ่งวินาทีเป็นต้น
เพิ่มสิ่งนี้ลงในโมดูลของคุณ
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()
ช่วยให้คุณระบุเวลารอน้อยกว่า 1 วินาที 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" loop) ต่อท้ายใน do loop
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
วิธีนี้ล้มเหลวก่อนเที่ยงคืน
การประกาศสำหรับ Sleep ใน kernel32.dll จะไม่ทำงานใน Excel 64 บิต นี่จะเป็นการทั่วไปเล็กน้อย:
#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
เพียงแค่รหัสของ clemo เวอร์ชันที่ล้างแล้ว - ใช้งานได้ใน 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
ให้จำนวนวินาทีตั้งแต่เที่ยงคืนวิธีนี้จะล้มเหลวหากดำเนินการก่อนเที่ยงคืน (กล่าวsngEnd
คือ> = 86,400) ในเวลาเที่ยงคืนTimer
รีเซ็ตเป็น 0 และยังคงน้อยกว่าsngEnd
ตลอดไป
ส่วนใหญ่ของการแก้ปัญหาที่นำเสนอใช้ Application.Wait ซึ่งไม่ได้ใช้ในบัญชีของเวลา (หน่วยเป็นมิลลิวินาที) ผ่านไปแล้วตั้งแต่ currend ที่สองนับเริ่มต้นเพื่อพวกเขามีความไม่แน่ชัดที่แท้จริงของถึง 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
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
นี่คือทางเลือกอื่นสำหรับการนอนหลับ:
Sub TDelay(delay As Long)
Dim n As Long
For n = 1 To delay
DoEvents
Next n
End Sub
ในรหัสต่อไปนี้ฉันสร้างเอฟเฟกต์ "เรืองแสง" กะพริบบนปุ่มหมุนเพื่อนำทางผู้ใช้ไปยังเอฟเฟกต์นั้นหากพวกเขา "มีปัญหา" การใช้ "sleep 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
ฉันมักจะใช้ฟังก์ชันTimerเพื่อหยุดแอปพลิเคชันชั่วคราว ใส่รหัสนี้ให้กับคุณ
T0 = Timer
Do
Delay = Timer - T0
Loop Until Delay >= 1 'Change this value to pause time for a certain amount of seconds
Timer
ให้จำนวนวินาทีนับตั้งแต่เที่ยงคืนวิธีนี้จะล้มเหลวหากดำเนินการก่อนเที่ยงคืน (กล่าวT0
คือน้อยกว่าจำนวนวินาทีที่ล่าช้าจากเที่ยงคืน) เวลาเที่ยงคืนTimer
รีเซ็ตเป็น 0 ก่อนถึงขีด จำกัด การหน่วงเวลา Delay
ไม่ถึงขีด จำกัด การหน่วงเวลาดังนั้นลูปจึงทำงานตลอดไป
Loop Until Delay >= 1
หรือคุณเสี่ยงที่จะเกิน 1 และไม่ออกจากลูป
ฟังก์ชัน Wait and Sleep จะล็อก Excel และคุณไม่สามารถทำอะไรได้อีกจนกว่าการหน่วงเวลาจะเสร็จสิ้น ในทางกลับกันความล่าช้าของลูปไม่ได้ให้เวลาที่แน่นอนในการรอ
ดังนั้นฉันได้ทำการแก้ปัญหานี้เพื่อเชื่อมโยงกับแนวคิดทั้งสองเล็กน้อย มันวนซ้ำจนกว่าจะถึงเวลาที่คุณต้องการ
Private Sub Waste10Sec()
target = (Now + TimeValue("0:00:10"))
Do
DoEvents 'keeps excel running other stuff
Loop Until Now >= target
End Sub
คุณเพียงแค่โทรไปที่ Waste10Sec เมื่อคุณต้องการความล่าช้า
ลองสิ่งนี้:
Threading.thread.sleep(1000)
คุณสามารถใช้ Application.wait now + timevalue ("00:00:01") หรือ Application.wait now + timeserial (0,0,1)
DoEvents
ตามตัวอย่างที่นี่dailydoseofexcel.com/archives/2005/06/14/stopwatch