이 페이지에서
구문
= ListFiles ( 폴더경로, [경로출력여부], [하위폴더포함], [최대깊이] )
인수구분
형식 설명
sPath
필수
String
파일목록을 검색할 폴더 경로입니다.
withPath
선택
Boolean
TRUE일 경우 출력값에 폴더경로를 포함합니다. 기본값은 FALSE 입니다.
includeChild
선택
Boolean
하위폴더 포함 여부입니다. 기본값은 FALSE 입니다.
TRUE 일 경우 하위폴더를 포함한 파일 목록을 반환합니다.
MaxDepth
선택
Long
하위폴더를 포함할 때 내려갈 최대 깊이입니다. 기본값은 2 입니다.
기본 폴더 경로에서 하위 2단계까지 내려가 폴더를 조회합니다.
마스터 코드
복사한 코드는 VBA 편집기(Alt + F11) 새 모듈에 붙여넣어 사용하세요'###############################################################
'오빠두엑셀 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
활용 예제
폴더 안의 파일 목록 가져오기
Array = ListFiles("C:\", False)
'// 폴더경로를 포함하지 않은 파일목록을 반환합니다. (예: pagefile.sys, ... 등)
Array = ListFiles("C:\", True)
'// 폴더경로를 포함한 파일목록을 반환합니다. (예: C:\pagefiles.sys, ... 등)
하위 폴더까지 포함해 조회하기
Array = ListFiles("C:\", , True, 2)
'// C:\에서 2단계 내려간 하위 폴더의 모든 파일목록을 반환합니다.
안내사항
폴더 안에 숨겨진 파일도 모두 포함하여 반환하며, 폴더에 파일이 하나도 없으면 #NULL! 오류를 반환합니다.
함수가 호출하는 ListFiles_Routine 명령문도 같은 모듈에 함께 붙여넣어야 합니다.
다름이 아니라 이 함수(?)를 이용해서 하나의 폴더가 아닌 여러 폴더의 하위 파일들의
정보도 불러올수 있을까요?
하위폴더까지 불러오시려면, 위 함수의 oFolder 변수를 이용하시면 됩니다.
간략히 설명드리면,
와 같이 작성하시면 됩니다.^^
답변이 도움이 되셨길 바랍니다.
다름이 아니라 저도 위와 같은 방법을 구현을 하려 답변 을 주신 것으로 변형하여 적용을 하려하니 계속 오류가 발생하여 진행이 되질 않네요. 혹시 DIM / SET 코드 전체를 보여주실 수 있나요? 감사합니다.
전체 명령문은 포스트에 모두 적어드리고 있습니다 :)
한번 확인해보시겠어요?
감사합니다.
혹시 해당 명령어 및 매크로가 맥 기반 작업에서는 실행 불가능한지 알고 싶습니다 ㅠ
항상 좋은 정보와 강의 감사드립니다!
CreateObject("Scripting.FileSystemObject") 개체는 Windows 전용 라이브러리이므로
Mac에서는 사용하실 수 없습니다. :)
감사합니다.
다름이 아니라 제가 이 함수를 이용하여 하위 폴더 정보를 불러오게 변경을 해보고 있는데 오류가 나서 계속 막히고 있네요. 바꿀 수 있는 것은 맞겠죠??
네 하위폴더 변경도 가능합니다.
엑셀을 배우려고 서치하다가 좋은 사이트를 알게 되어 좋아요.
이 게시글을 참고하여 목록을 만들려고 하는데
Thumbs.db 등이나 엑셀 임시저장 파일인 ~$이 붙은 파일까지 목록으로 출력이 됩니다. 이러한 파일들을 제외하는 수식이 있을까요?