엑셀 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 입니다.
'programing' 카테고리의 다른 글
여러 bash 스크립트에서 pushd/popd 스택을 표시하지 않습니다(quiet pushd/popd). (0) | 2023.04.25 |
---|---|
csv 파일의 열 하나를 추출하는 방법입니다. (0) | 2023.04.25 |
web.config에서 세션 시간 초과를 설정하려면 다음과 같이 하십시오. (0) | 2023.04.25 |
WPF List View - 선택한 항목을 클릭했을 때 감지 (0) | 2023.04.20 |
Mac OS X 클립보드에 bash 출력을 캡처하려면 어떻게 해야 합니까? (0) | 2023.04.20 |