金曜日, 8月 28, 2009
[VBA]Shell関数(EXE実行)
▼質問
ExcelでEXEを実行したツールを作りたいんだ。
どうやったらできるか教えてくれ!
▼回答
APIを使った関数を作ったから参考にしてくれ!!
標準モジュールに次のコードをコピーしてから
使ってくれ!!
Option Explicit
Public Const SYNCHRONIZE = 1048576
Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const PROCESS_TERMINATE = &H1
Public Const PROCESS_QUERY_INFORMATION = &H400&
Public Const STILL_ACTIVE = &H103&
Public Declare Function OpenProcess Lib "kernel32" _
(ByVal dwAccess As Long, ByVal fInherit As Long, ByVal IDProcess As Long) As Long
Public Declare Function WaitForSingleObject Lib "kernel32.dll" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32.dll" _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
Private Function ShellExec(ByVal pPathName As String) As Boolean
Dim pid As Variant
Dim hProcess As Long
Dim lpExitCode As Long
On Error GoTo doError
pid = Shell(pPathName, vbNormalFocus)
'起動したプログラムのプロセスハンドルを取得
hProcess = OpenProcess(SYNCHRONIZE Or PROCESS_QUERY_INFORMATION, True, pid)
'指定のオブジェクトがシグナル状態になるか、タイムアウト時間を経過するまで待機する
WaitForSingleObject hProcess, 100000
'プロセスの終了状態を取得
GetExitCodeProcess hProcess, lpExitCode
'プロセスハンドルのクローズ
CloseHandle hProcess
ShellExec = True
Exit Function
doError:
MsgBox Err.Description
ShellExec = False
End Function
■参考サイト
VB テクニック編13 - バッチ実行、EXE バッチ実行、関連付け実行、文字列置換 - SAK Streets
VB & VBAプログラミング
ExcelでEXEを実行したツールを作りたいんだ。
どうやったらできるか教えてくれ!
▼回答
APIを使った関数を作ったから参考にしてくれ!!
標準モジュールに次のコードをコピーしてから
使ってくれ!!
Option Explicit
Public Const SYNCHRONIZE = 1048576
Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const PROCESS_TERMINATE = &H1
Public Const PROCESS_QUERY_INFORMATION = &H400&
Public Const STILL_ACTIVE = &H103&
Public Declare Function OpenProcess Lib "kernel32" _
(ByVal dwAccess As Long, ByVal fInherit As Long, ByVal IDProcess As Long) As Long
Public Declare Function WaitForSingleObject Lib "kernel32.dll" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32.dll" _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
Private Function ShellExec(ByVal pPathName As String) As Boolean
Dim pid As Variant
Dim hProcess As Long
Dim lpExitCode As Long
On Error GoTo doError
pid = Shell(pPathName, vbNormalFocus)
'起動したプログラムのプロセスハンドルを取得
hProcess = OpenProcess(SYNCHRONIZE Or PROCESS_QUERY_INFORMATION, True, pid)
'指定のオブジェクトがシグナル状態になるか、タイムアウト時間を経過するまで待機する
WaitForSingleObject hProcess, 100000
'プロセスの終了状態を取得
GetExitCodeProcess hProcess, lpExitCode
'プロセスハンドルのクローズ
CloseHandle hProcess
ShellExec = True
Exit Function
doError:
MsgBox Err.Description
ShellExec = False
End Function
■参考サイト
VB テクニック編13 - バッチ実行、EXE バッチ実行、関連付け実行、文字列置換 - SAK Streets
VB & VBAプログラミング