Home > 即効テクニック > Excel VBA > 関数関連のテクニック > 指定したプログラムを起動する(Shell関数)

即効テクニック

関数関連のテクニック

指定したプログラムを起動する(Shell関数)

(Excel 2000)
引数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で作成することができます。ただし、あくまでキー操作を送るだけの自動化であり、両者が同期するわけではありませんので十分に注意する必要があります。例えば、マクロ実行中にキーボードに触れたりするだけでも、結果に不具合が生じる可能性はかなり高いと言えます。