VBAでファイルを既定のアプリで開く方法
Excelマクロで、エクセル以外のファイルを既定のアプリケーションで開く場合の方法について何通りか解説します、
VBAでファイルを単純に開くだけの場合についてになります。
対応するアプリケーション毎に個別の対応が必要になりますが、
Windowsで開けるファイルであり、開くだけなら、どんなファイルでも開くことができます。
実行テストメイン
Sub TestMain()
Dim strFile As String
'ファィルのフルパスを指定
strFile = "C:\Test\te st.txt"
If Dir(strFile) = "" Then
MsgBox "ファイルが存在しません。"
Exit Sub
End If
Call FileOpen_Shell(strFile)
Call FileOpen_CmdExe(strFile)
Call FileOpen_WScriptShell2(strFile)
Call FileOpen_ShellApplication(strFile)
Call FileOpen_FollowHyperlink(strFile)
End Sub
Callの部分は、テストしない行はコメントアウトして実行してください。
ファイルが存在しなければ意味がないので、ここで確認しています。
Shell関数
| pathname | 必ず指定します。 フォルダ、またはドライブを含めて指定できます。 実行するプログラム名と必要な引数名またはコマンド ラインのスイッチを指定します。 |
||||||||||||||
| windowstyle | 省略可能です。 実行するプログラムのウィンドウの形式に対応するバリアント型の値を指定します。 省略すると、プログラムはフォーカスを持った状態で最小化され、実行を開始します。
|
Sub FileOpen_Shell(ByVal strFile As String)
Dim strExe As String
strExe = "notepad.exe"
Shell strExe & " " & strFile, vbNormalFocus
End Sub
ファイルを開いたアプリケーションの終了を待つ場合はAPIを使用する必要があります。
外部サイトですが以下で紹介されています。
外部プログラムの実行と処理待ち(APIを利用した同期処理)|Excel VBA
従って、拡張子に紐づくexeがわかっていないとこの方法は使えません。
これを自動で取得するのは、かなり面倒で現実的ではないでしょう。
いろいろなファイルを開きたいときには、
拡張子を判定して起動するexeを切り替える必要がある場合は、別の方法を選択したほうが良いでしょう。
batファイル(コマンド プロンプト)
VBAからはバッチを起動して、そのバッチの中でファイルを開く方法です。
Sub FileOpen_CmdExe(ByVal strFile As String)
Dim batFile As String
strFile = """" & strFile & """"
batFile = ThisWorkbook.Path & "\vba_temp.bat"
Open batFile For Output As #1
Print #1, strFile
Close #1
Shell batFile, vbMinimizedNoFocus
End Sub
ファイル名にスペースが含まれている場合の対応として、前後に"を追加しています。
コマンド プロンプト内で、ファイルのフルパスを入力すれば、
拡張子に紐づいているアプリケーションでファイルが開かれます。
起動されたコマンド プロンプトは、ファイルが閉じられるまで待ち状態になります。
ファイルを開いたアプリケーションの終了を待つ場合は、
先のShell関数と同様の方法になります。

上の画像は、Windows10での画面です。
WScript.Shell
WScript.Shellについては、
特殊フォルダの取得(WScript.Shell,SpecialFolders)
object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
| object | WshShell オブジェクトです。 | ||||||||||||||||||||||||
| strCommand | 実行するコマンド ラインを示す文字列値です。 この引数には、実行可能ファイルに渡すべきパラメータをすべて含める必要があります。 |
||||||||||||||||||||||||
| intWindowStyle | 省略可能です。 プログラムのウィンドウの外観を示す整数値です。
|
||||||||||||||||||||||||
| bWaitOnReturn | 省略可能です。 スクリプト内の次のステートメントに進まずにプログラムの実行が終了するまでスクリプトを待機させるかどうかを示すブール値です。 TRUE を指定すると、プログラムの実行が終了するまでスクリプトの実行は中断され、Runメソッドはアプリケーションから返される任意のエラー コードを返します。 bWaitOnReturnにFALSE を指定すると、プログラムが開始するとRunメソッドは即座に復帰して自動的に 0 を返します。 |
Sub FileOpen_WScriptShell(ByVal strFile As String)
Dim wsh As Object
Set wsh = CreateObject("Wscript.Shell")
strFile = """" & strFile & """"
wsh.Run strFile, 1
Set wsh = Nothing
End Sub
Sub FileOpen_WScriptShell(ByVal strFile As String)
'参照設定「Windows Script Host Object Model」
Dim wsh As IWshRuntimeLibrary.WshShell
Set wsh = New IWshRuntimeLibrary.WshShell
strFile = """" & strFile & """"
wsh.Run strFile, 1
Set wsh = Nothing
End Sub
ファイル名にスペースが含まれている場合の対応として、前後に"を追加しています。
ファイルを開いたアプリケーションの終了を待つ場合は、bWaitOnReturnにTrueを指定します。
拡張子に紐づくアプリケーションがない場合は、
「このファイルを開く方法を選んでください」のメッセージが出ます。
Shell.Application
Shell32.Shellには豊富なメソッドが用意されています。
| 方法 | 説明 |
| AddToRecent | 最近使用した(MRU)リストにファイルを追加します。 |
| BrowseForFolder | ユーザーがフォルダーを選択してから選択したフォルダーのFolderオブジェクトを返すことを可能にするダイアログボックスを作成します。 |
| CanStartStopService | 現在のユーザーが名前付きサービスを開始および停止できるかどうかを決定します。 |
| CascadeWindows | デスクトップ上のすべてのウィンドウをカスケードします。この方法は、タスクバーを右クリックして[Windowsのカスケード]を選択するのと同じ効果があります。 |
| ControlPanelItem | 指定されたコントロールパネル(* .cpl)アプリケーションを実行します。アプリケーションがすでに開いている場合は、実行中のインスタンスがアクティブになります。 |
| EjectPC | コンピュータをドッキングステーションから取り出します。お使いのコンピュータがこのコマンドをサポートしている場合、これはスタートメニューをクリックしてPCの取り出しを選択することと同じです。 |
| Explore | Windowsエクスプローラウィンドウで指定されたフォルダを開きます。 |
| ExplorerPolicy | 指定したInternet Explorerポリシーの値を取得します。 |
| FileRun | ユーザーに「実行」ダイアログを表示します。この方法は、スタートメニューをクリックしてファイル名を指定して実行を選択するのと同じ効果があります。 |
| FindComputer | 表示コンピュータ:検索結果]ダイアログボックスを。ダイアログボックスに、指定したコンピュータの検索結果が表示されます。 |
| FindFiles | [検索]ダイアログボックスを表示します。これは、[スタート]メニューをクリックしてから[検索]を選択するのと同じです。 |
| FindPrinter | [プリンタの検索]ダイアログボックスを表示します。 |
| GetSetting | グローバルシェル設定を取得します。 |
| GetSystemInformation | システム情報を取得します。 |
| Help | Windowsのヘルプとサポートセンターを表示します。この方法は、スタートメニューをクリックしてヘルプとサポートを選択するのと同じ効果があります。 |
| IsRestricted | レジストリからグループの制限設定を取得します。 |
| IsServiceRunning | 特定のサービスが実行されているかどうかを示す値を返します。 |
| MinimizeAll | デスクトップ上のすべてのウィンドウを最小化します。この方法は、タスクバーを右クリックして[古いシステムではすべてのウィンドウを最小化]を選択するのと同じ効果があります。 |
| NameSpace | 指定されたフォルダのFolderオブジェクトを作成して返します。 |
| Open | 指定したフォルダを開きます。 |
| RefreshMenu | スタートメニューの内容を更新します。Windows XPより前のシステムでのみ使用されます。 |
| SearchCommand | Apps Searchペインを表示します。 |
| ServiceStart | 名前付きサービスを開始します。 |
| ServiceStop | 名前付きサービスを停止します。 |
| SetTime | 表示日付と時刻のプロパティ]ダイアログボックスを。この方法は、タスクバーのステータス領域で時計を右クリックして[日付と時刻の調整]を選択するのと同じ効果があります。 |
| ShellExecute | 指定されたファイルに対して指定された操作を実行します。 |
| ShowBrowserBar | ブラウザバーを表示します。 |
| ShutdownWindows | [Windowsのシャットダウン]ダイアログボックスを表示します。これは、[スタート]メニューをクリックして[シャットダウン]を選択するのと同じです。 |
| Suspend | |
| TileHorizontally | デスクトップ上のすべてのウィンドウを水平に並べて表示します。この方法は、タスクバーを右クリックして[ウィンドウを左右に並べて表示]を選択するのと同じ効果があります。 |
| TileVertically | デスクトップ上のすべてのウィンドウを縦に並べて表示します。この方法は、タスクバーを右クリックして[縦に並べて表示]を選択するのと同じ効果があります。 |
| ToggleDesktop | デスクトップを表示または非表示にします。 |
| TrayProperties | 表示タスクバーをし、メニューのプロパティの[スタート]ダイアログボックスを。この方法は、タスクバーを右クリックして[プロパティ]を選択するのと同じ効果があります。 |
| UndoMinimizeALL | すべてのデスクトップウィンドウを最後のMinimizeAllコマンドの前の状態に復元します。この方法は、タスクバーを右クリックして[古いシステムではすべてのウィンドウを元に戻す]を選択するか、Windows 2000またはWindows XPでタスクバーのクイック起動領域にある[デスクトップの表示]アイコンをもう一度クリックするのと同じ効果があります。 |
| Windows | ShellWindowsオブジェクトを作成して返します。このオブジェクトは、シェルに属する開いているすべてのウィンドウのコレクションを表します。 |
| WindowsSecurity | 表示Windowsのセキュリティ]ダイアログボックスを。 |
| WindowSwitcher | 開いているウィンドウを3Dスタックで表示します。 |
ShellExecuteメソッド
Shell.ShellExecute(sFile,[vArguments],[vDirectory],[vOperation],[vShow])
| sFile | ファイルを指定 | ||||||||||||||||||
| vArguments | パラメータ値を含む文字列 | ||||||||||||||||||
| vDirectory | sFileで指定されたファイルを含むディレクトリの完全修飾パス。このパラメータが指定されていない場合は、現在の作業ディレクトリが使用されます。 | ||||||||||||||||||
| vOperation | ファイルでサポートされている動詞文字列(open等)の1つに設定されます。 このパラメータを指定しないと、デフォルトの操作が実行されます。 |
||||||||||||||||||
| vShow |
|
Sub FileOpen_ShellApplication(ByVal strFile As String)
Dim sh As Object
Set sh = CreateObject("Shell.Application")
sh.ShellExecute strFile
Set sh = Nothing
End Sub
Sub FileOpen_ShellApplication2(ByVal strFile As String)
'参照設定「Microsoft Shell Controls And Automation」
Dim sh As Shell32.Shell
Set sh = New Shell32.Shell
sh.ShellExecute strFile
Set sh = Nothing
End Sub
詳しくは調べられていませんが、
ShellExecuteメソッドは、処理完了を待つ方法がないようです。
「このファイルを開く方法を選んでください」のメッセージが出ます。
FollowHyperlink
とにかく指定のファイルが既定のアプリケーションで開かれれば良いというだけなら、
WorkBookのFollowHyperlinkメソッドを使えば簡単に実現できます。
Workbook.FollowHyperlink(Address,[SubAddress],[NewWindow],[AddHistory],[ExtraInfo],[Method],[HeaderInfo])
| 名前 | 説明 | |||||||||
| Address | 目的の文書のアドレスを指定します。 | |||||||||
| SubAddress | 目的の文書内の位置を指定します。 既定値は空の文字列です。 |
|||||||||
| NewWindow | 新しいウィンドウに目的のアプリケーションを表示するには、この引数に True を設定します。 既定値は False です。 |
|||||||||
| AddHistory | 現在は使用されていません。 | |||||||||
| ExtraInfo | ハイパーリンクを解決するための HTTP の追加情報を指定する文字列 (String)、またはバイト配列を指定します。 たとえば、引数 ExtraInfo を使用すると、イメージ マップの座標、フォームの内容、または FAT ファイル名を指定できます。 |
|||||||||
| Method | 指定した引数 ExtraInfo の接続方法を指定します。 MsoExtraInfoMethod クラスの定数を使用します。
|
|||||||||
| HeaderInfo | HTTP 要求のヘッダー情報を指定する文字列 (String) を指定します。 既定値は空の文字列です。 |
Sub FileOpen_FollowHyperlink(ByVal strFile As String)
ThisWorkbook.FollowHyperlink strFile
End Sub
1行のVBAだけで、ファイルを既定のアプリケーションで開くことができています。
これ以上簡単な方法はなさそうです。
ただし、
処理待ちするように機能拡張することは全くできません。
Win32APIでウィンドウを検索するといった方法もあるでしょうが、それならWScript.Shellを使ったほうが良いでしょう。
まず、以下のメッセージが出ます。

これには、「On Error Resume Next」をいれれば対応できます。
「このファイルを開く方法を選んでください」のメッセージが出ます。
最後に
どの方法を選択すれば良いかは変わってくると思います。
目的に応じて、適切な方法を検討してください。
同じテーマ「マクロVBA技術解説」の記事
オブジェクトの探索方法(オートシェイプのTextを探して)
条件付きコンパイル(32ビット64ビットの互換性)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
VBAでファイルを既定のアプリで開く方法
Excelアドインの作成と登録について
VBAでのタイマー処理(SetTimer,OnTime)
マクロでShift_JIS文字コードか判定する
Byte配列と文字コード関数について
Applicationを省略できるApplicationのメソッド・プロパティ一覧
PowerQueryの強力な機能をVBAから利用する方法
ShapesとDrawingObjectsの相違点と使い方
新着記事NEW ・・・新着記事一覧を見る
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- VBAでファイルを既定のアプリで開く方法
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
