엑셀
Application.OnTime을 이용해서 일정한 시간에 매크로 실행하기
파란바람이
2024. 8. 21. 20:07
8시 45분부터 15시 45분까지 10분 간격으로 [B48:D48] 셀 값을 [B1:D42] 셀 범위에 순차적으로 나타내기
완성 파일 다운로드
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