- 최초 작성일: 2002-11-20
- 최종 수정일: 2026-09-30
- 조회수: 9 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 특정 폴더 내의 파일 전부 삭제하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
Some books are to be tasted, others to be swallowed, and some few to be chewed and digested.
어떤 책은 그 맛만 보고, 어떤 책은 그것을 삼키고, 그리고 어떤 소수의 책들은 잘 씹어서 소화 시켜야 한다.
특정 폴더 내의 파일 전부 삭제하기
핵심 요약: VBA로 파일 삭제하기
파일 하나는 FileSystemObject의 DeleteFile 또는 Kill 문으로 삭제할 수 있고, 폴더 내 모든 파일은 파일 목록을 얻은 다음 하나씩 Kill로 삭제합니다.
- 1단계: VB Editor의 도구-참조에서 Microsoft Scripting Runtime을 참조합니다(사전 참조).
- 2단계: FSO.DeleteFile 또는 Kill 문으로 파일을 삭제합니다.
- 3단계: 폴더 내 파일 경로를 배열에 담아 For Each로 순환하며 삭제합니다.
Step 1: 어떤 질문이었을까요?
파일 탐색기나 '열기' 대화상자에서 엑셀 파일을 삭제하듯이, VBA에서도 파일을 삭제하는 작업을 코드로 처리할 수 있느냐는 질문이 있었습니다.
답을 드리자 이어서 '삭제'와 관련된 도움말을 뒤져 보니 Kill 문이 나오더라, 그런데 Kill "C:\My Document\*.xls"처럼 원하는 폴더의 파일을 지워도 되겠느냐, 그리고 도움말에 나오는 FileSystemObject의 DeleteFile 메서드는 어떻게 써야 하느냐는 질문이 이어졌습니다.
Step 2: FileSystemObject란?
FileSystemObject는 외부 참조 목록이라고 생각하시면 됩니다. 즉 엑셀 외부에 있는 지원군인 셈이지요.
외부 라이브러리 파일을 불러올 때 VB Editor의 '도구-참조' 메뉴에서 '사용 가능한 참조'를 선택해 보면 많은 참조 가능한 목록들이 나타날 것입니다. 이 중에서 FileSystemObject는 Scrrun.dll 이라는 동적 라이브러리 연결 파일에 포함되어 있는 오브젝트 입니다. 아래의 예제는 FileSystemObject를 사용해서 파일을 지우는 에제입니다.
명심하셔야 될 것이… VB Editor의 '도구-참조' 메뉴에서 Microsoft Scripting Runtime을 미리 참조해 두셔야 합니다. 안 그러면 어김없이... 에러가 납니다. 이와 같은 Design-time에 참조를 미리 지정하는 것을 사전 참조(Early Binding)라고 한다는 것은 아시지요? 물론 이것을 Run-time에 참조를 하도록 할 수도 있습니다. Early Binding과 Late Binding에 대해서는 예전 강좌를 직접 찾아보도록 하세요.
그건 그렇고… 버튼을 눌러 보세요.
본 강좌 파일을 열었을 때 자동으로 생성되었던 ExcelLogInOut.txt 라는 파일이 삭제되었지요?
Sub DelFileByFSO()
Dim FSO As Scripting.FileSystemObject
Dim strFile As String
Dim strPath As String
Set FSO = New Scripting.FileSystemObject
' FileSystemObject라는 외부 지원군을 빌려옵니다. 나머지 부분은 별로 특이한 것이 없고…
strPath = ThisWorkbook.Path & Application.PathSeparator
strFile = strPath & "ExcelLogInOut.txt"
On Error GoTo ET
FSO.deletefile strFile
MsgBox strFile & "파일을 제거하였습니다", , "www.iExceller.com"
ET:
If Err.Number <> 0 Then
MsgBox Err.Description, , "Error 코드 : " & Err.Number
Err.Clear
End If
End Sub
Step 3: 특정 폴더 안의 파일 전부 삭제하기
이번에는 FSO 오브젝트를 이용하여 강좌 제목처럼 특정 폴더 내의 모든 파일을 단번에 샥~ 지워 보도록 합니다. 어떤 폴더를 지워볼까 하다가… 아무래도 임시 파일들이 보관되어 있는 Temporary 폴더 내의 (삭제가능한) 모든 파일들을 지우도록 해 볼까요?
주의: 아래 코드는 Windows의 Temporary 폴더 안에 있는 삭제 가능한 모든 파일을 지웁니다. 혹시 그 폴더에 중요한 파일을 복사해 두셨다면 다른 곳으로 옮기시거나, 코드를 실행하지 말고 눈으로만 확인하시기 바랍니다.
Sub DelAllFilesByFSO()
Dim FSO As FileSystemObject
Dim varTemp As Variant
Dim varMyTemp As Variant
Dim strFolder As String
Set FSO = New Scripting.FileSystemObject
strFolder = FSO.GetSpecialFolder(TemporaryFolder)
' Temporary 폴더 명을 알아낸 다음 strFolder라는 문자열 변수에 담아 둡니다.
MsgBox strFolder & " 폴더 내의 모든 파일을 삭제합니다", , "VB0178//www.iExceller.com"
varMyTemp = GetFileName(strFolder)
' GetFileName 이라는 사용자 정의 함수를 실행시키고 그 결과값을 가져와서 varMyTemp 라는
' Variant 타입 변수에 저장합니다.
On Error Resume Next
For Each varTemp In varMyTemp
If Len(varTemp) > 0 Then Kill CStr(varTemp)
Next varTemp
On Error GoTo 0
MsgBox strFolder & " 폴더 내의 삭제가능한 모든 파일(들)을 제거하였습니다", , "VB0178//www.iExceller.com"
Set FSO = Nothing
' 작업이 끝난 후 메모리를 비웁니다.
End Sub
다음… 위의 프로시저에서 호출한 GetFileName 이라는 사용자 정의 함수를 살펴봅니다.
Function GetFileName(strDir As String) As Variant
Dim FSO As New Scripting.FileSystemObject
Dim colFiles As New Collection
Dim FileList() As String
Dim i As Long
On Error Resume Next
If strDir = "" Then Exit Function
' strDir, 즉 윈도우 시스템의 Temporary 폴더(하위 폴더 포함)를 검색하여 파일 경로들을 컬렉션에 담습니다.
CollectFiles FSO.GetFolder(strDir), colFiles
' 담아다가 뭐 하느냐구요? 함수 수행 결과값을 다시 DelAllFilesByFSO 프로시저에서 GetFileName
' 프로시저를 호출한 곳으로 넘겨서 지우도록 만드는 것입니다.
If colFiles.Count = 0 Then
ReDim FileList(0)
Else
ReDim FileList(1 To colFiles.Count)
For i = 1 To colFiles.Count
FileList(i) = colFiles(i)
Next i
End If
GetFileName = FileList
Erase FileList
' 발견된 파일들을 배열 변수에 저장하고 그 결과를 GetFileName 함수의 결과값으로 돌려줍니다.
' 그리고 나서 배열을 메모리에서 지워줍니다.
End Function
Private Sub CollectFiles(fld As Scripting.Folder, colFiles As Collection)
Dim fil As Scripting.File
Dim fldSub As Scripting.Folder
For Each fil In fld.Files
colFiles.Add fil.Path
Next fil
For Each fldSub In fld.SubFolders
CollectFiles fldSub, colFiles
Next fldSub
End Sub
참고: 원래 이 강좌에서는 파일 검색에 Application.FileSearch 개체(VB0044 강좌 참조)를 사용했습니다. 이 개체는 Excel 2007 이후 버전에서 제거되었으므로 위 코드에서는 같은 역할을 하는 FileSystemObject의 Folder, Files 개체로 대체했습니다.
오늘은 여기까지…
정리 — 파일 삭제 핵심 코드
| 구분 | 사용한 코드 | 역할 |
|---|---|---|
| FSO 생성 | New Scripting.FileSystemObject | 외부 개체 사용 |
| 파일 하나 삭제 | FSO.DeleteFile strFile | 지정 파일 삭제 |
| 특수 폴더 | FSO.GetSpecialFolder(TemporaryFolder) | Temporary 폴더 경로 |
| 일괄 삭제 | Kill CStr(varTemp) | 파일 경로별 삭제 |
| 오류 무시 | On Error Resume Next | 삭제할 수 없는 파일 건너뛰기 |
자주 묻는 질문 (FAQ)
Q1. FileSystemObject는 무엇인가요?
Scrrun.dll 라이브러리에 들어 있는 개체로, 엑셀 외부에서 파일과 폴더를 다루는 기능을 빌려 쓸 수 있게 해 줍니다. 사전 참조를 위해 Microsoft Scripting Runtime을 참조해야 합니다.
Q2. Kill 문으로 폴더 안의 파일을 지울 수 있나요?
Kill 문에 폴더 경로와 와일드카드를 함께 지정하면 여러 파일을 지울 수 있습니다. 삭제된 파일은 휴지통으로 가지 않으므로 신중하게 사용해야 합니다.
Q3. Early Binding이란 무엇인가요?
디자인 타임에 도구-참조로 라이브러리를 미리 지정하는 방식을 사전 참조라고 합니다. 실행할 때 개체를 만들어 참조하는 Late Binding도 가능합니다.
마치며
파일을 삭제하는 코드는 되돌릴 수 없으므로 대상 폴더와 파일을 반드시 확인한 다음 실행하시기 바랍니다.