• 최초 작성일: 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.

어떤 책은 그 맛만 보고, 어떤 책은 그것을 삼키고, 그리고 어떤 소수의 책들은 잘 씹어서 소화 시켜야 한다.

권현욱(엑셀러)
저자: 권현욱(엑셀러), 아이엑셀러 대표

필자는 Excel 컨설턴트, 작가, 그리고 크리에이터입니다. 현재 Microsoft Excel MVP이며, 『챗GPT+엑셀 업무자동화 정석』을 비롯한 10여 권의 도서를 집필했습니다. Excel 자동화 및 생산성 향상 분야에서 25년 넘는 경력을 보유하고 있습니다.

권현욱(엑셀러) 님의 최신 포스트:
  • 최신 글을 불러오는 중...


26년 경력 Microsoft MVP 권현욱(엑셀러) 대표 직강 1강 무료

🎁 파워툴스 마스터클래스 · 엑셀 바이브 코딩

AI에게 말로 지시해서 '나만의 엑셀 도구'를 만들고 리본에 장착합니다.

  • 코딩 지식 없이 시작 · 코드는 AI가 작성
  • 엑셀 리본에 내 탭과 버튼을 만들고 XLAM으로 공유
  • 1강 무료 수강 가능
수강 신청하기 강의 소개 보기

특정 폴더 내의 파일 전부 삭제하기

핵심 요약: 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도 가능합니다.

마치며

파일을 삭제하는 코드는 되돌릴 수 없으므로 대상 폴더와 파일을 반드시 확인한 다음 실행하시기 바랍니다.