엑셀 vba를 통해 pdf 파일을 열고 싶습니다.

2020. 5. 28. 17:10VBA

728x90
반응형

지식iN에 아래와 같은 질문이 올라와 있어서 답변을 하였습니다.

요청하는 내용은 대략적으로

PDF 파일명 일부를 검색해서 파일을 열고 싶다 였고

반드시 하위에 모든 경로들을 반복 해야 한다고 하였습니다.

그리하여 하위 폴더들을 반복하기 위해 재귀함수(Recursive) 방식으로 하위 폴더를 반복하여 파일을 열어주는 방식으로 했습니다.

이 질문의 같은 경우에는 파일은 중복되지 않는다는 것에 중점이 되어있어서 생각보다 간편히 처리할 수 있었습니다.




조건

*C2셀에 오픈 하려는 pdf파일명의 일부만 입력합니다. 따라서 C2셀의 이름이 포함된 파일을 검색해서 오픈합니다. C2셀의 숫자는 고유숫자입니다. 중복된 숫자를 가진 파일은 존재하지 않습니다.

*파일이 저장된 경로: C:\Users\abcde\A

*A폴더 안에 또 폴더가 있다면 그 폴더 안에도 서치가 가능해야합니다.

결론:

C2셀에 20191011이라고 입력하면 A폴더에서 20191011의 이름이 포함된 pdf파일을 찾아서 오픈한다.

만약에 20191011이 포함된 파일이 A폴더 안에있는 다른폴더에 저장되어 있어도 찾아내야 한다.

▶ getFileList() : 메인이라고 볼 수 있으며 검색어와 경로를 담아 찾기를 실행합니다.

Sub getFileList()
'// [도구] - [참조] 에서 Microsoft Scripting Runtime 라이브러리 체크해야 함
    Dim FSO As New FileSystemObject
    Dim sDir As Folder      '// 찾을 폴더 변수 선언
    Dim fPath As Variant    '// 경로(Path) 변수 선언
    Dim fileExt As String   '// 파일확장자 변수 선언
    
    Dim m As Workbook
    Dim ms As Worksheet
    
    Set m = Workbooks(ThisWorkbook.Name)
    Set ms = m.Sheets("Sheet1")
        
    fPath = ms.Range("C4")   '// 찾을 경로
    fileExt = ms.Cells(2, "C") '// 찾을 확장자
    
    If fPath = "" Then
        MsgBox "찾을 경로를 입력하세요"
        Exit Sub
    End If
  
    Call printFileLists(fPath, fileExt) '// 파일 리스트 출력
    
    Set sDir = FSO.GetFolder(fPath)
    
    Call subFolderFind(sDir, fileExt)   '// 서브의 서브를 찾는 재귀함수
  
End Sub


▶ printFileLists : Dir이라는 함수를 이용하여 디렉토리를 검색하고 파일을 실행 합니다.

Sub printFileLists(ByVal fPath As Variant, ByRef getExt As String)
    '// 찾은 파일 정보를 출력하는 부분
    Dim fName As String
    Dim frng As Range
    Dim saveDir As Range
    Dim var
    
    fName = Dir(fPath & "\" & "*" & getExt & "*") '// 디렉토리 검색
    
    If fName <> "" Then
        
        Do
            Dim openFileName As String
           
            openFileName = fPath & "\" & fName  '// 파일경로
            
            Dim Shell As Object
            Set Shell = CreateObject("WScript.Shell")
            
            Shell.Run Chr(34) & openFileName & Chr(34) '// Shell명령어로 파일 실행
            Set Shell = Nothing
            fName = Dir()       '// 다음 파일 찾음
            
        Loop While fName <> ""  '// 검색 결과 없을 때까지 반복

    End If
 
End Sub



※ 여기서 주의 할 점은 Shell Command를 사용할 때 "" 를 사용하지 않으면 경로를 찾지 못합니다.

그리하여 쌍다음표를 이용하여 경로의 시작과 끝에 감싸줍니다.

Chr(34) : ""

▶ subFolderFind : 재귀 함수로 폴더를 반복하다 서브폴더가 있으면 다시 자신을 호출해 찾는다.

Sub subFolderFind(sDir As Folder, getExt As String)
    '// 재귀적 함수
    '// 하위 모든 폴더를 반복하기 위함
    Dim subFolder As Folder
    
    On Error Resume Next
    For Each subFolder In sDir.SubFolders
        If subFolder.Files.Count > 0 Then   '// 서브 폴더에 파일들이 있으면 목록만들기 호출
            Call printFileLists(subFolder.Path, getExt)
        End If
            
        If subFolder.SubFolders.Count > 0 Then  '// 서브 폴더에 또 서브 폴더가 있으면 재귀하여 다시 검색
            Call subFolderFind(subFolder, getExt)
        End If
    Next
End Sub




728x90
반응형