Option Explicit
Public Sub repeatMacro()
Dim LastRow As Long
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
LastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
ws.Range("A1").Value = Format(Now, "hh:mm:ss")
ws.Range("A" & LastRow + 1) = Range("A1").Value
Application.OnTime Now + TimeValue("00:00:03"), "repeatMacro"
End Sub위 코드는 Application.OnTime 사용하여 매 3초마다 현재시각을 A1에 갱신해줍니다.
정말 매 3초마다 반복실행하는 지 알아보려고
이 갱신된 시간정보 A1 값을 누적기록해 봤습니다.
매3초마다 기록을 하므로 누적기록에는
위/아래 행도 3초의 차이가 나야 합니다.
그리고 1분당 라인 20개가 추가되어야 하죠. 60초는 3초가 20번 잇으니까요.
예를 들어 오전 10:00:00 에 실행버튼 누르면
10:00:00
10:00:03
10:00:06
10:00:09
.
.
이런식으로 누적기록해 가야 합니다. 그런데 실제로 해보면
10:00:00
10:00:31 <----- 위/아래가 30초 차이가 남. 즉 30초동안 실행안함
10:01:01 <--- 그러다 또 잘 되기도 함.
10:01:03
.
.
실제 실행해보면 3초마다 일때도 있고, 10초마다 일때도 있고, 가끔은 1초에 서너번을 갱신할 때도 있고.. 시간이 정말 지 멋대로입니다.
한두번 1초 정도 안맞는건 일시적인 CPU할당때문이라고 이해하겠는데... 이건 뭐 너무 터무니없게 안맞아
- 첨부파일을 올려놓았으니 직접 실행해보시면 압니다.
- 컴마다 달라 어떤 컴에서는 잘 될수도 있어서 제 컴에서의 캡쳐파일을 올려드리겟습니다.
- 혹시 내컴에서는 잘 되는데요? 라는 분이시면 [ 잘 된다고 ] 말씀해주시면 고맙겠습니다.
시간이 왜 안맞는지 그 이유가 무엇이고 해결책을 알려주시면 고맙겠습니다.


그래서 AI에게 조언을 구했습니다.
AI 답변은 참고만 하세요.
[Gemini 의견]
해당 VBA 코드의 실행 주기가 일정하지 않은 이유는
Application.OnTime메서드의 작동 방식과 Excel의 다른 작업 처리 방식 때문입니다. 🕒Application.OnTime은 지정된 시간에 매크로를 실행하도록 예약하는 기능이지만, Excel이 다른 작업을 처리 중일 때는 예약된 시간이 되더라도 즉시 매кро를 실행하지 못할 수 있습니다. 즉, 매크로 실행이 지연될 수 있습니다.주요 원인
Excel의 작업 처리: 사용자가 셀을 편집하거나, 다른 매크로가 실행 중이거나, 복잡한 계산이 진행 중인 경우 Excel은 현재 작업을 먼저 처리합니다. 이로 인해
Application.OnTime으로 예약된repeatMacro의 실행이 뒤로 밀리게 됩니다.코드 실행 시간:
repeatMacro코드 자체가 실행되는 데 걸리는 미세한 시간도 오차를 발생시킬 수 있습니다. 코드가 실행을 완료하고 다음 실행을 예약하는 과정에서 정확히 3초가 아닌, 3초보다 약간 더 긴 시간이 소요될 수 있습니다.시스템 성능: 컴퓨터의 전반적인 성능이나 다른 프로그램의 실행 상태도 Excel의 반응성에 영향을 주어 매크로 실행 주기에 변동을 일으킬 수 있습니다.
해결 방안: 다음 실행 시간을 명확히 지정하기
현재 코드는 매크로가 끝나는 시점에서 다시 3초 뒤를 예약합니다 (
Now + TimeValue("00:00:03")). 이 방식은 실행 지연이 발생할 경우 그 오차가 계속 누적됩니다.더 정확한 주기를 위해서는 다음 실행될 시간을 미리 계산하고, 그 시간을 기준으로
Application.OnTime을 예약하는 것이 좋습니다. 이를 위해 전역 변수나 정적 변수를 사용하여 다음 실행 시간을 저장하고 관리할 수 있습니다.아래는 수정된 코드 예시입니다.
VBA
수정된 코드의 작동 방식:
**
StartMacro**를 실행하여 매크로를 시작합니다.**
RepeatMacro**가 실행될 때마다,Now를 기준으로 다음 시간을 정하는 대신 미리 계산된NextRunTime을 기준으로 다음 실행 시간을 예약합니다.이렇게 하면 중간에 약간의 지연이 발생하더라도, 다음 실행은 원래 계획했던 시간(예: 12:00:00, 12:00:03, 12:00:06...)에 최대한 맞춰지려고 시도하므로 오차가 누적되지 않고 주기가 더 일정하게 유지됩니다.
매크로를 중지하고 싶을 때는 **
StopMacro**를 실행하여 예약된 작업을 취소할 수 있습니다.https://chatgpt.com/
https://grok.com/
https://gemini.google.com/
https://www.perplexity.ai/
https://claude.ai/
https://chat.deepseek.com/