반응형

엑셀 VBA ShellExcute 함수를 이용해서 엑셀 외 다른 응용프로그램을 실행/제어를 할 수 있다.


[ShellExcute 함수 시 주의사항]

1
2
3
4
5
6
7
8
9
'#1 ShellExecute 사용을 위한 Lib - 최 상단에 선언
'64bit와의 호환을 위해 PtrSafe 이라는 것을 명시해주기!
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias _
"ShellExecuteA" (ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
cs


[예시]


1. 응용프로그램 실행

ShellExecute(NULL, "open", "실행하려는 파일의 경로", NULL, NULL, SW_SHOW);


카카오톡 실행

ShellExecute(NULL, "open", "C:\\Program Files (x86)\\Kakao\\KakaoTalk\\KakaoTalk.exe");


2. 특정 프로그램으로 원하는 파일 열기

ShellExecute(NULL, "open", "파일을 열 프로그램", "텍스트파일 경로", NULL, SW_SHOW);


메모장으로 D드라이브의 test.txt 열기

ShellExecute(NULL, "open", "notepad", "D:\\test.txt", NULL, SW_SHOW);


3. 웹 페이지 열기

URL로 접속합니다. 현재 웹브라우저가 실행중인 경우 새 탭 혹은 현재 페이지에서 접속합니다.

ShellExecute(NULL, "open", "URL", NULL, NULL, SW_SHOW);




[실제 사용 예제 : windows cmd창을 실행하여 특정 프로그램 호출 후 제어]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'작성자 : prohannah2010

Public Sub Ex()
 
Dim Crfpp    As String
Dim Cmd     As String
Dim Result   AS String
Cmd = "C:\Windows\System32\cmd.exe"
Crfpp = ThisWorkbook.Path & "\exe\CRF++-0.58\CRF++-0.58"
 
'명령프롬포트 창에서 CRF++ Programm라는 응용프로그램을 호출한다.
    Result = ShellExecute(0"open", Cmd, vbNullString, Crfpp, 2'vbHide
    If Result < 32 Then MsgBox "error"
 
    SendKeys "crf_test -m Model " & TextFile_out & " > output.txt" & "{ENTER}"False '=>호출한 프로그램에 보내는 명령어이다.
    SendKeys "exit" & "{ENTER}"False '=> cmd를 종료시키는 기본 명령어임
 
End Sub
cs


 

기본 함수의 구성

ShellExecute(0, "작업구분", "실행할 프로그램 위치", 전달값, "프로그램에 전달할 매개값", 파일실행속성)


2번째 인자값 작업구분

 

 동사

설명 

"edit"

 <편집> 편집기를 시작하고 편집할 문서를 엽니다. lpFile에 문서 파일의 경로를 넘겨주어야합니다.

"explore"

 <탐색> lpFile 매개 변수에 의해 지정된 폴더를 탐색합니다.

"find"

 <검색> lpDirectory 매개 변수에 의해 지정된 디렉토리부터 검색을 시작합니다.

"open"

 <열기> lpFile 매개 변수에 의해 지정된 항목을 엽니다. 항목은 파일이나 폴더입니다.

"print"

 <출력> lpFile 매개 변수에 의해 지정된 파일을 인쇄합니다. lpFile 이 문서 파일이 아닌 경우, 함수는 실패합니다.

NULL

 <기본> 가능한 경우 기본 동사가 사용됩니다. 그렇지 않으면, "open" 동사가 사용됩니다. 모두 가능하지 않을 시에, 시스템은 레지스트리에 나열된 첫번째 동사를 사용합니다.

 


5번째 인자값 파일실행속성

 

플래그

 설명

SW_HIDE (0) 

 윈도우를 숨기고 다른 윈도우를 활성화합니다. 

 SW_MAXIMIZE (3)

 지정된 윈도우를 최대화합니다. 

 SW_MINIMIZE (6)

 지정된 윈도우를 최소화 하고 바로 아래에 있는 윈도우(위에서 다음번째의 z-order를 가진 윈도우)를 활성화합니다.  

SW_RESTORE (9) 

 윈도우를 활성화하고 표시합니다. 윈도우가 최소화 또는 최대화 된 경우 Windows 운영체제가 이를원래 크기와 위치로 복원합니다. 최소화 된 윈도우를 복원 할 때 응용 프로그램이 플래그를 지정해야합니다. 

SW_SHOW (5) 

 윈도우를 활성화하고 현재 크기와 위치에 표시합니다. 

 SW_SHOWDEFAULT (10)

 응용 프로그램을 시작한 프로그램에서 CreateProcess 함수에 전달한 STARTUPINFO 구조체에 지정된 SW_ 플래그에 따라 표시 상태를 설정합니다. 응용 프로그램은 메인 윈도우의 초기 표시 상태를 설정하려면 ShowWindow 플래그를 호출해야합니다.

 SW_SHOWMAXIMIZED (3)

 윈도우를 활성화하고 최대화된 상태로 표시합니다. 

 SW_SHOWMINIMIZED (2)

 윈도우를 활성화하고 최소화된 상태로 표시합니다.

 SW_SHOWMINNOACTIVE (7)

 최소화된 윈도우로 윈도우를 표시합니다. 활성 윈도우는 활성 상태로 유지됩니다. 

 SW_SHOWNA (8)

 해당 윈도우의 현재 상태로 윈도우를 표시합니다. 활성 윈도우는 활성 상태로 유지됩니다.

SW_SHOWNOACTIVATE (4) 

 가장 최근의 크기와 위치에 윈도우를 표시합니다.활성 윈도우는 활성 상태로 유지됩니다. 

SW_SHOWNORMAL (1) 

윈도우를 활성화하고 표시합니다. 윈도우가 최소화 또는 최대화 된 경우 Windows 운영체제가 이를원래 크기와 위치로 복원합니다. 처음으로 윈도우를 표시 할 때 응용 프로그램이 플래그를 지정해야합니다. 

 


----------------------------------------------------------------------------------------------


[한마디]

해당 함수의 단점 : 호출한 프로그램을 핸들링하는 것이 제한적이다.

                     프로그램을 조작할 수 있는 기능이 별로 없으며 Sendkey를 통해 부모 프로그램에서 명령어를 전달할 경우,

                     호출된 프로그램에 포커스가 가있어야만 Sendkey를 활용할 수 있다.

                     해당 함수를 보완하기 위한 상위 버전이 나왔으나 지원해주지 않는 기능이 있어 해당 함수를 이용함.

                     


반응형

'Programming > VBA' 카테고리의 다른 글

엑셀 VBA 텍스트파일 읽어오기  (4) 2017.02.15