엑셀 VBA ShellExcute 함수로 프로그램 실행/제어하기
엑셀 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" 동사가 사용됩니다. 모두 가능하지 않을 시에, 시스템은 레지스트리에 나열된 첫번째 동사를 사용합니다. [출처] [Win API] ShellExecute 함수|작성자 고로케
|
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 운영체제가 이를원래 크기와 위치로 복원합니다. 처음으로 윈도우를 표시 할 때 응용 프로그램이 플래그를 지정해야합니다. [출처] [Win API] ShellExecute 함수|작성자 고로케
|
----------------------------------------------------------------------------------------------
[한마디]
해당 함수의 단점 : 호출한 프로그램을 핸들링하는 것이 제한적이다.
프로그램을 조작할 수 있는 기능이 별로 없으며 Sendkey를 통해 부모 프로그램에서 명령어를 전달할 경우,
호출된 프로그램에 포커스가 가있어야만 Sendkey를 활용할 수 있다.
해당 함수를 보완하기 위한 상위 버전이 나왔으나 지원해주지 않는 기능이 있어 해당 함수를 이용함.
'Programming > VBA' 카테고리의 다른 글
엑셀 VBA 텍스트파일 읽어오기 (4) | 2017.02.15 |
---|