Shell関数を使用すると、引数Pathnameで指定した外部のプログラムを実行します。
指定したプログラムが問題なく実行できると、プログラムのタスクIDを
バリアント型(内部処理形式Double)の値で返します。
引数WindowStyleで使用する定数は一覧のとおりです。
・引数windowstyleで使用する定数一覧(VbAppWinStyle)
定数 値 内容
vbHide 0 フォーカスを持ち、非表示にされるウィンドウ
vbNormalFocus 1 フォーカスを持ち、元のサイズと位置に復元されるウィンドウ
vbMinimizedFocus 2 フォーカスを持ち、最小化表示されるウィンドウ
vbMaximizedFocus 3 フォーカスを持ち、最大化表示されるウィンドウ
vbNormalNoFocus 4 最後にウィンドウを閉じたときのサイズと位置に復元される
フォーカスを持たないウィンドウ。現在アクティブなウィン
ドウは、アクティブのままです。
vbMinimizedNoFocus 6 最小化表示されるフォーカスを持たないウィンドウ。現在アク
ティブなウィンドウは、アクティブのままです。
構文 Shell(Pathname, WindowStyle)
設定項目 内容
pathname 実行するプログラム名と必要な引数名、またはコマンドライン
のスイッチを指定 [省略不可]
windowstyle 実行するプログラムのウィンドウの形式を指定 [省略可能]
次のサンプルは、電卓を最大表示で起動します。
●サンプル1●
Sub ShellSamp1()
Dim myID As Double
myID = Shell("CALC.EXE", vbMaximizedFocus)
'myID = Shell("C:\WINDOWS\CALC.EXE", vbMaximizedFocus)
'---パスつきで指定しても よい
End Sub
次のサンプル2は、メモ帳で指定したファイルを開きますが、フォーカスは移しません。
●サンプル2●
Sub ShellSamp2()
Dim myID As Double
myID = Shell("NOTEPAD.EXE テスト.txt", vbNormalNoFocus)
MsgBox "メモ帳でファイルを開きました"
'---タスクIDからアプリケーションをアクティブにする
AppActivate myID
End Sub
Shell関数で取得したタスクIDとAppActivateステートメントを利用すれば、起動した
アプリケーションに、いつでもフォーカスを移すことが可能です。
●注意●
Shell関数はプログラムを非同期的に実行します。したがって、Shell 関数を使用
して実行を開始したプログラムの終了を待たずに、Shell関数の次のステートメント
は実行されます。例えば2つめのサンプルでは、メモ帳がファイルを開く時間は考慮
せずに、メッセージボックスでメッセージを表示しています。開くファイルが大きな
ファイルで時間がかかる場合には、開き終わる前にメッセージが表示されてしまうこ
ともあるでしょう。そこで、対象のプログラムの処理終了までにかかる時間をテスト
して見積もっておき、終了するであろう時間までWaitメソッドでマクロ実行を停止さ
せておくようにしてください。なお、同期的に外部プログラムを実行させるには、
Windows32 APIを使用する必要があります。
●ポイント●
SendKeysステートメントは、エクセル以外のアプリケーションに対してもキー操作
を送ることができます。従って、Shell関数とSendKeysステートメントを利用すれば、
エクセル以外のアプリケーションの処理の自動化処理を、VBAで作成することができ
ます。ただし、あくまでキー操作を送るだけの自動化であり、両者が同期するわけで
はありませんので十分に注意する必要があります。例えば、マクロ実行中にキーボード
に触れたりするだけでも、結果に不具合が生じる可能性はかなり高いと言えます。
|