Câu trả lời:
Sử dụng phương pháp Chờ :
Application.Wait Now + #0:00:01#
hoặc (đối với Excel 2010 trở lên):
Application.Wait Now + #12:00:01 AM#
Application.Wait(Now + #0:00:01#)
Cheers!
Application.Wait (Now + TimeValue("0:00:01"))
Application.wait(now + 1e-5)
trong một giây, Application.wait(now + 0.5e-5)
trong nửa giây, v.v.
Thêm cái này vào mô-đun của bạn
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Hoặc, đối với hệ thống 64 bit, sử dụng:
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Gọi nó trong macro của bạn như vậy:
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
Sleep (1000) ' delay 1 second
Loop
End Sub
Sleep()
cho phép bạn chỉ định thời gian chờ dưới 1 giây. Application.Wait
đôi khi quá hạt.
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
thay vì sử dụng:
Application.Wait(Now + #0:00:01#)
tôi thích:
Application.Wait(Now + TimeValue("00:00:01"))
vì nó dễ đọc hơn rất nhiều sau đó.
điều này hoạt động hoàn hảo đối với tôi. chèn bất kỳ mã nào trước hoặc sau vòng lặp "làm cho đến khi". Trong trường hợp của bạn, hãy đặt 5 dòng (time1 = & time2 = & "do until") ở cuối vòng lặp do của bạn
sub whatever()
Dim time1, time2
time1 = Now
time2 = Now + TimeValue("0:00:01")
Do Until time1 >= time2
DoEvents
time1 = Now()
Loop
End sub
Timer
vì Timer
cách tiếp cận không thành công ngay trước nửa đêm.
Khai báo Sleep trong kernel32.dll sẽ không hoạt động trong Excel 64 bit. Điều này sẽ tổng quát hơn một chút:
#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
Chỉ là phiên bản mã của clemo đã được làm sạch - hoạt động trong Access, không có chức năng Application.Wait.
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
cung cấp số giây kể từ nửa đêm, thì cách tiếp cận này không thành công nếu nó được thực hiện ngay trước nửa đêm (tức sngEnd
là> = 86.400). Vào lúc nửa đêm, Timer
đặt lại về 0 và do đó, vẫn ít hơn sngEnd
mãi mãi.
Hầu hết các giải pháp được trình bày đều sử dụng Application.Wait, không tính đến thời gian (mili giây) đã trôi qua kể từ khi bắt đầu đếm giây của dòng điện, vì vậy chúng có độ chính xác nội tại lên đến 1 giây .
Cách tiếp cận Bộ hẹn giờ là giải pháp tốt nhất , nhưng bạn phải tính đến việc đặt lại vào lúc nửa đêm, vì vậy đây là một phương pháp Ngủ rất chính xác bằng Bộ hẹn giờ:
'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
SỬ DỤNG NÀY ĐỂ KIỂM TRA BẤT KỲ CHỨC NĂNG NGỦ NÀO: (mở cửa sổ gỡ lỗi ngay lập tức: 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
Đây là một giải pháp thay thế cho giấc ngủ:
Sub TDelay(delay As Long)
Dim n As Long
For n = 1 To delay
DoEvents
Next n
End Sub
Trong đoạn mã sau, tôi tạo hiệu ứng "phát sáng" nhấp nháy trên nút xoay để hướng người dùng đến nó nếu họ "gặp sự cố", sử dụng "sleep 1000" trong vòng lặp dẫn đến không nhìn thấy nhấp nháy, nhưng vòng lặp hoạt động rất tốt.
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
tôi đã làm điều này để trả lời vấn đề:
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
Tôi thường sử dụng chức năng Hẹn giờ để tạm dừng ứng dụng. Chèn mã này vào mã của bạn
T0 = Timer
Do
Delay = Timer - T0
Loop Until Delay >= 1 'Change this value to pause time for a certain amount of seconds
Timer
cung cấp số giây kể từ nửa đêm, thì cách tiếp cận này không thành công nếu nó được thực hiện ngay trước nửa đêm (tức T0
là ít hơn số giây trễ từ nửa đêm). Vào lúc nửa đêm, Timer
đặt lại về 0 trước khi đạt đến giới hạn độ trễ. Delay
không bao giờ đạt đến giới hạn trễ, vì vậy vòng lặp chạy mãi mãi.
Loop Until Delay >= 1
, nếu không bạn có nguy cơ vượt quá 1 và không bao giờ thoát khỏi vòng lặp.
Các hàm Wait and Sleep khóa Excel và bạn không thể làm gì khác cho đến khi hết thời gian trễ. Mặt khác, sự chậm trễ của vòng lặp không cho bạn thời gian chính xác để chờ đợi.
Vì vậy, tôi đã thực hiện cách giải quyết này để kết hợp một chút của cả hai khái niệm. Nó lặp lại cho đến khi thời gian bạn muốn.
Private Sub Waste10Sec()
target = (Now + TimeValue("0:00:10"))
Do
DoEvents 'keeps excel running other stuff
Loop Until Now >= target
End Sub
Bạn chỉ cần gọi đến Waste10Sec khi bạn cần sự chậm trễ
Bạn có thể sử dụng Application.wait now + timevalue ("00:00:01") hoặc Application.wait now + timeerial (0,0,1)
DoEvents
như được giới thiệu ở đây dailydoseofexcel.com/archives/2005/06/14/stopwatch