'*** Private Declare Sub Sleep Lib "Kernel32.dll" (ByVal dwMilliseconds As Long) Private Declare Function timeGetTime Lib "WinMM.dll" () As Long Public Sub Wait(ByVal inMilliseconds As Long) Dim SleepTime As Long, TimeNow As Long Dim SleepTo As Long, SleepEnd As Long Const MaxSleep As Long = 100 TimeNow = timeGetTime() SleepTime = inMilliseconds \ 10 If (SleepTime > MaxSleep) Then SleepTime = MaxSleep SleepTo = TimeNow + inMilliseconds Do DoEvents TimeNow = timeGetTime() SleepEnd = SleepTo - TimeNow If (SleepEnd <= SleepTime) Then Exit Do Call Sleep(SleepTime) Loop If (SleepEnd > 0) Then Call Sleep(SleepEnd) End Sub '*** You can test it with something like this: '*** Dim StartTime As Double, EndTime As Double StartTime = Timer() Call Wait(5000) ' Wait for 5 seconds EndTime = Timer() Debug.Print Format$(EndTime - StartTime, "0.000") '***