엑셀

Application.OnTime을 이용해서 일정한 시간에 매크로 실행하기

파란바람이 2024. 8. 21. 20:07

8시 45분부터 15시 45분까지 10분 간격으로 [B48:D48] 셀 값을 [B1:D42] 셀 범위에 순차적으로 나타내기

 

 

완성 파일 다운로드

스케줄.xlsm
0.02MB

 

스케줄-수정.xlsm
0.02MB

 

Dim cnt As Integer

Private Sub Sstart()
    Range("A" & cnt).Value = Application.WorksheetFunction.Text(Now, "hh:mm:ss")
    Range("B" & cnt).Value = Range("B48").Value
    Range("C" & cnt).Value = Range("C48").Value
    Range("D" & cnt).Value = Range("D48").Value
    
    cnt = cnt + 1
    
    Application.OnTime Now + TimeValue("00:10:00"), "Sstart"
End Sub

Public Sub SSW()
    On Error Resume Next
    
    cnt = 1
    Application.OnTime TimeValue("08:45:00"), "Sstart"
    Application.OnTime TimeValue("15:45:00"), "Sstop"
    
    On Error GoTo 0
End Sub

Private Sub Sstop()
    On Error Resume Next
    
    Application.OnTime Now + TimeValue("00:10:00"), "Sstart", , False
    
    On Error GoTo 0
End Sub

 

데이터를 나타낼 행 번호를 정하는 모듈 변수 Cnt 대신 프로시저 내에서 바로 확인하는 코드로 수정했습니다.

그리고 스케줄러에 등록하고 취소할 때 Now를 바로 쓰니 초 단위까지 1초 가량 늦게 동작하면 스케줄러에 등록된 시간과 취소하는 코드의 시간이 달라 취소가 되지 않는 경우가 있어 분 단위까지만 사용하도록 수정합니다.

Public Sub SRun()
    Application.OnTime TimeValue("08:45:00"), "SStart"
    Application.OnTime TimeValue("15:45:00"), "SStop"
End Sub

Private Sub SStart()
    If Range("A1") = "" Then
        Cnt = 1
    ElseIf Range("A2") = "" Then
        Cnt = 2
    Else
        Cnt = Range("A1").End(xlDown).Row + 1
    End If
    
    Range("A" & Cnt).Value = Format(Now, "hh:mm:ss")
    Range("B" & Cnt).Value = Range("B48").Value
    Range("C" & Cnt).Value = Range("C48").Value
    Range("D" & Cnt).Value = Range("D48").Value
    
    Application.OnTime TimeValue(Format(Now, "hh:mm")) + TimeValue("00:10:00"), "SStart"
End Sub

Private Sub SStop()
    On Error Resume Next
    
    Application.OnTime TimeValue(Format(Now, "hh:mm")) + TimeValue("00:10:00"), "SStart", , False
    
    On Error GoTo 0
End Sub