엑셀 ListFiles 명령문 사용법 및 전체 명령문 :: 폴더 내 파일 목록 출력

폴더 내 파일 목록을 출력하는 ListFiles 함수의 사용법 및 전체명령문 동작원리를 알아봅니다.

작성자 :
오빠두엑셀
최종 수정일 : 2022. 11. 16. 03:39
URL 복사
메모 남기기 : (11)

폴더 내 파일 목록을 출력하는 함수 : 엑셀 ListFiles 함수

구문
ListFiles ( 폴더경로, [경로출력여부], [하위폴더포함], [최대깊이] )
설명

엑셀 ListFiles 함수는 폴더 경로안에 파일 목록을 반환하는 함수입니다. 폴더 내 숨겨져있는 파일을 모두 포함하여 반환하며, 하위경로를 포함한 모든 파일을 출력할 수도 있습니다.

두번째 인수인 [경로출력여부]를 True로 사용하면 폴더경로를 포함합니다. [경로출력여부]의 기본값은 False 이며, 기본값으로 사용할 경우 폴더경로 없이 파일명만 반환합니다.

오빠두Tip : 파일명 뒤에 확장자를 따로 분리해야 할 경우, SplitFileExt 함수를 사용해보세요.

세번째 인수인 [하위폴더포함]과 [최대깊이] 인수를 사용해 하위경로의 모든 파일목록을 출력할 수 있습니다. 최대깊이의 기본값은 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 함수를 사용하면 편리합니다.
폴더 내 파일목록 출력 listfiles 함수
ListFiles 함수로 폴더 내 파일 목록을 출력할 수 있습니다.
패치 내역
  • 2022.06.03
    - 하위폴더를 포함하여 조회할 수 있도록 명령문 업데이트

예제파일 다운로드

오빠두엑셀의 강의 예제파일은 여러분을 위해 자유롭게 제공하고 있습니다.


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홈페이지 관련링크를 참고하세요.

  1. 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
  2. 받아은 파일 개체의 개수가 '0'일 경우 명령문을 종료합니다.
    If oFiles.Count = 0 Then Exit Function
  3. 받아온 폴더 경로뒤에 "\" 표시가 없을 경우 오류를 반환할 수 있으므로, 오류 방지를 위해 폴더경로 뒤 "\" 를 추가합니다.
    If Right(sPath, 1) <> "\" Then sPath = sPath & "\"
  4. 폴더에 파일이 한개라도 존재할경우, 배열을 생성한 뒤 각 파일경로를 배열에 추가합니다.
    '// 폴더에 파일이 한개라도 존재시 배열 생성합니다.
    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
5 5 투표
게시글평점
11 댓글
Inline Feedbacks
모든 댓글 보기
11
0
여러분의 생각을 댓글로 남겨주세요.x