Excel VBAの「Shell 関数」について解説します。
Shell 関数とは
Excel VBA の Shell 関数は、VBAで実行可能な外部プログラムやコマンドを実行したいときに使用します。実行に成功した場合はプログラムのタスク ID を返します。
例えば Shell 関数を使って、ExcelからVBAでメモ帳を開いたり、コマンドプロンプトを操作したりすることができます。
Shell 関数の構文や実際の使い方や注意点について具体的に解説していきたいと思います。
Shell 関数(Visual Basic for Applications リファレンス)
構文(引数と戻り値)
Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。
構文
Shell(pathname[, windowstyle])
引数
指定項目 | 説明 |
---|---|
pathname | 【必須】実行するプログラムやコマンドを文字列で指定します |
windwstyle | 【省略可能】ウィンドウの表示状態を指定します |
※ pathname に指定するパスにスペースが含まれる場合は、必ず ” ” で囲む必要があります。
※ windowstyle 省略時の規定値は vbMinimizedFocus で 最小化のアクティブ表示です。
ただし、アプリによっては通常表示で起動される場合があります(例:電卓)
引数 windowstyle には、次の定数または値を指定できます。
定数 | 値 | 説明 |
---|---|---|
vbHide | 0 | 非表示で実行 |
vbNormalFocus | 1 | 通常のサイズでアクティブ表示 |
vbMinimizedFocus | 2 | 最小化でアクティブ表示 |
vbMaximizedFocus | 3 | 最大化でアクティブ表示 |
vbNormalNoFocus | 4 | 通常サイズで非アクティブ |
vbMinimizedNoFocus | 6 | 最小化で非アクティブ |
戻り値
指定したプログラムの実行結果を示す次の値を返します。
実行結果 | 戻り値 |
---|---|
成功 | プログラムのタスク ID を表す Variant (Double) の値 |
失敗 | 0 |
解説(使用例)
ここからは、サンプルを使って使用例や注意点などについて解説します。
Shell 関数の基本的な使い方
電卓を開く例
VBAから電卓(calc.exe)を単純に開くだけの例です。
'■Shell関数サンプル1(電卓を開く例)
Sub Shell_Sample_01()
Shell "calc.exe", vbNormalFocus
End Sub
通常のサイズでアクティブ表示する設定です。
特定のファイルを開く例
次の例は、特定のテキストファイルをメモ帳で開くように設定している例です。
'■Shell関数サンプル2(メモ帳で特定のファイルを開く例)
Sub Shell_Sample_02()
Shell "notepad.exe C:\test\sample.txt", vbNormalFocus
End Sub
開くテキストファイルはフルパスで指定します。
「notepad.exe」がフルパス指定せずになぜ実行できるのかについては後ほど解説します。
cmd.exe のコマンドを実行する
Shell 関数を使って、コマンドプロンプト(cmd.exe)のコマンドを実行することも可能です。
ipconfigを実行する例
ipconfigコマンドは、IPアドレスを確認したり更新したりするときに使うコマンドです。
'■Shell関数サンプル3(cmdのコマンド実行例)
Sub Shell_Sample_03()
Shell "cmd.exe /k ipconfig", vbNormalFocus
End Sub
- cmd.exe のオプション ( /k ) をコマンドラインに指定しています。
- /c : コマンド実行後にウィンドウを閉じます
- /k : コマンド実行後もウィンドウを開いたままにします
Shell関数の戻り値について
Shell関数は タスクID(プログラムID) を返します。このIDを使ってプロセス管理することも可能です。
タスクIDを表示する例
'■Shell関数サンプル4(タスクIDを表示する例)
Sub Shell_Sample_04()
Dim taskID As Variant
taskID = Shell("notepad.exe", vbNormalFocus)
MsgBox "起動したプログラムのタスクIDは " & taskID
End Sub
Shell 関数で起動したプログラムのタスクIDを変数で受け、MsgBoxに表示します。
戻り値(タスクID)の詳しい解説
戻り値として返ってくるタスクIDは、Windowsが起動したプロセスに割り当てる番号です。
同じプログラムを複数起動させた場合、すべて違うタスクIDが返ってきます。VBA内で「どのプログラムを起動したのか」を識別するために使えます。
タスクIDでできること
- 起動したアプリの識別(複数アプリを区別することが可能)
- 終了を待つ処理(ただしAPIの
OpenProcess
+WaitForSingleObject
を使う必要がある) - ログ管理(起動時刻やアプリ名とセットで記録するなど)
タスクIDだけではできないこと
- プロセスが終了しているかどうかの確認
- プロセスを強制終了
- ウィンドウを操作(最小化・最大化・閉じる)
- 起動したアプリの標準出力やエラー出力の取得
以上のように、タスクID単独では「識別子」としての役割にとどまります。
本格的に制御するには Windows API や WScript.Shell を組み合わせる必要があります。
【応用】ユーザーに起動するアプリを選ばせる
実務で「毎回違うアプリを起動させたい」というケースがあります。そんな場合、次のような例で実現が可能です。
ファイル選択ダイアログでアプリを指定して実行
「ファイル選択ダイアログ」で実行ファイルを選択して開く例です。
'■Shell関数サンプル5(選択アプリを実行する例)
Sub Shell_Sample_05()
Dim fd As FileDialog
Dim chosenFile As String
Dim taskID As Variant
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.Title = "起動するアプリを選択してください"
.Filters.Clear
.Filters.Add "実行ファイル", "*.exe"
.AllowMultiSelect = False
If .Show = -1 Then
chosenFile = .SelectedItems(1)
taskID = Shell("""" & chosenFile & """", vbNormalFocus)
MsgBox chosenFile & vbCrLf & _
"を起動しました。タスクID: " & taskID
Else
MsgBox "キャンセルされました。"
End If
End With
End Sub
このようにすれば、汎用的に使えるので便利です。
なぜ一部のアプリはパスなしで実行できるのか?
サンプルに示した「calc.exe」や「notepad.exe」がフルパスで指定していないのに実行できるのかを解説します。
それは、実行ファイルが Windowsシステムフォルダ(C:\Windows\System32) に存在しているからです。パス指定がなかった場合は、次のような挙動でファイルを検索しています。
- Windowsはプログラム実行時に「カレントフォルダ → システムフォルダ → PATH環境変数」を順番に検索します
- System32 は PATH に標準登録されているため、notepad.exe と書くだけで見つかります
- 実際には C:\Windows\System32\notepad.exe を呼び出しています
パス不要で呼び出せる主なアプリ
- notepad.exe(メモ帳)
- calc.exe(電卓)
- mspaint.exe(ペイント)
- cmd.exe(コマンドプロンプト)
- control.exe(コントロールパネル)
フルパス指定が必要なアプリ
PATH環境変数に指定されていないユーザーがインストールしたアプリなどは、必ずフルパスで指定する必要があります。(ユーザーがインストールしたアプリでもPATH環境変数に登録されている場合を除きます)
まとめ
VBAの関数一覧はこちらからご参照ください。
VBAサンプルファイルダウンロードページのご案内
このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。
ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!
VBA の Shell 関数を使えば、Excel や Access などから簡単に外部アプリケーションやコマンドを実行できます。
Shell 関数を活用することで、業務自動化やツール連携などの実用的な処理を実現できるのではないでしょうか。ぜひ試してみてください。
以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;幸いです(^^;