programing

엑셀 vba에서 1초 미만의 시간 지연을 제공하는 방법은 무엇입니까?

telecom 2023. 4. 25. 21:51
반응형

엑셀 vba에서 1초 미만의 시간 지연을 제공하는 방법은 무엇입니까?

나는 1초 미만의 일정 기간 후에 사건을 반복하고 싶습니다.다음 코드를 사용해 보았습니다.

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

하지만 여기서는 최소 지연 시간이 1초입니다.어떻게 반만 늦춰요?

API 호출과 Sleep을 사용할 수 있습니다.

모듈 맨 위에 다음 내용을 배치합니다.

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

그런 다음 다음과 같은 절차로 호출할 수 있습니다.

Sub test()
Dim i As Long

For i = 1 To 10
    Debug.Print Now()
    Sleep 500    'wait 0.5 seconds
Next i
End Sub

다른 사이트에서 확인했는데 작동되는지 안되는지 잘 모르겠어요.

Application.Wait Now + 1/(24*60*60.0*2)

숫자 값 1 = 1일입니다.

1/24는 한 시간입니다.

1/(24*60)은 1분입니다.

따라서 1/(24*60*60*2)는 1/2초입니다.

부동 소수점 숫자를 강제로 지정하려면 소수점을 사용해야 합니다.

원천

이것이 몇 밀리초 동안 시도해 볼 만한 가치가 있는지 확실하지 않습니다.

Application.Wait (Now + 0.000001) 

대기시간 )005)을 호출합니다.

Sub WaitFor(NumOfSeconds As Single)
    Dim SngSec as Single
    SngSec=Timer + NumOfSeconds

    Do while timer < sngsec
        DoEvents
   Loop
End sub

소스 타이밍 지연(VBA)입니다.

저는 이것을 시도해 보았고 효과가 있습니다.

Private Sub DelayMs(ms As Long)
    Debug.Print TimeValue(Now)
    Application.Wait (Now + (ms * 0.00000001))
    Debug.Print TimeValue(Now)
End Sub

Private Sub test()
    Call DelayMs (2000)  'test code with delay of 2 seconds, see debug window
End Sub

누구나 노력합니다Application.Wait하지만 그건 별로 믿을만한 게다1초 미만으로 기다리라고 하면 0에서 1 사이의 값이 나오지만 10초 가까이 됩니다.다음은 0.5초 대기 시간을 사용한 시연입니다.

Sub TestWait()
  Dim i As Long
  For i = 1 To 5
    Dim t As Double
    t = Timer
    Application.Wait Now + TimeValue("0:00:00") / 2
    Debug.Print Timer - t
  Next
End Sub

다음은 평균 0.0015625초의 출력입니다.

0
0
0
0.0078125
0

물론 타이머가 이러한 이벤트를 측정하는 이상적인 방법은 아닐 수 있지만, 여러분은 이해하실 수 있습니다.

타이머 접근 방식이 더 좋습니다.

Sub TestTimer()
  Dim i As Long
  For i = 1 To 5
    Dim t As Double
    t = Timer
    Do Until Timer - t >= 0.5
      DoEvents
    Loop
    Debug.Print Timer - t
  Next
End Sub

그리고 평균 결과는 0.5초에 매우 가깝습니다.

0.5
0.5
0.5
0.5
0.5

분명히 오래된 포스트지만, 이 포스트는 제게 효과가 있는 것 같아요.

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

필요한 만큼 나누세요.10분의 1, 100분의 1 등이 모두 효과가 있는 것 같습니다."나눗셈 기준" 부분을 제거하면 매크로가 실행되는 데 시간이 더 오래 걸리므로 오류가 발생하지 않고 작동한다고 믿어야 합니다.

답이 없어서 이걸 만들었어요

'   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

참고: Excel 2007에서는 다음과 같습니다.Now()소수점 이하 더블을 초 단위로 전송하기 위해 사용합니다.Timer()몇 밀리초를 얻습니다.

참고: Application.Wait()초를 허용하고 아래는 허용하지 않습니다(예:Application.Wait(Now())Application.Wait(Now()+100*millisecond)))

참고: Application.Wait()시스템이 다른 프로그램을 실행하도록 허용하지 않지만 성능이 거의 저하되지 않습니다.의 사용을 선호합니다.DoEvents.

그렇지 않으면 고유한 함수를 만든 후 호출할 수 있습니다.Double을 사용하는 것이 중요합니다.

Function sov(sekunder As Double) As Double

starting_time = Timer

Do
DoEvents
Loop Until (Timer - starting_time) >= sekunder

End Function

0.8초 동안 일시 중지하려면 다음과 같이 하십시오.

Sub main()
    startTime = Timer
    Do
    Loop Until Timer - startTime >= 0.8
End Sub
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

예를 들어 다음과 같습니다.

call TimeDelay(1.9,23.9,59.9,59.9999999)

즐기세요.

다음을 편집합니다.

빠른 것을 좋아하는 분들을 위해 추가 기능이 없는 것이 있습니다.

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

언급URL : https://stackoverflow.com/questions/18602979/how-to-give-a-time-delay-of-less-than-one-second-in-excel-vba 입니다.

반응형