• 최초 작성일: 2000-09-20
  • 최종 수정일: 2026-09-30
  • 조회수: 14 회
  • 작성자: 권현욱 (엑셀러)
  • 강의 제목: 하위폴더 동시 검색하기

들어가기 전에

오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.

강의41(VB)에서요.
선택한 폴더의 하위 폴더 내의 파일들도 모두 검색하게 하려면 어떻게 해야 하나요.
추석 편안히 쉬시고 오셔서 답변주세요.

왜 이런 질문이 안 오나 했습니다. ^^ 버튼을 눌러 보세요.

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

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

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


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

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

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

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

하위폴더 동시 검색하기

핵심 요약: 하위 폴더까지 검색하기

FileSearch 오브젝트에서 SearchSubFolders를 True로 지정하면 하위 폴더의 파일까지 한꺼번에 검색할 수 있습니다.

  • 1단계: NewSearch로 초기화하고 LookIn, Filename을 지정합니다.
  • 2단계: SearchSubFolders = True로 하고 Execute합니다.
  • 3단계: FoundFiles를 순회하며 파일명, 크기, 작성일자를 기록합니다.

Step 1: FileSearch 오브젝트

이 작업은 FileSearch라는 Object를 사용함으로써 가능합니다. 그런데 이 오브젝트는 Excel 2000 버전부터 지원이 됩니다. FileSearch 오브젝트의 주요 속성 또는 메서드를 살펴보자면,

속성/Method설명
FileName검색할 파일이름(또는 종류) 지정. Wildcard 문자 사용 가능
FoundFile파일이름(종류)를 포함하고 있는 오브젝트를 Return시킴
LookIn검색할 폴더 지정
SearchSubFolders하위 폴더를 검색할 것인지 여부 결정(True이면 검색)
ExcuteSearch 시작
NewSearchFileSearch 오브젝트를 초기화(Reset)시킴

이렇게 여섯 가지로 요약될 수 있습니다. 뭐가 뭔지 말로는 이해가 안되시지요? 코드를 통해 살펴보도록 하지요.

Step 2: 폴더 입력 방식 코드

Sub SearchSubFolders()
    Dim Msg As String
    Dim strDir As String
    Dim i As Integer
    Dim r As Integer

    strDir = Trim(InputBox("검색할 폴더명을 입력하세요", "http://www.iexceller.com"))
    '//변수를 선언하는 것과 폴더명을 입력받는 부분은 지난 시간과 그전 시간에 이미 설명드린
    '//것입니다.

    If strDir = "" Then
        MsgBox "폴더가 선택되지 않았습니다", , "폴더 선택//Exceller"
        Exit Sub
    End If
    If Trim(Right(strDir, 1)) <> "\" Then strDir = strDir & "\"
    '//사용자가 InputBox에 아무 것도 입력하지 않았거나 폴더명 뒤에 \를 기재하지 않았을
    '//경우에 대비한 에러 처리를 위한 부분입니다.

    Worksheets.Add after:=Sheets("Preface")
    r = 1
    Cells(r, 1) = "파일명"
    Cells(r, 2) = "크기"
    Cells(r, 3) = "작성일자"
    Range("A1:C1").Font.Name = "Arial"
    r = r + 1
    '//새로운 시트에 타이틀 부분을 적은 다음, 본격적으로 현재 폴더와 하위 폴더의 파일들을
    '//검색합니다.

    On Error Resume Next
    With Application.FileSearch
        .NewSearch
        .LookIn = strDir
        .Filename = "*.xls"
        .SearchSubFolders = True
        '//여기서 Filename을 "*.*"로 지정하면 당연히 모든 파일을 검색하겠지요? 그리고
        '//SearchSubFolders=False로 하면 현재 폴더만 검색을 하므로 True로 지정을 합니다.
        .Execute

        For i = 1 To .FoundFiles.Count
            Cells(r, 1) = .FoundFiles(i)
            Cells(r, 2) = FileLen(.FoundFiles(i))
            Cells(r, 3) = FileDateTime(.FoundFiles(i))
            r = r + 1
            '//발견한 파일들에 대해서 For~Next 반복문에 의해 각 파일의 기본 정보들을 워크시트
            '//상의 셀에 차례대로 기록을 합니다.
        Next i
    End With

    '//아래의 코드는 출력한 내용에 대해 모양을 꾸미기 위한 부분입니다. 즉 셀 폭을 조정하고,
    '//자동 서식을 설정하는 것이지요.
    Columns.AutoFit
    Range("A1").CurrentRegion.AutoFormat Format:=xlRangeAutoFormatList1, Number:=True, Font:= _
        True, Alignment:=True, Border:=True, Pattern:=True, Width:=True

    Msg = "총 " & r - 2 & "개의 파일이 검색되었습니다"
    MsgBox Msg, , "파일 검색 완료//Exceller"
End Sub

Application.FileSearch는 Excel 2007부터 제거되어 최신 버전에서는 동작하지 않습니다. 최신 버전에서는 Dir 함수를 재귀 호출하거나 Scripting.FileSystemObject의 SubFolders 컬렉션을 순회하는 방식으로 하위 폴더까지 검색할 수 있습니다.

Step 3: Sophisticated Type - API로 폴더 선택하기

"Sophisticated Type"은 API(Application Program Interface) 함수를 사용하여 조금더 사용자가 편리하게 폴더를 지정할 수 있도록 만들어 본 것입니다. API 함수에도 아주 재미있는 것이 많으나 한꺼번에 설명을 드리기는 힘들고 시간이 날 때마다 하나씩 소개를 드리겠습니다.

Declare Function SHGetPathFromIDList Lib "shell32.dll" _
    Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long

Declare Function SHBrowseForFolder Lib "shell32.dll" _
    Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long

Public Type BROWSEINFO
    Owner As Long
    Root As Long
    pszDisplayName As String
    Title As String
    ulFlags As Long
    lpfn As Long
    lParam As Long
    iImage As Long
End Type

Sub SearchSubFolders2()
    Dim Msg As String
    Dim strDir As String
    Dim i As Integer
    Dim r As Integer

    Msg = "대상 폴더를 선택하세요"
    strDir = GetDirectory(Msg)
    If strDir = "" Then Exit Sub
    If Right(strDir, 1) <> "\" Then strDir = strDir & "\"

    Worksheets.Add after:=Sheets(1)
    r = 1
    Cells(r, 1) = "파일명"
    Cells(r, 2) = "크기"
    Cells(r, 3) = "작성일자"
    Range("A1:C1").Font.Name = "Arial"
    r = r + 1

    On Error Resume Next
    With Application.FileSearch
        .NewSearch
        .LookIn = strDir
        .Filename = "*.xls"
        .SearchSubFolders = True
        .Execute

        For i = 1 To .FoundFiles.Count
            Cells(r, 1) = .FoundFiles(i)
            Cells(r, 2) = FileLen(.FoundFiles(i))
            Cells(r, 3) = FileDateTime(.FoundFiles(i))
            r = r + 1
        Next i
    End With

    Columns.AutoFit
    Range("A1").CurrentRegion.AutoFormat Format:=xlRangeAutoFormatList1, Number:=True, _
        Font:=True, Alignment:=True, Border:=True, Pattern:=True, Width:=True

    Msg = "총 " & r - 2 & "개의 파일이 검색되었습니다"
    MsgBox Msg, , "파일 검색 완료//Exceller"
End Sub

Function GetDirectory(Msg) As String
    Dim bInfo As BROWSEINFO
    Dim strPath As String
    Dim r As Long
    Dim x As Long
    Dim intSpace As Integer

    If IsMissing(Msg) Then
        bInfo.Title = "대상 폴더를 선택하세요"
    Else
        bInfo.Title = Msg
    End If

    x = SHBrowseForFolder(bInfo)
    strPath = Space(512)
    r = SHGetPathFromIDList(ByVal x, ByVal strPath)

    If r Then
        intSpace = InStr(strPath, Chr(0))                '//Chr(0)은 문자열의 끝을 나타냅니다.
        GetDirectory = Left(strPath, intSpace - 1)       '//Chr(0) 앞까지 발췌
    Else
        GetDirectory = ""
    End If
End Function

위 API 선언은 32비트 Office 기준입니다. 64비트 Office에서는 Declare PtrSafe Function과 LongPtr 자료형으로 바꾸어야 합니다.

고참님들은 코드를 한번 살펴보시기 바랍니다. API 함수 이외에도 사용자 정의변수를 사용하였습니다. 사용자 정의변수에 대해서는 언젠가 설명드릴 기회가 있을 것입니다.

마무리

다음 시간에…

정리 — FileSearch 핵심

구분 사용한 코드 역할
초기화 .NewSearch 검색 조건 리셋
폴더 지정 .LookIn = strDir 검색할 폴더
파일 형식 .Filename = "*.xls" 와일드카드 사용
하위 폴더 .SearchSubFolders = True 하위 폴더 포함
결과 사용 .FoundFiles(i) 찾은 파일 경로

자주 묻는 질문 (FAQ)

Q1. 하위 폴더를 검색하지 않으려면 어떻게 하나요?

SearchSubFolders를 False로 지정하면 지정한 폴더만 검색합니다.

Q2. 모든 종류의 파일을 검색하려면 어떻게 하나요?

Filename을 "*.*"로 지정합니다.

Q3. FileSearch는 어느 버전부터 지원되었나요?

Excel 2000부터 지원되었으며, Excel 2007부터는 제거되었습니다.

마치며

FileSearch의 몇 가지 속성만 알면 하위 폴더 안의 파일까지 손쉽게 목록으로 만들 수 있습니다.