엑셀 VBA 실행 파일 찾기 :: GetFileApplication 함수 사용법
VBA 실행 파일 찾기, 목차 바로가기
함수 사용예제
- GetFileApplication ( "C:\Users\Oppadu\Desktop\예제.txt" )
'// "C:\Windows\system32\NOTEPAD.EXE" 를 반환합니다. - GetFileApplication ( "C:\Users\Oppadu\Desktop\예제.xlsx" )
'// "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" 를 반환합니다. - GetFileApplication ( "C:\Users\Oppadu\Desktop\없는파일.xlsx" )
'// "존재하지 않는 파일" 오류를 반환합니다. - GetFileApplication ( "C:\Users\Oppadu\Desktop\엑셀설치안됨.xlsx" )
'// 엑셀을 실행할 프로그램이 없을 경우 "실행 파일 없음" 오류를 반환합니다.
GetFileApplication 함수 설명
GetFileApplication는 VBA 매크로를 이용한 실행 파일 찾기 함수입니다. 예를들어, "메모장.txt"를 파일경로로 지정하면 메모장 실행 파일인 Notepad.exe의 파일경로를 반환합니다. (얘: C:\Windows\system32\NOTEPAD.EXE)

VBA로 파일을 실행하기 위한 OpenFile 명령문을 보다 다양한 방법으로 사용할 수 있도록 도와주는 필수 보조 명령문이며, 이외에 실행 파일과 관련된 다양한 명령문과 응용할 수 있습니다.
실행 파일 찾기 결과값은 사용중인 PC 설정에 따라 달라집니다. 예를들어, 그림파일의 실행 프로그램 기본값을 '그림판'으로 설정했다면, 명령문은 PAINT.EXE 를 결과값으로 반환합니다. 이외에 다른 프로그램일 경우, 실행 파일 찾기 함수는 기본값으로 설정 된 해당 프로그램의 파일경로를 반환합니다.(예: 알씨, 사진 등)

엑셀 실행파일 찾기, GetFileApplication함수의 동작원리
GetFileApplication 함수 전체 명령문
Option Explicit #If VBA7 Then ' https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-findexecutablea Private Declare PtrSafe Function FindExecutable& Lib "shell32.dll" Alias "FindExecutableA" _ (ByVal lpFile As String, _ ByVal lpDirectory As String, _ ByVal lpResult As String) #Else Private Declare Function FindExecutable& Lib "shell32.dll" Alias "FindExecutableA" _ (ByVal lpFile As String, _ ByVal lpDirectory As String, _ ByVal lpResult As String) #End If '############################################################### '오빠두엑셀 VBA 사용자지정함수 (https://www.oppadu.com/) '■ GetFileApplication 함수 '■ 지정한 경로의 파일을 실행할 실행프로그램(*.exe)을 찾아 반환합니다. '■ 인수 설명 '_____________sFile : 실행 프로그램을 찾을 파일의 파일경로입니다. '############################################################### Public Function GetFileApplication(ByVal sFile As String) As String Dim i As Long: Dim E As String If Dir(sFile) = "" Or sFile = "" Then GetFileApplication = "존재하지 않는 파일": Exit Function If Len(sFile) > 260 Then GetFileApplication = "글자수 초과": Exit Function ' Windows 최대 허용 파일경로는 260자 입니다. E = String(260, Chr(0)) i = FindExecutable(sFile, vbNullString, E) ' 실행 프로그램 있을 경우 32보다 큰 값을 반환합니다. If i > 32 Then GetFileApplication = Left$(E, InStr(E, Chr$(0)) - 1) Else GetFileApplication = "실행 파일 없음" End If End Function
명령문 동작원리 단계별 알아보기
- 실행파일 찾기를 위한 Windows 함수인 FindExecutableA 함수를 호출합니다.
#If VBA7 Then ' https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-findexecutablea Private Declare PtrSafe Function FindExecutable& Lib "shell32.dll" Alias "FindExecutableA" _ (ByVal lpFile As String, _ ByVal lpDirectory As String, _ ByVal lpResult As String) #Else Private Declare Function FindExecutable& Lib "shell32.dll" Alias "FindExecutableA" _ (ByVal lpFile As String, _ ByVal lpDirectory As String, _ ByVal lpResult As String) #End If
- 발생할 것이라고 예상되는 오류를 처리하기 위한 명령문을 추가합니다.
If Dir(sFile) = "" Or sFile = "" Then GetFileApplication = "존재하지 않는 파일": Exit Function If Len(sFile) > 260 Then GetFileApplication = "글자수 초과": Exit Function
- 파일 경로 뒤에 NullString(=Chr(0)) 을 추가하여 윈도우에서 허용하는 최대 글자수의 파일경로로 변환합니다.
' Windows 최대 허용 파일경로는 260자 입니다. E = String(260, Chr(0))
- FindExecutableA 함수를 사용하여 해당 파일의 실행 파일을 찾습니다.
i = FindExecutable(sFile, vbNullString, E)
- FindExecutableA 함수의 결과값이 32 초과일 경우, 실행 파일 경로를 반환한 뒤, 실행파일찾기 명령문을 종료합니다.
' 실행 프로그램 있을 경우 32보다 큰 값을 반환합니다. If i > 32 Then GetFileApplication = Left$(E, InStr(E, Chr$(0)) - 1) Else
- 결과값이 32 이하일 경우, 실행파일이 없다는 뜻이므로 "실행 파일 없음" 오류를 반환한 뒤, 실행파일찾기 명령문을 종료합니다.
' 결과값이 32미만일 경우, '실행파일 없음' 오류를 반환합니다. GetFileApplication = "실행 파일 없음" End If