엑셀 VBA 파일선택창(FileDialog) 마스터 코드 사용법
엑셀 매크로 자동화를 위한 필수 모듈! - 파일선택창 모듈 만들기
이 강의에서는 엑셀 VBA로 사용자에게 파일을 직접 선택하게 하는 파일선택창(FileDialog) 모듈의 동작 원리와 실전 활용법을 다룹니다. 변수 설정부터 다중 파일 선택, 파일이 선택되지 않았을 때의 오류 처리까지 단계별로 살펴보고, 시작 경로·확장자·구분자 등을 자유롭게 조절할 수 있도록 함수 형태의 마스터 코드로 정리합니다.
관련 자료를 모았어요
더 깊이 살펴볼 수 있는 자료를 한곳에
실습 가이드
엑셀 VBA 자동화에 필수적인 파일선택창(FileDialog) 모듈의 동작 원리와 활용법을 알아봅니다. 파일선택창을 활용하면 사용자가 원하는 확장자의 파일만 직접 선택하도록 유도할 수 있어, 유연성 있는 매크로 프로그램을 제작할 수 있습니다. 이번 강의에서 소개하는 마스터코드의 인수를 변경하면 시작 경로, 선택 가능 확장자, 동시 선택 가능한 파일 개수 등을 자유롭게 조절할 수 있습니다.
폴더 경로를 반환받아야 한다면 FolderDialog 함수를 사용합니다.
함수구문
패치노트
- 2019.11.27 업데이트
Multiple_FileDialog 마스터 코드에 파일 구분자를 지정할 수 있는 PathDelimiter 인수가 추가되었습니다. - 2020.02.16 업데이트
파일 경로와 확장자 포함 여부를 선택할 수 있도록 withPath, withExt 인수가 추가되었습니다. 출력 형식을 상황에 맞게 조정할 수 있습니다.
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 매크로에서 효율적으로 재사용할 수 있습니다.
아래 마스터 코드 전문을 활용해 파일선택창 기능을 손쉽게 매크로에 연결해보세요.
파일선택창 마스터 코드에 사용된 인수 설명
| 인수 | 설명 |
| 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
아래 부분을,
ReturnStr = ReturnStr & FDG.SelectedItems(i) & PathDelimiter
아래 코드로 바꿔주세요 ^^
그리고 아래 부분도,
ReturnStr = ReturnStr & FDG.SelectedItems(.SelectedItems.Count)
아래 수정된 코드로 변경해보시기 바랍니다 ^-^
제 답변이 도움이 되셨길 바랍니다.
감사합니다.^^
명령문 인수중, withPath와 withExt를 각각 FALSE로 설정한 뒤 실행해보시겠어요?
감사합니다.^^
사용 시 선택을 하여 Open 시에는 "열기" 버튼을 누르면 되는데
다른 목적으로 파일의 이름만 시트에 넣으려고 합니다.
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.ButtonName = "선택"
으로 해주었는데 변화가 없어서 혹여 제가 잘못했나 싶어 문의 드립니다.
Sub Multiple_FileDialog()
Dim FDG As FileDialog
Dim Selected As Integer: Dim i As Integer
Dim ReturnStr As String
Set FDG = Application.FileDialog(msoFileDialogFilePicker)
With FDG
.Title = "파일을 선택하세요"
.Filters.Add "엑셀파일", "*.xls; *.xlsx; *.xlsm"
.InitialView = msoFileDialogViewList
.InitialFileName = ThisWorkbook.Path
.AllowMultiSelect = True
Selected = .Show
End With
End Sub
아마도 Mac OS를 사용중이신 듯 합니다.
Mac OS 에서는 FileDialog를 사용할 수 없습니다.