-
[Excel] Application.OnTime 기반 자동 저장(버전 저장) 매크로업무 자동화/Excel 2025. 12. 22. 21:14

일정 주기마다 현재 작업 중인 통합 문서를 다른 이름으로 자동 저장(백업/버전 저장) 하는 VBA 예시입니다.
Application.OnTime의 정확한 예약 시각을 저장/취소하도록 구성해, 파일을 닫은 뒤에도 타이머가 남아 경고가 뜨는 문제를 예방합니다.동작 개요
- 지정 폴더로 저장 경로 고정
- 지정 간격(초)마다 자동 실행
- 현재 통합 문서를
파일명_1.xlsx,파일명_2.xlsx… 형태로SaveCopyAs저장 - 통합 문서 닫을 때 타이머 자동 중지(권장)
핵심 포인트
OnTime취소는 “예약했던 정확한 시각”으로만 가능합니다Application.OnTime은 예약할 때의 EarliestTime(예약 시각)과 동일한 값으로만 취소됩니다.
따라서 다음 실행 시각을 전역 변수(NextRunTime)로 저장하고, 중지 시 그 값으로 취소해야 안정적입니다.
적용 코드
1) 표준 모듈(예: Module1)에 붙여넣기
Option Explicit ' 글로벌 변수 Public SavePath As String Public SaveInterval As Long Public IsTimerRunning As Boolean Public SaveCounter As Long Public NextRunTime As Date '예약 시각 저장(중지 시 필수) ' 자동 저장 시작 Public Sub StartAutoSave() ' 저장 경로(원하시는 경로로 수정) SavePath = "C:\Users\Desktop\Test" ' 저장 간격(초) SaveInterval = 10 ' 폴더가 없으면 생성 On Error Resume Next MkDir SavePath On Error GoTo 0 If SaveCounter = 0 Then SaveCounter = 1 ' 이미 실행 중이면 먼저 중지 후 재시작 If IsTimerRunning Then StopAutoSave IsTimerRunning = True ScheduleNextRun MsgBox "자동 저장이 시작되었습니다." & vbCrLf & _ "저장 경로: " & SavePath & vbCrLf & _ "저장 간격: " & SaveInterval & "초" & vbCrLf & _ "시작 넘버링: _" & SaveCounter, vbInformation, "자동 저장" End Sub ' 자동 저장 중지 Public Sub StopAutoSave() On Error Resume Next If IsTimerRunning Then '반드시 저장해둔 NextRunTime으로 취소해야 정상적으로 중지됩니다. Application.OnTime EarliestTime:=NextRunTime, _ Procedure:="'" & ThisWorkbook.Name & "'!AutoSaveWorkbook", _ Schedule:=False End If On Error GoTo 0 IsTimerRunning = False Application.StatusBar = False MsgBox "자동 저장이 중지되었습니다.", vbInformation, "자동 저장" End Sub ' 넘버링 초기화 Public Sub ResetCounter() SaveCounter = 1 MsgBox "저장 넘버링이 _1로 초기화되었습니다.", vbInformation, "자동 저장" End Sub ' 다음 실행 예약 Private Sub ScheduleNextRun() NextRunTime = Now + TimeSerial(0, 0, SaveInterval) Application.OnTime EarliestTime:=NextRunTime, _ Procedure:="'" & ThisWorkbook.Name & "'!AutoSaveWorkbook", _ Schedule:=True End Sub ' 자동 저장 본체 Public Sub AutoSaveWorkbook() If Not IsTimerRunning Then Exit Sub ' 다음 예약(연속 실행) ScheduleNextRun Dim wb As Workbook Set wb = ActiveWorkbook If wb Is Nothing Then Exit Sub Dim baseName As String If wb.Path = "" Then baseName = "새문서" Else baseName = Left(wb.Name, InStrRev(wb.Name, ".") - 1) End If Dim fullSavePath As String fullSavePath = SavePath & "\" & baseName & "_" & SaveCounter & ".xlsx" On Error GoTo EH wb.SaveCopyAs fullSavePath SaveCounter = SaveCounter + 1 Application.StatusBar = "자동 저장 완료: " & fullSavePath & " (" & Format(Now, "yyyy-mm-dd hh:nn:ss") & ")" Application.OnTime Now + TimeSerial(0, 0, 3), "'" & ThisWorkbook.Name & "'!ClearStatusBar" Exit Sub EH: MsgBox "파일 저장 중 오류: " & Err.Description, vbCritical, "자동 저장 오류" End Sub ' 상태바 지우기 Public Sub ClearStatusBar() Application.StatusBar = False End Sub2)
ThisWorkbook에 “닫을 때 자동 중지” 추가(권장)VBE(Alt+F11) →
ThisWorkbook더블 클릭 → 아래 코드 추가:Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next StopAutoSave End Sub
사용 방법
- 엑셀에서
Alt + F11→ VBA 편집기 열기 - 표준 모듈(삽입 → 모듈)에 코드 붙여넣기
ThisWorkbook에 닫기 이벤트 코드 추가StartAutoSave실행 → 자동 저장 시작- 필요 시
StopAutoSave실행 → 자동 저장 중지 - 넘버링을 다시 1부터 시작하려면
ResetCounter실행
'업무 자동화 > Excel' 카테고리의 다른 글
[Excel] VBA 행/열 자동 맞춤 (0) 2026.01.26 [Excel] 실무에서 가장 많이 쓰는 붙여넣기 옵션 6가지 (Ctrl 붙여넣기) (0) 2026.01.05 [Excel] 기준 날짜(I2) + E열 입력으로 G열 날짜 색상 자동 표시하기 (0) 2025.12.12 [Excel] 열의 시작 셀에서 마지막 셀 선택하기 (0) 2025.11.10 [Excel] 매크로 편집 시 [숨기기 취소] 오류 문제 해결 (0) 2025.11.07