다음 매크로가있는 Excel 워크 시트가 있습니다. 매초마다 반복하고 싶지만 그 기능을 찾을 수 있다면 위험합니다. 가능하지 않나요?
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
'Here I want to wait for one second
Loop
End Sub
답변
대기 방법을 사용하십시오 .
Application.Wait Now + #0:00:01#
또는 (Excel 2010 이상) :
Application.Wait Now + #12:00:01 AM#
답변
이것을 모듈에 추가하십시오.
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
또는 64 비트 시스템의 경우 다음을 사용하십시오.
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
다음과 같이 매크로에서 호출하십시오.
Sub Macro1()
'
' Macro1 Macro
'
Do
Calculate
Sleep (1000) ' delay 1 second
Loop
End Sub
답변
사용하는 대신:
Application.Wait(Now + #0:00:01#)
나는 선호한다:
Application.Wait(Now + TimeValue("00:00:01"))
나중에 읽기가 훨씬 쉽기 때문입니다.
답변
이것은 나를 위해 완벽하게 작동합니다. “do until”루프 앞이나 뒤에 코드를 삽입합니다. 귀하의 경우에는 do 루프 안쪽 끝에 5 줄 (time1 = & time2 = & “do until”루프)을 넣으십시오.
sub whatever()
Dim time1, time2
time1 = Now
time2 = Now + TimeValue("0:00:01")
Do Until time1 >= time2
DoEvents
time1 = Now()
Loop
End sub
답변
kernel32.dll의 Sleep 선언은 64 비트 Excel에서 작동하지 않습니다. 이것은 좀 더 일반적입니다.
#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
답변
클레 모 코드의 정리 된 버전-Access에서 작동하며 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
답변
제시된 대부분의 솔루션은 현재 초 카운트가 시작된 이후 이미 경과 된 시간 (밀리 초)을 고려하지 않는 Application.Wait를 사용하므로 최대 1 초의 본질적인 부정확성을 갖습니다 .
타이머 접근 방식이 최선의 해결책 이지만 자정에 재설정을 고려해야하므로 타이머를 사용하는 매우 정확한 절전 방법이 있습니다.
'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
이 기능을 사용하여 모든 수면 기능을 테스트하십시오. (디버그 직접 실행 창 열기 : 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