VBA FileSystemObject로 파일을 백업하고 결과를 검산하는 방법

VBA FileSystemObject로 파일을 백업하고 결과를 검산하는 과업을 고정 예제로 진행합니다. ZIP의 source/monthly-report.txt 한 파일을 통합 문서 옆 backup/2026-09-02/monthly-report.txt로 복사하고, 원본과 백업이 모두 존재하며 바이트 크기가 같은지 확인하는 것이 완료 조건입니다.

실행 범위는 Windows Excel의 매크로 사용 통합 문서입니다. 준비물은 이 글의 예제 ZIP, 직접 내용을 확인한 .xlsm 파일, VBA 편집기입니다. 실제 회사 파일, 네트워크 공유, 개인정보는 사용하지 않습니다.

Microsoft FileSystemObject object 문서는 Scripting.FileSystemObject가 파일 시스템 접근을 제공하며 BuildPath, CopyFile, CreateFolder, FileExists, FolderExists, GetFile 같은 메서드를 제공한다고 설명합니다.

Microsoft CreateFolder method 문서는 지정 폴더를 만들며 이미 존재하는 폴더를 다시 만들면 오류가 발생한다고 설명합니다.. 예제는 FolderExists로 확인한 뒤 CreateFolder를 호출합니다.

Microsoft CopyFile method 문서는 원본·대상·덮어쓰기 인수를 설명하고, 복수 파일 처리 중 첫 오류에서 중단되며 앞선 복사를 자동으로 되돌리지 않는다고 명시합니다. 문서 확인일은 2026-09-02입니다.

고정 폴더 구조와 합격 값

ZIP을 풀면 다음 구조가 됩니다. 매크로 사용 통합 문서는 ZIP을 푼 최상위 폴더에 직접 저장합니다.

가상 원본52바이트의 백업 경로와 존재·크기 비교 기대값을 설명하는 도해
가상 예제의 설명용 도해이며 실제 Excel·VBA 실행 화면이나 실행 성공 증빙이 아닙니다.

주제 개요와 전체 흐름

fso-backup-example/
├── FsoBackupExample.bas
├── EXPECTED.md
├── source/
│ └── monthly-report.txt
└── backup/ 실행 전에는 없어도 됨

매크로 실행 결과로 backup/2026-09-02/monthly-report.txt가 생겨야 합니다. 직접 실행 창에는 SOURCE_EXISTS=True, DESTINATION_EXISTS=True, SIZE_MATCH=True가 각각 한 번 표시되어야 합니다. 원본 파일 내용은 가상 부서 3행이고 삭제·이동 작업은 수행하지 않습니다.

8단계 실행 순서

1. ZIP을 빈 로컬 폴더에 풉니다.

2. source/monthly-report.txt가 존재하고 가상 데이터만 담겼는지 확인합니다.

3. 같은 폴더에 새 Excel 파일을 만들고 매크로 사용 통합 문서 형식인 .xlsm으로 저장합니다.

4. VBA 편집기에서 FsoBackupExample.bas를 가져옵니다.

5. 상수 TEST_RUN_KEY가 2026-09-02인지, 코드에 DeleteFile이나 MoveFile이 없는지 확인합니다.

6. 직접 실행 창을 연 뒤 BackupFixedSample을 한 번 실행합니다.

7. backup/2026-09-02/monthly-report.txt의 존재와 크기를 원본과 비교합니다.

8. 세 상태 값이 모두 True이고 오류 메시지가 없을 때만 완료로 기록합니다.

원본 존재 확인 후 폴더를 보장하고 단일 파일을 복사하는 절차 도해
가상 예제의 설명용 도해이며 실제 Excel·VBA 실행 화면이나 실행 성공 증빙이 아닙니다.

단계별 실행 절차

매크로 실행 허용 여부는 조직의 보안 정책을 따릅니다. 출처를 모르는 파일의 매크로를 활성화하거나 보안 경고를 우회하는 절차는 이 글에 포함하지 않습니다.

그대로 가져올 VBA 모듈

아래 코드는 다운로드 ZIP의 FsoBackupExample.bas와 같습니다.

원본 추가·실행 키 변경·원본 누락을 각각 재검산하는 백업 복구 도해
가상 예제의 설명용 도해이며 실제 Excel·VBA 실행 화면이나 실행 성공 증빙이 아닙니다.

점검 체크리스트

Attribute VB_Name = "FsoBackupExample"
Option Explicit
Private Const TEST_RUN_KEY As String = "2026-09-02"
Public Sub BackupFixedSample()
On Error GoTo Fail
Dim fso As Object
Dim sourceFolder As String
Dim sourcePath As String
Dim backupRoot As String
Dim backupFolder As String
Dim destinationPath As String
Dim sourceSize As Double
Dim destinationSize As Double
Set fso = CreateObject("Scripting.FileSystemObject")
sourceFolder = fso.BuildPath(ThisWorkbook.Path, "source")
sourcePath = fso.BuildPath(sourceFolder, "monthly-report.txt")
backupRoot = fso.BuildPath(ThisWorkbook.Path, "backup")
backupFolder = fso.BuildPath(backupRoot, TEST_RUN_KEY)
destinationPath = fso.BuildPath(backupFolder, "monthly-report.txt")
If Not fso.FileExists(sourcePath) Then
Err.Raise vbObjectError + 109, "BackupFixedSample", _
"원본 파일 없음: " & sourcePath
End If
EnsureFolder fso, backupRoot
EnsureFolder fso, backupFolder
fso.CopyFile sourcePath, destinationPath, True
If Not fso.FileExists(destinationPath) Then
Err.Raise vbObjectError + 110, "BackupFixedSample", _
"백업 파일 없음: " & destinationPath
End If
sourceSize = fso.GetFile(sourcePath).Size
destinationSize = fso.GetFile(destinationPath).Size
If sourceSize <> destinationSize Then
Err.Raise vbObjectError + 111, "BackupFixedSample", _
"파일 크기 불일치: " & sourceSize & " <> " & destinationSize
End If
Debug.Print "SOURCE=" & sourcePath
Debug.Print "DESTINATION=" & destinationPath
Debug.Print "SOURCE_EXISTS=True"
Debug.Print "DESTINATION_EXISTS=True"
Debug.Print "SIZE_MATCH=True"
MsgBox "백업 및 크기 검산 완료" & vbCrLf & destinationPath, vbInformation
Exit Sub
Fail:
Debug.Print "BACKUP_FAILED"
Debug.Print "ERR_NUMBER=" & Err.Number
Debug.Print "ERR_SOURCE=" & Err.Source
Debug.Print "ERR_DESCRIPTION=" & Err.Description
MsgBox "백업 실패" & vbCrLf & _
"오류 " & Err.Number & ": " & Err.Description, vbExclamation
End Sub
Private Sub EnsureFolder(ByVal fso As Object, ByVal folderPath As String)
If Not fso.FolderExists(folderPath) Then
fso.CreateFolder folderPath
End If
End Sub

ThisWorkbook.Path를 기준으로 삼기 때문에 예제 폴더를 다른 위치로 옮겨도 하위 구조가 같으면 경로를 다시 입력할 필요가 없습니다. BuildPath는 기준 폴더와 자식 이름을 결합합니다. 원본 폴더, 원본 파일, 백업 루트, 날짜 폴더, 대상 파일을 각각 분리해 경로 오류가 난 지점을 찾을 수 있게 했습니다.

입력에서 결과까지 한 번에 검산하기

입력은 source/monthly-report.txt 한 파일입니다. BackupFixedSample을 실행하면 먼저 원본 존재 여부를 검사하고, backup과 backup/2026-09-02를 순서대로 보장한 뒤 CopyFile을 한 번 호출합니다.

예상 출력은 같은 이름의 백업 파일 한 개입니다. 매크로는 출력 파일을 다시 FileExists로 확인하고, GetFile(...).Size로 원본과 대상 바이트 크기를 비교합니다. 두 크기가 다르면 완료 메시지 대신 크기 불일치 오류를 발생시킵니다. 코드의 오류 번호는 vbObjectError + 111이므로 화면의 Err.Number가 단순히 111이라고 해석하지 않습니다.

합격 값은 대상 파일 존재 True와 크기 일치 True입니다. 폴더가 생겼다는 사실만으로는 성공이 아니며, 파일 이름만 같고 크기가 다를 때도 성공으로 기록하지 않습니다. 파일 내용을 사람이 열어 원본과 같은지도 마지막으로 대조합니다.

덮어쓰기 여부를 결정하기

예제의 CopyFile sourcePath, destinationPath, True에서 마지막 True는 같은 이름의 파일이 있으면 덮어쓰기를 허용합니다. 고정 예제를 여러 번 실행해 같은 결과를 얻기 위한 설정입니다.

기존 백업을 보존해야 한다면 True를 False로 바꾸고 대상 파일명이 이미 있을 때 오류가 나는 것을 정상 보호 동작으로 취급합니다. 또 다른 방법은 실행 키에 시각이나 승인된 작업 번호를 넣어 대상 이름을 겹치지 않게 만드는 것입니다. 보존 정책을 정하지 않은 채 자동으로 오래된 백업을 지우지 않습니다.

파일 하나와 여러 파일을 구분하기

이 글은 정확한 원본 파일 한 개만 복사합니다. 와일드카드를 사용해 여러 파일을 복사하면 Microsoft 문서에 적힌 것처럼 첫 오류에서 처리가 중단될 수 있고, 그 전에 복사된 파일은 자동 롤백되지 않습니다.

복수 파일 백업이 필요하면 먼저 대상 파일 목록과 개수를 기록하고, 각 파일 복사 결과를 별도 로그에 남긴 뒤, 성공 개수와 입력 개수를 비교해야 합니다. 부분 성공 상태를 전체 성공으로 표시하지 않는 별도 프로그램이 필요하므로 현재 예제와 섞지 않습니다.

실패 증상별 복구와 재검산

실패 증상 원인 확인 복구 행동 다시 확인할 값
원본 파일 없음 source 폴더와 파일명 ZIP의 원본 파일을 제자리에 복원 SOURCE_EXISTS=True
폴더 생성 오류 상위 폴더 존재·쓰기 권한 쓰기 가능한 로컬 폴더로 예제를 이동 날짜 폴더 존재
대상 파일 읽기 전용 기존 대상 속성 기존 파일을 보존하고 새 실행 키 사용 새 대상 파일 존재
크기 불일치 원본 변경·복사 중단 원본을 닫고 새 대상 이름으로 재실행 SIZE_MATCH=True

원본 파일 없음으로 실패하면 source/monthly-report.txt를 복원한 뒤 매크로를 재실행합니다. 직접 실행 창의 이전 출력은 자동으로 지워지지 않습니다. 재실행 전에 이전 출력을 지우거나, 이번 실행으로 새로 추가된 줄만 구분해 BACKUP_FAILED가 없고 SOURCE_EXISTS=True, DESTINATION_EXISTS=True, SIZE_MATCH=True가 각각 한 번 출력되는지 다시 검산합니다.

폴더 생성 단계에서 실패하면 오류 번호와 설명을 기록합니다. 백업 경로를 임의로 관리자 폴더로 바꾸기보다, 현재 사용자가 쓸 수 있는 로컬 테스트 폴더로 전체 예제를 옮깁니다. 이동 후에도 원본과 대상 크기 비교까지 끝나야 복구 완료입니다.

적용 범위와 한계

이 예제는 Windows Excel, 로컬 폴더, 단일 텍스트 파일, 늦은 바인딩 CreateObject("Scripting.FileSystemObject")를 범위로 합니다. macOS Excel, 클라우드 동기화 충돌, 네트워크 공유 연결 끊김, 암호화 파일, 관리자 권한 폴더는 검증 범위가 아닙니다.

파일 크기 일치는 복사 누락을 찾는 기본 검산이지만 파일 내용의 암호학적 동일성을 증명하지 않습니다. 더 엄격한 보존 요구가 있다면 조직에서 승인한 해시 도구와 로그 보관 정책을 별도로 사용해야 합니다.

또한 이 매크로는 삭제·보존 기간 관리·자동 실행 예약을 하지 않습니다. 자동 삭제는 복구 불가능한 결과를 만들 수 있으므로 백업 생성과 다른 승인 단계로 분리합니다. Windows 작업 스케줄러 연결도 현재 고정 예제를 통과한 뒤 별도 과업으로 설계합니다.

입력 변경으로 회귀검사하기

첫째, 원본 파일 끝에 Finance,50을 추가합니다. 매크로를 다시 실행하면 두 파일 크기가 새 값으로 같아져야 하며, 대상 내용에도 새 행이 있어야 합니다.

둘째, TEST_RUN_KEY를 2026-09-03으로 바꿉니다. 기존 9월 2일 백업은 남고 새 날짜 폴더에 대상 파일이 하나 더 생겨야 합니다. 두 날짜 폴더의 파일을 서로 덮어쓰면 경로 조립이 잘못된 것입니다.

셋째, 원본 파일명을 잠시 monthly-report-hold.txt로 바꿉니다. 매크로는 복사를 시작하기 전에 원본 파일 없음 오류를 표시해야 합니다. 시험 뒤 이름을 복원하고 세 상태 값이 다시 True인지 확인합니다.

다음 VBA 작업으로 연결하기

복사 오류 번호별 처리를 확장하려면 VBA On Error로 오류를 기록하고 복구하는 방법에서 오류 처리 범위를 먼저 확인합니다. 폴더의 여러 통합 문서를 실제로 합쳐야 한다면 VBA로 폴더의 Excel 파일을 병합하는 방법처럼 입력 목록과 행 수 검산이 있는 별도 과업으로 나눕니다.

PDF 저장 폴더를 먼저 만드는 흐름은 VBA로 시트를 PDF로 저장하는 방법과 연결할 수 있습니다. 이 내부 글들은 후속 과업 안내이며 FileSystemObject 메서드 동작의 근거는 위 Microsoft 문서에서 확인합니다.

작성자 소개