VBA技術解説
VBAでファイルを既定のアプリで開く方法

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2019-01-20 最終更新日:2019-12-21

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関数

VBAのShell関数を使う方法です。
・Shell関数の構文 ・Shell関数の使用例 ・起動したアプリの終了を待つ同期処理
Shell(pathname[,windowstyle])

pathname 必ず指定します。
フォルダ、またはドライブを含めて指定できます。
実行するプログラム名と必要な引数名またはコマンド ラインのスイッチを指定します。
windowstyle 省略可能です。
実行するプログラムのウィンドウの形式に対応するバリアント型の値を指定します。
省略すると、プログラムはフォーカスを持った状態で最小化され、実行を開始します。
定数 内容
vbHide フォーカスを持ち、非表示にされるウィンドウ。
vbNormalFocus フォーカスを持ち、元のサイズと位置に復元されるウィンドウ
vbMinimizedFocus フォーカスを持ち、最小化表示されるウィンドウ
vbMaximizedFocus フォーカスを持ち、最大化表示されるウィンドウ
vbNormalNoFocus 最後にウィンドウを閉じたときのサイズと位置に復元されるフォーカスを持たないウィンドウ。
現在アクティブなウィンドウは、アクティブのままです。
vbMinimizedNoFocus 最小化表示されるフォーカスを持たないウィンドウ。
現在アクティブなウィンドウは、アクティブのままです。

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で直接Shell関数を使うのではなく、
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関数と同様の方法になります。

拡張子に紐づくアプリケーションがない場合は、以下のメッセージが出ます。

マクロ VBA
上の画像は、Windows10での画面です。

WScript.Shell

WshShellオブジェクトのRunメソッドを使います。
WScript.Shellについては、
特殊フォルダの取得(WScript.Shell,SpecialFolders)
・WScript.Shell ・SpecialFolders プロパティ ・WshShellのSpecialFoldersのマクロVBA使用例
こちらを参照してください。

WshShellオブジェクト.Runメソッド
object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
Runメソッドの引数

object WshShell オブジェクトです。
strCommand 実行するコマンド ラインを示す文字列値です。
この引数には、実行可能ファイルに渡すべきパラメータをすべて含める必要があります。
intWindowStyle 省略可能です。
プログラムのウィンドウの外観を示す整数値です。
IntWindowStyle 内容
0 ウィンドウを非表示にし、別のウィンドウをアクティブにします。
1 ウィンドウをアクティブにして表示します。
ウィンドウが最小化または最大化されている場合は、元のサイズと位置に戻ります。
アプリケーションでウィンドウを最初に表示するときには、このフラグを指定してください。
2 ウィンドウをアクティブにし、最小化ウィンドウとして表示します。
3 ウィンドウをアクティブにし、最大化ウィンドウとして表示します。
4 ウィンドウを最新のサイズと位置で表示します。
アクティブなウィンドウは切り替わりません。
5 ウィンドウをアクティブにし、現在のサイズと位置で表示します。
6 指定したウィンドウを最小化し、Z オーダー上で次に上位となるウィンドウをアクティブにします。
7 ウィンドウを最小化ウィンドウとして表示します。
アクティブなウィンドウは切り替わりません。
8 ウィンドウを現在の状態で表示します。
アクティブなウィンドウは切り替わりません。
9 ウィンドウをアクティブにして表示します。
ウィンドウが最小化または最大化されている場合は、元のサイズと位置に戻ります。
アプリケーションで最小化ウィンドウを復元するときには、このフラグを指定してください。
10 アプリケーションを起動したプログラムの状態に基づいて、表示状態を設定します。
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のShellExecuteメソッドを使います。
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])
ShellExecuteメソッドの引数

sFile ファイルを指定
vArguments パラメータ値を含む文字列
vDirectory sFileで指定されたファイルを含むディレクトリの完全修飾パス。このパラメータが指定されていない場合は、現在の作業ディレクトリが使用されます。
vOperation ファイルでサポートされている動詞文字列(open等)の1つに設定されます。
このパラメータを指定しないと、デフォルトの操作が実行されます。
vShow
意味
0 非表示のウィンドウでアプリケーションを開きます。
1 通常のウィンドウでアプリケーションを開きます。
ウィンドウが最小化または最大化されると、システムはそのウィンドウを元のサイズと位置に復元します。
2 最小化されたウィンドウでアプリケーションを開きます。
3 最大化されたウィンドウでアプリケーションを開きます。
4 最新のサイズと位置にあるウィンドウでアプリケーションを開きます。
アクティブウィンドウはアクティブのままです。
5 ウィンドウを現在のサイズと位置にしてアプリケーションを開きます。
7 最小化されたウィンドウでアプリケーションを開きます。
アクティブウィンドウはアクティブのままです。
10 アプリケーションで指定されたデフォルトの状態でウィンドウを開いてアプリケーションを開きます。

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メソッド
Workbook.FollowHyperlink(Address,[SubAddress],[NewWindow],[AddHistory],[ExtraInfo],[Method],[HeaderInfo])
FollowHyperlinkメソッドの引数

名前 説明
Address 目的の文書のアドレスを指定します。
SubAddress 目的の文書内の位置を指定します。
既定値は空の文字列です。
NewWindow 新しいウィンドウに目的のアプリケーションを表示するには、この引数に True を設定します。
既定値は False です。
AddHistory 現在は使用されていません。
ExtraInfo ハイパーリンクを解決するための HTTP の追加情報を指定する文字列 (String)、またはバイト配列を指定します。
たとえば、引数 ExtraInfo を使用すると、イメージ マップの座標、フォームの内容、または FAT ファイル名を指定できます。
Method 指定した引数 ExtraInfo の接続方法を指定します。
MsoExtraInfoMethod クラスの定数を使用します。
名前 説明
msoMethodGet 0 ExtraInfo プロパティで指定された値は、アドレスに追加される文字列です。
msoMethodPost 1 ExtraInfo プロパティで指定された値は、文字列またはバイト配列として投稿されます。
HeaderInfo HTTP 要求のヘッダー情報を指定する文字列 (String) を指定します。
既定値は空の文字列です。

Sub FileOpen_FollowHyperlink(ByVal strFile As String)
  ThisWorkbook.FollowHyperlink strFile
End Sub

1行のVBAだけで、ファイルを既定のアプリケーションで開くことができています。
これ以上簡単な方法はなさそうです。
ただし、
処理待ちするように機能拡張することは全くできません。
Win32APIでウィンドウを検索するといった方法もあるでしょうが、それならWScript.Shellを使ったほうが良いでしょう。

拡張子に紐づくアプリケーションがない場合は、
まず、以下のメッセージが出ます。

マクロ VBA

「キャンセル」を選ぶと、マクロVBAがエラー停止します。
これには、「On Error Resume Next」をいれれば対応できます。

「OK」を選ぶと
「このファイルを開く方法を選んでください」のメッセージが出ます。

最後に

どういう目的でファイルを開くかによって、
どの方法を選択すれば良いかは変わってくると思います。
目的に応じて、適切な方法を検討してください。



同じテーマ「マクロVBA技術解説」の記事

オブジェクトの探索方法(オートシェイプのTextを探して)

・オブジェクト探索の説明で使う例題 ・自動記録を使ってオートシェイプの概要を知る ・ローカルウィンドウでオートシェイプのテキストを調べる ・オートシェイプの位置移動について ・VBAを完成させる ・オブジェクトブラウザーを使いさらにオブジェクトを調べる ・ウォッチウィンドウについて
条件付きコンパイル(32ビット64ビットの互換性)
条件付きコンパイルは、VBAの特定のコードブロックを選択してコンパイルします、VBAの他の部分は無視されます、条件付きコンパイルステートメントは、実行時ではなくコンパイル時に実行されます。条件に基づいてコンパイルするコードのブロックを指定するには #If...Then...#Elseディレクティブを使用します。
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
・組み込みドキュメントプロパティ(BuiltinDocumentProperties) ・組み込みドキュメントプロパティを一覧出力 ・組み込みドキュメントプロパティの値を変更する ・組み込みドキュメントプロパティを消去する ・ ・ユーザー設定のドキュメントプロパティを一覧出力 ・ユーザー設定のドキュメントプロパティを追加する ・ユーザー設定のドキュメントプロパティを削除する
VBAでファイルを既定のアプリで開く方法
Excelアドインの作成と登録について
・Excelアドインについて ・アドインファイルのフォルダ ・アドインの作り方 ・アドインの登録と有効化 ・ ・アドインで保存するVBA ・アドインを登録するVBA ・アドインを有効化するVBA ・登録されているアドインを確認するVBA ・アドインマネージャーを表示するVBA ・アドイン配布時に自動登録するVBA ・個人用マクロブックについて
VBAでのタイマー処理(SetTimer,OnTime)
・Application.OnTime メソッド ・WindowsAPI:SetTimer関数 ・最後に
マクロでShift_JIS文字コードか判定する
・文字コードについて ・UnicodeにあってShift_JISにない文字の具体例 ・シート構成 ・配列数式での判定 ・Shift_JIS文字コードか判定するマクロVBA全コード ・最後に
Byte配列と文字コード関数について
・文字列をByte配列に入れる ・文字コードについて ・文字列をByte配列に入れて、文字列に戻す ・文字列をByte配列に入れて、自力で文字列に戻す ・文字列をSJISに変換してからByte配列にいれて、自力で文字列に戻す ・最後に
Applicationを省略できるApplicationのメソッド・プロパティ一覧
・Applicationを省略できるかどうかの確認 ・Applicationを省略できるApplicationのメソッド一覧 ・Applicationを省略できるApplicationのプロパティ一覧 ・最後に一言
PowerQueryの強力な機能をVBAから利用する方法
・説明に使用するデータ ・PowerQueryの操作方法 ・PowerQueryのマクロの記録 ・PowerQueryのVBA文法 ・PowerQueryの機能を利用したマクロVBA ・PowerQueryについて
ShapesとDrawingObjectsの相違点と使い方
・Shapes コレクション ・DrawingObjects コレクション ・ShapesとDrawingObjectsの相違点 ・DrawingObjectsの便利な使い道 ・最後に ・図形オートシェイプ(Shape)に関連する記事


新着記事NEW ・・・新着記事一覧を見る

テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)
イータ縮小ラムダ(eta reduced lambda)|エクセル入門(2023-11-20)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ