How to give a time delay of less than one second in excel vba?

后端 未结 10 2139
孤街浪徒
孤街浪徒 2020-11-29 06:14

i want to repeat an event after a certain duration that is less than 1 second. I tried using the following code

Application.wait Now + TimeValue (\"00:00:01\         


        
相关标签:
10条回答
  • 2020-11-29 07:01

    To pause for 0.8 of a second:

    Sub main()
        startTime = Timer
        Do
        Loop Until Timer - startTime >= 0.8
    End Sub
    
    0 讨论(0)
  • 2020-11-29 07:09

    Obviously an old post, but this seems to be working for me....

    Application.Wait (Now + TimeValue("0:00:01") / 1000)
    

    Divide by whatever you need. A tenth, a hundredth, etc. all seem to work. By removing the "divide by" portion, the macro does take longer to run, so therefore, with no errors present, I have to believe it works.

    0 讨论(0)
  • 2020-11-29 07:11

    No answer helped me, so I build this.

    '   function Timestamp return current time in milliseconds.
    '   compatible with JSON or JavaScript Date objects.
    
    Public Function Timestamp () As Currency
        timestamp = (Round(Now(), 0) * 24 * 60 * 60 + Timer()) * 1000
    End Function
    
    '   function Sleep let system execute other programs while the milliseconds are not elapsed.
    
    Public Function Sleep(milliseconds As Currency)
    
        If milliseconds < 0 Then Exit Function
    
        Dim start As Currency
        start = Timestamp ()
    
        While (Timestamp () < milliseconds + start)
            DoEvents
        Wend
    End Function
    

    Note : In Excel 2007, Now() send Double with decimals to seconds, so i use Timer() to get milliseconds.

    Note : Application.Wait() accept seconds and no under (i.e. Application.Wait(Now())Application.Wait(Now()+100*millisecond)))

    Note : Application.Wait() doesn't let system execute other program but hardly reduce performance. Prefer usage of DoEvents.

    0 讨论(0)
  • 2020-11-29 07:13
    Public Function CheckWholeNumber(Number As Double) As Boolean
        If Number - Fix(Number) = 0 Then
            CheckWholeNumber = True
        End If
    End Function
    
    Public Sub TimeDelay(Days As Double, Hours As Double, Minutes As Double, Seconds As Double)
        If CheckWholeNumber(Days) = False Then
            Hours = Hours + (Days - Fix(Days)) * 24
            Days = Fix(Days)
        End If
        If CheckWholeNumber(Hours) = False Then
            Minutes = Minutes + (Hours - Fix(Hours)) * 60
            Hours = Fix(Hours)
        End If
        If CheckWholeNumber(Minutes) = False Then
            Seconds = Seconds + (Minutes - Fix(Minutes)) * 60
            Minutes = Fix(Minutes)
        End If
        If Seconds >= 60 Then
            Seconds = Seconds - 60
            Minutes = Minutes + 1
        End If
        If Minutes >= 60 Then
            Minutes = Minutes - 60
            Hours = Hours + 1
        End If
        If Hours >= 24 Then
            Hours = Hours - 24
            Days = Days + 1
        End If
        Application.Wait _
        ( _
            Now + _
            TimeSerial(Hours + Days * 24, Minutes, 0) + _
            Seconds * TimeSerial(0, 0, 1) _
        )
    End Sub
    

    example:

    call TimeDelay(1.9,23.9,59.9,59.9999999)
    

    hopy you enjoy.

    edit:

    here's one without any additional functions, for people who like it being faster

    Public Sub WaitTime(Days As Double, Hours As Double, Minutes As Double, Seconds As Double)
        If Days - Fix(Days) > 0 Then
            Hours = Hours + (Days - Fix(Days)) * 24
            Days = Fix(Days)
        End If
        If Hours - Fix(Hours) > 0 Then
            Minutes = Minutes + (Hours - Fix(Hours)) * 60
            Hours = Fix(Hours)
        End If
        If Minutes - Fix(Minutes) > 0 Then
            Seconds = Seconds + (Minutes - Fix(Minutes)) * 60
            Minutes = Fix(Minutes)
        End If
        If Seconds >= 60 Then
            Seconds = Seconds - 60
            Minutes = Minutes + 1
        End If
        If Minutes >= 60 Then
            Minutes = Minutes - 60
            Hours = Hours + 1
        End If
        If Hours >= 24 Then
            Hours = Hours - 24
            Days = Days + 1
        End If
        Application.Wait _
        ( _
            Now + _
            TimeSerial(Hours + Days * 24, Minutes, 0) + _
            Seconds * TimeSerial(0, 0, 1) _
        )
    End Sub
    
    0 讨论(0)
提交回复
热议问题