[excel] 특정 시간 동안 일시 중지하는 방법은 무엇입니까? (Excel / VBA)

다음 매크로가있는 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