本ページには広告が含まれています。

VBA Shell 関数 外部プログラムやコマンドを実行します

VBA Shell 関数 外部プログラムやコマンドを実行します

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 には、次の定数または値を指定できます。

定数説明
vbHide0非表示で実行
vbNormalFocus1通常のサイズでアクティブ表示
vbMinimizedFocus2最小化でアクティブ表示
vbMaximizedFocus3最大化でアクティブ表示
vbNormalNoFocus4通常サイズで非アクティブ
vbMinimizedNoFocus6最小化で非アクティブ

戻り値

指定したプログラムの実行結果を示す次の値を返します。

実行結果戻り値
成功プログラムのタスク ID を表す Variant (Double) の値
失敗

解説(使用例)

ここからは、サンプルを使って使用例や注意点などについて解説します。

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 APIWScript.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 の Shell 関数を使えば、Excel や Access などから簡単に外部アプリケーションやコマンドを実行できます。

  • 基本構文は Shell(pathname, windowstyle) です
  • windowstyle で起動スタイルを制御できます(省略時はvbMinimizedFocus)
    • リファレンス上は最小化が既定値ですが、アプリによっては通常表示で起動される場合があるようです(例:電卓)
  • 戻り値(タスクID)は「識別子」として使えます
  • 起動したアプリの制御には Windows APIWScript.Shell が必要です
  • ファイルダイアログと組み合わせれば「ユーザーに選ばせる」こともできます

Shell 関数を活用することで、業務自動化やツール連携などの実用的な処理を実現できるのではないでしょうか。ぜひ試してみてください。

以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;幸いです(^^;

VBAの関数一覧はこちらからご参照ください。

スポンサーリンク
スポンサーリンク

VBAサンプルファイルダウンロードページのご案内

このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。

ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!