엑셀 VBA 파일선택창 매크로 사용법 총정리 :: 엑셀 자동화 기초

엑셀 VBA 자동화를 위한 필수 명령문인 파일선택창(FileDialog) 명령문의 마스터코드의 동작원리와 실전 사용법을 살펴봅니다.

# VBA

작성자 :
오빠두엑셀
최종 수정일 : 2021. 11. 10. 03:08
URL 복사
메모 남기기 : (29)

강의소개

이번 강의에서는 엑셀 VBA 자동화 구축에 꼭 필요한 파일선택창 모듈에 대해 알아봅니다. 파일선택창을 활용하면 특정 확장자를 가진 파일만 사용자가 직접 선택할 수 있도록 유도할 수 있으며, 따라서 더욱 유연성있는 매크로 프로그램을 제작할 수 있습니다. 이번 강의에 소개해드린 마스터코드의 인수를 변경하면 파일선택창의 시작경로, 선택가능한 확장자, 선택가능한 파일의 개수 등을 조절할 수 있습니다.

폴더 경로를 반환하려면 FolderDialog 함수를 사용하세요.

함수구문
= Multiple_FileDialog ( Title, FilterName, FilterExt, InitialFolder, InitialView, MultiSelection, PathDelimiter, withPath, withExt )
패치노트
  • 2019.11.27 업데이트
    Multiple_FileDialog 마스터 코드에 파일구분자 선택 인수 PathDelimiter를 추가하였습니다.
  • 2020.02.16 업데이트
    withPath , withExt 인수를 추가하였습니다. 이제 파일경로 또는 확장자 포함여부를 선택하여 출력할 수 있습니다.
인수설명
  • Title : 엑셀 파일선택창에 보이는 제목입니다.
  • FilterName : 확장자 필터에 표시될 필터 이름입니다.
  • FilterExt : 파일선택창에 출력될 확장자를 필터링합니다.
  • InitialFolder : 파일선택창의 시작 경로입니다.
  • InitialView : 파일선택창이 실행되었을 때 어떻게 보여질지 출력방식을 결정합니다. 자세한 내용은 관련링크를 참고하세요.
    https://docs.microsoft.com/en-us/office/vba/api/office.msofiledialogview
  • MultiSelection : TRUE일 경우 여러개의 파일을 선택할 수 있습니다. (기본값: TRUE)
  • PathDelimiter : 여러개의 파일을 구분할 구분자입니다. 특별한 상황을 제외하고 기본값을 유지합니다. (기본값 : "|")
  • withPath : TRUE일 경우 파일경로를 함께 출력합니다. (기본값: TRUE)
  • withExt : TRUE일 경우 파일확장자를 함께 출력합니다. (기본값: TRUE)

예제파일 다운로드

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

  • [엑셀VBA] 엑셀 파일선택창 다중선택 모듈
    완성파일

1. 변수 설정하기

4개의 변수를 생성합니다.

  • FGD : FileDialog (파일선택창) 을 위한 변수입니다.
  • Selected : 파일선택창에서 파일이 선택 되어있는지 여부를 정수로 받아옵니다.
  • i : 파일선택창에서 선택된 파일(들)의 순번을 나타냅니다.
  • ReturnStr : 선택된 파일(들)의 파일경로를 나타내는 텍스트입니다.
Sub Multiple_FileDialog()
 
Dim FDG As FileDialog
Dim Selected As Integer: Dim i As Integer
Dim ReturnStr As String
 
Set FDG = Application.FileDialog(msoFileDialogFilePicker)
 
End Sub

2. 파일선택창 (File Dialogue) 환경설정

파일선택창을 아래와 같이 설정합니다.

  • Title : 파일선택창 좌측 상단에 보이는 제목을 설정합니다.
  • Fileters.Add : 선택할 수 있는 파일 확장자를 제한합니다.
  • InitialView : 파일선택창의 ‘보기종류’를 설정합니다.
  • InitialFileName : 파일선택창이 나타냈을 때의 초기 폴더경로를 설정합니다.
  • AllowMultiSelect : 다중선택을 허용할지 여부를 결정합니다.
With FDG
    .Title = "파일을 선택하세요"
    .Filters.Add "엑셀파일", "*.xls; *.xlsx; *.xlsm"
    .InitialView = msoFileDialogViewList
    .InitialFileName = ThisWorkbook.Path
    .AllowMultiSelect = True
    Selected = .Show
End With

3. 선택된 파일의 파일경로 받아오기

파일선택창에서 선택된 한 개 또는 여러 개의 파일 경로를 받아옵니다.

파일선택창에서 파일이 선택되었을 경우 Selected 변수는 -1을 반환하므로, Selected 변수가 -1일 경우에만 파일경로를 받아올 수 있도록 합니다.

Q: 파일이름에 콤마(,)가 들어갈 경우엔 어떻게 하나요?

파일이름에 콤마(,)가 들어갈 경우, 구분기호를 세로바(|)로 대체하여 코드를 작성합니다. 윈도우체제의 파일명에는 세로바(|) 사용이 금지되어 있으므로, 세로바(|)로 파일명을 구분할 경우 모든 상황에 대처할 수 있습니다.

If Selected = -1 Then  '파일이 선택되었을 경우 -1을 반환
    For i = 1 To FDG.SelectedItems.Count - 1
        ReturnStr = ReturnStr & FDG.SelectedItems(i) & ", "
        '// ReturnStr = ReturnStr & FDG.SelectedItems(i) & "| "
        '// 파일명에 콤마(,)가 들어갈 경우 구분기호를 세로바(|)로 대체합니다.
    Next i
    ReturnStr = ReturnStr & FDG.SelectedItems(.SelectedItems.Count)
End If

4. 에러핸들링 (오류처리)

파일 선택창에서 아무런 파일이 선택되지 않고 종료될 경우, VBA에서는 디버그오류를 반환합니다.

따라서 아무런 파일이 선택되지 않을 경우 사용자가 다시 파일을 선택하도록 유도하거나 또는 파일이 선택되지 않았다는 알림창을 띄우는 방법으로 오류처리를 합니다.

4-A. 사용자가 다시 파일을 선택하도록 유도하는 오류처리방법
SelectAgain:
'.... 파일선택 본문
 
If Selected = 0 Then
    MsgBox "선택된 파일이 없습니다. 파일을 다시 선택해주세요."
    Goto SelectAgain:
end if
4-B. 파일이 선택되지 않았다는 알림창을 띄우는 오류처리 방법
If Selected = 0 Then
    MsgBox "아무런 파일이 선택되지 않았습니다. 프로세스를 종료합니다."
    End
end if

5. 엑셀 VBA 파일선택창 마스터 코드

파일 선택창을 하나의 Function(함수)로 만들어 사용하면 다양한 VBA 모듈에서 효율적으로 사용할 수 있습니다.

아래 파일선택창 마스터 코드 전문을 활용해서 여러분의 VBA 프로그램을 더욱 멋지게 만들어보세요!

파일선택창 마스터 코드에 사용된 인수 설명
인수 설명
Title
[String, 선택인수]
파일선택창 제목입니다. 기본값은 "파일을 선택하세요" 입니다.
FilterName
[String, 선택인수]
선택가능한 확장자그룹 이름입니다. 기본값은 "엑셀파일" 입니다.
FilterExt
[String, 선택인수]
선택가능한 확장자 목록입니다. 기본값은 "*.xls; *.xlsx; *.xlsm" 입니다.
InitialFolder
[String, 선택인수]
기본 시작폴더 경로입니다. 기본값은 "내문서" 폴더입니다.
InitialView
[MsoFileDialogView, 선택인수]
파일선택창 보기 형식입니다. 기본값은 일반보기형식입니다.
MultiSelection
[Boolean, 선택인수]
파일 다중선택 가능 여부입니다. 기본값은 TRUE(=다중선택 허용) 입니다.
PathDelimiter
[String, 선택인수]
다중선택 된 파일을 구분할 구분자입니다. 기본값은 "|" 입니다.
파일선택창 마스터 코드 전문
Public Function Multiple_FileDialog(Optional Title As String = "파일을 선택하세요", Optional FilterName As String = "엑셀파일", _
Optional FilterExt As String = "*.xls; *.xlsx; *.xlsm", Optional InitialFolder As String = "", _
Optional InitialView As MsoFileDialogView = msoFileDialogViewList, Optional MultiSelection As Boolean = True, Optional PathDelimiter As String = "|", _
Optional withPath As Boolean = True, Optional withExt As Boolean = True) As String
'###############################################################
'오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com)
'▶ MultipleFileDialog 함수
'▶ 파일선택창으로 여러개의 파일 경로를 받아옵니다.
'▶ 인수 설명
'_____________Title         : 파일선택창의 제목입니다.
'_____________FilterName    : 특정 확장자를 가진 파일만 표시할 경우, 표시할 이름 입니다.
'_____________FilterExt     : 파일 확장자입니다.
'_____________InitialFolder : 파일 선택창 시작 폴더경로입니다. 기본값은 윈도우 기본경로입니다 .
'_____________Initialview   : 파일선택창의 보기 형식입니다. 기본값은 일반보기입니다.
'_____________MultiSelection : True일 경우 여러 파일을 선택할 수 있습니다. 기본값은 True 입니다.
'_____________PathDelimiter : 여러 파일이 선택될 경우, 각 파일을 구분할 구분자입니다. 기본값은 "|" 입니다.
'_____________withPath      : True일 경우 파일 경로를 같이 출력합니다. 기본값은 True 입니다.
'_____________withExt       : True일 경우 파일 확장자를 같이 출력합니다. 기본값은 True 입니다.
'▶ 사용 예제
'GetPath = Multiple_FileDialog(, "PDF 또는 그림파일", "*.pdf, *.png, *.jpg, *.bmp, *.jpeg")
'Paths = Split(GetPath, "|")
'For Each Path In Paths
'    MsgBox Path
'Next
'##############################################################
Dim FDG As FileDialog
Dim Selected As Integer: Dim i As Integer
Dim ReturnStr As String: Dim tempStr As Variant
 
Set FDG = Application.FileDialog(msoFileDialogFilePicker)
 
With FDG
    .Title = Title
    .Filters.Add FilterName, FilterExt
    .InitialView = InitialView
    .InitialFileName = InitialFolder
    .AllowMultiSelect = MultiSelection
    Selected = .Show
 
    If Selected = -1 Then
        For i = 1 To FDG.SelectedItems.Count - 1
            If withPath = False Then tempStr = Right(FDG.SelectedItems(i), Len(FDG.SelectedItems(i)) - InStrRev(FDG.SelectedItems(i), "\")) Else tempStr = FDG.SelectedItems(i)
            If withExt = False Then tempStr = Left(tempStr, InStrRev(tempStr, ".") - 1)
            ReturnStr = ReturnStr & tempStr & PathDelimiter
        Next i
        If withPath = False Then tempStr = Right(FDG.SelectedItems(.SelectedItems.Count), Len(FDG.SelectedItems(.SelectedItems.Count)) - InStrRev(FDG.SelectedItems(.SelectedItems.Count), "\")) Else tempStr = FDG.SelectedItems(.SelectedItems.Count)
        If withExt = False Then tempStr = Left(tempStr, InStrRev(tempStr, ".") - 1)
        ReturnStr = ReturnStr & tempStr
 
        Multiple_FileDialog = ReturnStr
    ElseIf Selected = 0 Then
        MsgBox "선택된 파일이 없으므로 프로그램을 종료합니다."
        End
    End If
 
End With
 
End Function

6. 파일선택창 마스터 코드 활용하여 여러 개의 엑셀파일 동시에 실행하기

파일선택창 마스터 코드를 활용하여 아래와 같이 여러 개의 엑셀파일을 동시에 실행하는 명령문을 작성합니다.

Sub OpenFiles()
 
Dim SelectionStr As String
Dim Vars As Variant: Dim Var As Variant
 
SelectionStr = Multiple_FileDialog
 
Vars = Split(SelectionStr, "|")
 
For Each Var In Vars
    Application.Workbooks.Open Var
Next
 
MsgBox "선택된 엑셀 파일을 모두 실행하였습니다."
 
End Sub
5 17 투표
게시글평점
29 댓글
Inline Feedbacks
모든 댓글 보기
29
0
여러분의 생각을 댓글로 남겨주세요.x