VBA – Wait 함수와 Sleep 함수
이 튜토리얼에서는 VBA의 Wait 및 Sleep함수를 사용하여 코드를 일시 중지/지연하는 방법을 보여드립니다.
복잡한 계산을 수행하거나 외부 프로그램을 호출하여 실행하는 VBA 프로그램을 만들 때 외부 프로세스가 진행되는 동안 VBA 코드가 특정 시간 동안 실행을 중지해야 할 수 있습니다. VBA에는 이를 위해 사용할 수 있는 몇 가지 방법이 있습니다.
Application.Wait 메서드 사용하기
다음 단계를 실행하기 전에 매크로 실행을 일정 시간 동안 또는 지정된 시간에 도달할 때까지 일시 중지해야 하는 경우 Application.Wait 메서드를 사용할 수 있습니다. 예를 들어 웹사이트 로그인 프로세스를 자동화했는데 페이지가 로드될 때까지 몇 초간 기다렸다가 매크로를 계속 실행해야 하는 경우에 유용할 수 있습니다.
1초 대기
매크로에 아래 코드를 포함하면 매크로 실행이 약 1초 동안 일시 중지됩니다:
Application.Wait (Now + TimeValue("0:00:01"))
특정 시간까지 대기
특정 시간까지 기다려야 하는 경우도 있습니다. 아래 코드를 사용하면 오전 9시 이전에는 매크로가 실행되지 않습니다:
Application.Wait "09:00:00"
Application.Wait는 1초 미만의 지연은 사용할 수 없다는 점에 유의하세요.
Sleep 메서드 사용하기
매크로를 보다 정교하게 일시 중지하려면 Sleep 메서드를 사용할 수 있습니다.
Sleep 함수는 Windows API 함수이며 VBA의 내장 함수가 아닙니다. 특수 선언문을 사용하여 액세스할 수 있습니다.
64비트 버전의 Microsoft Office를 사용하는 경우 다음 문을 새 모듈에 삽입하거나 Sleep 함수를 사용하려는 모듈의 시작 부분(서브루틴에 직접 삽입하지 않음)에 삽입할 수 있습니다:
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)
32비트 버전에서는 아래 코드를 사용합니다:
Public Declare Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)
Sleep 함수를 선언한 후에는 다음과 같은 방식으로 이 함수에 액세스할 수 있습니다:
Sleep 10000
위의 코드를 사용하면 매크로가 10,000밀리초, 즉 10초 동안 일시 중지됩니다.
Do Events문을 반복문에 사용하기
Wait 및 Sleep 메서드 사용의 가장 큰 단점은 매크로가 계속 실행되기를 기다리는 동안 사용자가 Excel에서 아무 작업도 할 수 없다는 것입니다. 사용자는 Excel이 응답을 멈췄다고 생각할 수 있습니다. Ctl+Break를 사용하여 매크로를 중단할 수 있지만 이렇게 하면 일시 중지를 설정한 목적이 의미 없어집니다.
이 문제를 해결하기 위해 DoEvents라는 메서드가 포함된 루프를 사용할 수 있습니다.
Public Sub Test()
Dim i As Long
For i = 1 To 20000
Range(“A1”).Value = i
DoEvents
Next i
End Sub
이제 Excel이 위의 매크로를 실행하는 동안 사용자는 탭을 변경하거나 셀 서식을 지정하는 등 Excel과 계속 상호 작용할 수 있습니다. 기본적으로 매크로는 계속 실행되지만 Excel 화면은 정지되지 않습니다. 비슷한 루프를 사용하여 Excel에 타이머 함수를 만들고 여기에 DoEvents 메서드를 통합하여 타이머가 실행되는 동안 화면 고정을 해제할 수 있습니다.