なぜVBAから外部アプリを起動するのか
実務において、Excelだけで業務が完結することは稀です。例えば「出力したCSVデータをメモ帳で確認する」「特定のPDFマニュアルを開く」「社内ツール(バッチファイル)を実行する」といった作業は日常的です。
これらをVBAで自動化することで、手作業による「ファイルを探す手間」や「起動し忘れるミス」を減らし、業務フローをシームレスにつなぐことができます。
基礎知識:Shell関数とWScript.Shell
VBAから外部アプリを呼び出すには、主に2つの方法があります。
1. Shell関数:Windows標準の実行ファイル(.exe)を直接起動する場合に使います。シンプルで高速ですが、起動後の詳細な制御(待機など)には向きません。
2. WScript.Shell:Windows Script Hostの機能を利用する方法です。関連付けられたアプリケーションを起動したり、処理の終了を待機させたりと、実務でより柔軟な制御が可能です。
実装のポイント
実務で最も注意すべきは「起動のタイミング」です。外部アプリの起動にはコンマ数秒のタイムラグがあるため、アプリが完全に開く前に次の命令を送ると、Excel側でエラーが発生したり、誤動作を招いたりします。
特にSendKeysメソッドでキー入力をエミュレートする場合は、必要に応じて「Wait」を入れるなどの工夫が必要です。
サンプルプログラム:実務で使える2つのパターン
以下のコードは、標準モジュールにコピー&ペーストして試すことができます。
Sub OpenAppAndFile()
‘ 1. Shell関数でメモ帳を起動する例
Dim TaskID As Long
‘ 成功するとタスクIDが返り、失敗すると0が返ります
TaskID = Shell(“notepad.exe”, vbNormalFocus)
If TaskID = 0 Then
MsgBox “メモ帳の起動に失敗しました。”
End If
End Sub
Sub RunAndWaitFile()
‘ 2. WScript.ShellでPDFを開き、処理終了を待機する例
‘ 第3引数をTrueにすると、アプリを閉じるまでVBAの処理を一時停止します
Dim WSH As Object
Set WSH = CreateObject(“Wscript.Shell”)
‘ 例:PDFファイルを開く
‘ 最後の引数Trueが待機命令です
On Error Resume Next ‘ ファイルがない場合のエラー回避
WSH.Run “C:\Work\Manual.pdf”, 1, True
If Err.Number <> 0 Then
MsgBox “指定のファイルが見つかりませんでした。”
End If
On Error GoTo 0
Set WSH = Nothing
MsgBox “PDF閲覧が終了しました。次の業務に進みます。”
End Sub
応用と注意点:現場でのトラブル回避
1. パス指定の罠
ファイルパスにスペースが含まれている場合、Shell関数は正しく認識できないことがあります。その場合は、パス全体をダブルクォーテーションで囲む必要があります(例:”””C:\Program Files\App.exe”””)。
2. SendKeysは最後の手段に
SendKeysメソッド(キー操作の自動送信)は便利ですが、ユーザーが別のウィンドウを触ると意図しない場所に入力されてしまいます。可能であれば、対象のアプリがCOMオートメーション(外部制御)に対応していないか確認し、対応している場合はSet命令などで直接操作する方が確実です。
3. 待機処理の重要性
WScript.ShellのRunメソッドでTrueを指定しても、アプリケーションの仕様によっては「起動した瞬間に完了」と見なされることがあります。うまく動作しない場合は、Application.Waitなどで少しの間だけ待機時間を設けるのが、現場での賢い回避策です。
