폴더 내 파일 목록을 출력하는 함수 : 엑셀 ListFiles 함수
구문
ListFiles ( 폴더경로, [경로출력여부], [하위폴더포함], [최대깊이] )
설명
엑셀 ListFiles 함수는 폴더 경로안에 파일 목록을 반환하는 함수입니다. 폴더 내 숨겨져있는 파일을 모두 포함하여 반환하며, 하위경로를 포함한 모든 파일을 출력할 수도 있습니다.
두번째 인수인 [경로출력여부]를 True로 사용하면 폴더경로를 포함합니다. [경로출력여부]의 기본값은 False 이며, 기본값으로 사용할 경우 폴더경로 없이 파일명만 반환합니다.
세번째 인수인 [하위폴더포함]과 [최대깊이] 인수를 사용해 하위경로의 모든 파일목록을 출력할 수 있습니다. 최대깊이의 기본값은 2단계이며, 만약 C:\ 폴더의 파일목록을 조회할 경우 C:\폴더1\폴더2 단계까지 내려가서 조회합니다.
- Array = ListFiles("C:\", False)
'// 폴더경로를 포함하지 않은 파일목록을 반환합니다. (예: pagefile.sys, ... 등) - Array = ListFiles("C:\", True) '
// 폴더경로를 포함한 파일목록을 반환합니다. (예: C:\pagefiles.sys, ... 등)
- Array = ListFiles("C:\", , True, 2)
// C:\에서 2단계 내려간 하위 폴더의 모든 파일목록을 반환합니다.
오빠두Tip : 특정 폴더 내 파일을 정확히일치 또는 유사일치로 검색해야 할 경우 vbFileSearch 함수를 사용하면 편리합니다.

패치 내역
- 2022.06.03
- 하위폴더를 포함하여 조회할 수 있도록 명령문 업데이트
예제파일 다운로드
오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.
- [VBA예제] ListFiles 명령문예제파일
ListFiles 명령문 전체 코드
'############################################################### '오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com) '▶ ListFiles 함수 '▶ 선택한 폴더의 파일목록을 배열로 반환합니다. '▶ 인수 설명 '_____________sPath : 파일목록을 출력할 폴더입니다. '_____________withPath : TRUE일 경우 폴더 경로를 함께 표시합니다. 기본값은 FALSE 입니다. '_____________includeChild : TRUE일 경우 하위 폴더의 파일도 모두 포함하여 출력합니다. 기본값은 FALSE 입니다. '_____________MaxDepth : 하위경로 포함 시, 내려가는 최대 단계입니다. 기본값은 2 단계 입니다. '############################################################### Function ListFiles(sPath As String, Optional withPath As Boolean = False, Optional includeChild As Boolean = False, Optional maxDepth As Long = 2) ' 변수를 선언합니다. Dim dictFiles As Object Dim arr As Variant Dim i As Long: Dim x As Long Set dictFiles = CreateObject("Scripting.Dictionary") ' 폴더 내 파일 경로를 Dictionary 에 추가합니다. ListFiles_Routine dictFiles, sPath, True, includeChild, , maxDepth ' Dictionary가 비어있을 경우 #NULL 오류를 반환하고 그렇지 않을 경우 다음 단계로 넘어갑니다. On Error GoTo EH: ReDim arr(1 To dictFiles.Count) ' Dictionary를 배열로 변환합니다. arr = dictFiles.items ' withPath가 False일 경우 폴더 경로를 제거합니다. If withPath = False Then For x = LBound(arr) To UBound(arr) i = InStrRev(arr(x), "\") arr(x) = Mid(arr(x), i + 1, Len(arr(x))) Next End If ' 파일 경로를 반환 후 함수를 종료합니다. ListFiles = arr Exit Function EH: ListFiles = "#NULL!" End Function Sub ListFiles_Routine(dict As Object, sPath As String, Optional withPath As Boolean = False, Optional includeChild As Boolean = True, Optional depth As Long = 0, Optional maxDepth As Long = 2) Dim oFSO As Object: Dim oFolder As Object: Dim oFiles As Object: Dim oFile As Object Dim oSubFolder As Object Set oFSO = CreateObject("Scripting.FileSystemObject") Set oFolder = oFSO.GetFolder(sPath) Set oFiles = oFolder.Files On Error Resume Next If Right(sPath, 1) <> "\" Then sPath = sPath & "\" For Each oFile In oFiles If withPath = False Then dict.Add oFile.Name, oFile.Name Else: dict.Add sPath & oFile.Name, sPath & oFile.Name Next If includeChild = True Then For Each oSubFolder In oFolder.SubFolders depth = depth + 1 If depth <= maxDepth Then ListFiles_Routine dict, sPath & oSubFolder.Name, True, True, depth, maxDepth depth = depth - 1 Next End If End Sub
인수설명
ListFiles 명령문에는 총 2개의 인수가 들어갑니다.
인수 설명 sPath
[String]파일목록을 검색할 폴더 경로입니다. withPath
[Boolean, 선택인수]True일 경우 출력값에 폴더경로를 포함합니다. 기본값은 FALSE 입니다. includeChild
[Boolean, 선택인수]하위폴더 포함 여부입니다. 기본값은 FALSE 입니다. TRUE 일 경우 하위폴더를 포함한 파일 목록을 반환합니다. MaxDepth
[Long, 선택인수]최대깊이입니다. 기본값은 2이며, 기본 폴더 경로에서 하위 2단계까지 내려가 폴더를 조회합니다. 명령문 동작원리
본 명령문은 FileSystemObject 라이브러리를 활용합니다. FileSystemObject 라이브러리에 대한 자세한 설명은 MS홈페이지 관련링크를 참고하세요.
- FileSystemObject 라이브러리에서 각 폴더와 파일 개체를 받아옵니다.
Dim oFSO As Object: Dim oFolder As Object: Dim oFiles As Object: Dim oFile As Object Set oFSO = CreateObject("Scripting.FileSystemObject") Set oFolder = oFSO.GetFolder(sPath) Set oFiles = oFolder.Files
- 받아은 파일 개체의 개수가 '0'일 경우 명령문을 종료합니다.
If oFiles.Count = 0 Then Exit Function
- 받아온 폴더 경로뒤에 "\" 표시가 없을 경우 오류를 반환할 수 있으므로, 오류 방지를 위해 폴더경로 뒤 "\" 를 추가합니다.
If Right(sPath, 1) <> "\" Then sPath = sPath & "\"
- 폴더에 파일이 한개라도 존재할경우, 배열을 생성한 뒤 각 파일경로를 배열에 추가합니다.
'// 폴더에 파일이 한개라도 존재시 배열 생성합니다. ReDim arr(1 To oFiles.Count) '// 각 파일을 돌아가며 Arr 배열로 반환합니다. For Each oFile In oFiles If withPath = False Then arr(i) = oFile.Name Else: arr(i) = sPath & oFile.Name i = i + 1 Next
- FileSystemObject 라이브러리에서 각 폴더와 파일 개체를 받아옵니다.