파일을 실행하는 VBA

2024. 11. 19. 21:12

 

여러 엑셀파일을 열고 데이터를 복사하고 붙이고 통합하고 요약하고... 
다양한 반복작업들을 자동화 하기 위해서 우선 필요한 것은 파일을 실행하는 부분이다.
그래서 오늘 다룰 주제는 세 가지.

1) 파일 선택창 구현
2) 선택한 파일의 경로 띄우기 
3) 선택한 파일 실행하기

 

1) 파일 선택창 구현하기

Dim FDG As FileDialog
Dim Selcted As Integer

Set FDG = Application.FileDialog(msoFileDialogFilePicker)

With FDG
    .Title = "파일을 선택하세요"
    .Filters.Add "엑셀파일", "*.xls; *.xlsx; *.xlsm"
    .InitialView = msoFileDialogViewList
    .InitialFileName = ThisWorkbook.Path '현재 워크북이 저장된 위치를 초기폴더로 설정
    .AllowMultiSelect = True 
    Selected = .Show '파일선택창의 결과값을 변수 selected로 받아온다.

자료형 FileDialog : 파일을 선택할 수 있는 대화상자를 생성한다. 

[ 속성 ]

  • .Title : 대화상자의 제목 설정
  • .Filters : 선택할 수 있는 파일의 형식 설정
  • .InitailView : 대화상자의 보기형식 설정
  • .InitialFileNamve : 대화상자가 열릴 때의 파일 경로 설정
  • .AllowMultiSelect : 여러 파일을 선택할지 말지 True(여러 파일 허용)/False(하나의 파일만 허용)
  • .SelectedItems : 대화상자를 통해 선택한 파일의 경로 

[ 메서드 ] 

  • .Show : 대화상자를 통해 선택한 결과값을 정수 값으로 반환한다.
    선택된 파일이 없으면 0, 하나 이상이 선택되면 -1을 반환한다. 

 

 

2) 선택한 파일의 경로 띄우기 

 

Dim Selcted As Integer
Dim ReturnStr As String

IF Selected = 0 Then
	msgBox "파일이 선택되지 않았습니다. 다시 선택해주세요."

ElseIf Selected = -1 Then
	ReturnStr = FDG.SelectedItems(1)
	msgBox ReturnStr

End IF

FileDialog의 중요한 속성인 선택된 파일이 없으면 0, 하나 이상이 선택되면 -1을 반환한다를 이용해서
Selected  = Application.FileDialog(msoFileDialogFilePicker).Show
→ Selected가 0이면 파일을 선택 안한 것, -1이면 파일을 선택한 것이 된다.

조건문 IF로 파일을 선택하지 않았을 경우 선택하라는 메시지 박스를,
선택했을 경우에 파일의 경로를 메시지박스로 띄울 수 있다.

지금은 ReturnStr에 .SelectedItems(1)을 할당했으므로
여러 파일을 선택하더라도 객체의 첫번째 배열인 첫번째 파일의 경로만 알 수 있다.
VBA는 다른 언어(JS등..)과 달리 배열의 인덱스가 1로 시작한다. 헷갈리지 않게 주의!

만약 선택한 파일들의 경로를 모두 알고싶다면 for반복문을 사용해서 인덱스()에 숫자가 아니라 변수를 넣어보자.

Dim i As Integer

If Selected = 0 Then
    MsgBox "파일이 선택되지 않았습니다. 다시 선택해주세요."

ElseIf Selected = -1 Then
for i = 1 to SelectedItems.Count -1 
	ReturnStr = ReturnStr & .SelectedItems(i) & ", "
    MsgBox ReturnStr

End If

변수 i가 1에서 SelectedItems의 길이 (SelectedItems.Count) -1가 될 때 까지 반복하는 for문
변수 ReturnStr에 파일경로인 SelectedItems를 ','로 구분해서 모두 담는다. 

 

 

3) 선택한 파일 실행하기

Dim Var, Vars As Variant

	Vars = Split(ReturnStr, ", ")
        For Each Var In Vars
        Var = Trim(Var)
            Application.Workbooks.Open (Var)
            '엑셀파일 여는 명령문
        Next

Split으로 ","를 기준으로 나눠준 뒤 Vars라는 Variant변수에 담아준다.

Vars의 범위 안에서 Var를 반복하는 For Each ... Next문
: Trim으로 공백을 제거해서 정제된 경로를 Var에 담아준다.
Application.Workbooks.Open()로 Var경로의 파일을 실행해준다.
다음 Var로 넘어가서 Vars가 끝날 때 까지 반복한다. (Next)

 

 

▽ 전체코드

더보기
Sub Multiple_FileDialog()

Dim FDG As FileDialog
Dim Selcted As Integer
Dim i As Integer
Dim ReturnStr As String
Dim Vars, Var As Variant


SelectAgain:
'SelectAgain: ~ GoTo SelectAgain 은, 라벨로 사용되는 구문이다. 흐름을 제어하고 특정 위치로 점프할 수 있게 한다.
'파일을 선택하지 않으면 SelectAgain블록이 반복된다.

Set FDG = Application.FileDialog(msoFileDialogFilePicker)

With FDG
    .Title = "파일을 선택하세요"
    .Filters.Add "엑셀파일", "*.xls; *.xlsx; *.xlsm"
    .InitialView = msoFileDialogViewList
    .InitialFileName = ThisWorkbook.Path '현재워크북이 저장된 위치를 초기폴더로 설정
    .AllowMultiSelect = True '여러개의 파일 선택
    Selected = .Show '파일선택창의 결과값을 변수 selected로 받아옴
    
    '파일 선택하면 정수값이 -1, 선택 안하면 0이 출력됨
         If Selected = 0 Then
            MsgBox "파일을 선택해주세요."
            GoTo SelectAgain:
         ElseIf Selected = -1 Then
         
        ReturnStr = ""
         
            'ReturnStr = .SelectedItems(1) '한개의 파일을 받아올때
            
            For i = 1 To .SelectedItems.Count - 1
            '-1를 하는 이유는 쉼표가 마지막 글자가 되는 것을 방지하기 위해
                ReturnStr = .SelectedItems(i) & ", "
              Next i
                ReturnStr = ReturnStr & .SelectedItems(.SelectedItems.Count)
            
            End If
        
    MsgBox ReturnStr
    
        Vars = Split(ReturnStr, ", ")
        For Each Var In Vars
        Var = Trim(Var)
            Application.Workbooks.Open (Var)
            '엑셀파일 여는 명령문
        Next
        'returnStr의 배열화

  End With
End Sub

 

 

▽ 출처

 

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

강의소개 이번 강의에서는 엑셀 VBA 자동화 구축에 꼭 필요한 파일선택창 모듈에 대해 알아봅니다. 파일선택창을 활용하면 특정 확장자를 가진 파일만 사용자가 직접 선택할 수 있도록 유도할

www.oppadu.com

'VBA 이론' 카테고리의 다른 글

Workbook, WorkSheet, Range  (0) 2024.12.03
범위 선택, Function()  (0) 2024.11.21
영어 주소지를 한글로 변환해주는 VBA  (3) 2024.11.15
InputBox, 반복문 For  (0) 2024.11.12
Range, Cell : 데이터 입력하기, 지우기  (0) 2024.11.11