- 최초 작성일: 2000-09-20
- 최종 수정일: 2026-09-30
- 조회수: 14 회
- 작성자: 권현욱 (엑셀러)
- 강의 제목: 하위폴더 동시 검색하기
들어가기 전에
오래 전 엑셀 파일로 진행하던 강의를 웹 글로 복원한 것이라, "버튼을 눌러보세요"처럼 엑셀에서 직접 조작하라는 표현이 남아 있을 수 있습니다. 결과는 본문의 그림이나 표로 확인하실 수 있으며, 현재와 맞지 않는 내용은 보완하되 전반적인 스타일은 당시의 갬성(?)을 유지했습니다.
강의41(VB)에서요.
선택한 폴더의 하위 폴더 내의 파일들도 모두 검색하게 하려면 어떻게 해야 하나요.
추석 편안히 쉬시고 오셔서 답변주세요.
왜 이런 질문이 안 오나 했습니다. ^^ 버튼을 눌러 보세요.
하위폴더 동시 검색하기
핵심 요약: 하위 폴더까지 검색하기
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이면 검색) |
| Excute | Search 시작 |
| NewSearch | FileSearch 오브젝트를 초기화(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의 몇 가지 속성만 알면 하위 폴더 안의 파일까지 손쉽게 목록으로 만들 수 있습니다.