ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 Sub

    2) ThisWorkbook에 “닫을 때 자동 중지” 추가(권장)

    VBE(Alt+F11) → ThisWorkbook 더블 클릭 → 아래 코드 추가:

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        On Error Resume Next
        StopAutoSave
    End Sub

    사용 방법

    1. 엑셀에서 Alt + F11 → VBA 편집기 열기
    2. 표준 모듈(삽입 → 모듈)에 코드 붙여넣기
    3. ThisWorkbook에 닫기 이벤트 코드 추가
    4. StartAutoSave 실행 → 자동 저장 시작
    5. 필요 시 StopAutoSave 실행 → 자동 저장 중지
    6. 넘버링을 다시 1부터 시작하려면 ResetCounter 실행
Designed by Tistory.