ExcelマクロVBA技術解説 | VBAでファイルを規定のアプリで開く方法 | ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説



最終更新日:2019-01-20

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(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を使用します。

Sub FileOpen_Shell2(ByVal strFile As String)
  Dim id As Long
  Dim hP As Long
  Dim strExe As String
  strExe = "notepad.exe"
  id = Shell(strExe & " " & strFile, vbNormalFocus)
  hP = OpenProcess(PROCESS_ALL_ACCESS, 0, id)
  If hP <> 0 Then
    Call WaitForSingleObject(hP, INFINITE)
    CloseHandle hP
  End If
End Sub

拡張子に紐づく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関数と同様の方法になります。

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


上の画像は、Windows10での画面です。


WScript.Shell

WshShellオブジェクトのRunメソッドを使います。

WScript.Shellについては、
特殊フォルダの取得(WScript.Shell,SpecialFolders)
こちらを参照してください。

WshShellオブジェクト.Runメソッド

Windows Script Host Object Model

引数
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])

引数
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])

引数
名前 説明
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がエラー停止します。
これには、「On Error Resume Next」をいれれば対応できます。

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



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




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

文字列としてのプロシージャー名を起動する方法(Run,OnTime)
ドキュメントの作成者を取得(GetObject,BuiltinDocumentProperties)
画像サイズ(横x縦)の取得について
文字種(ひらがな、全半角カタカナ、半角英大文字等々)の判定
オブジェクトとプロパティの真実
オブジェクト式について
オブジェクトの探索方法
条件付きコンパイル(32ビット64ビットの互換性)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
VBAでファイルを規定のアプリで開く方法
Excelアドインの作成と登録について

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

Excelシートの複雑な計算式を解析するVBA|VBAサンプル集(2月18日)
VBAクラスの作り方:独自Rangeっぽいものを作ってみた|VBA技術解説(2月16日)
VBAクラスの作り方:列名のプロパティを自動作成する|VBA技術解説(2月14日)
VBAクラスの作り方:列名の入力支援と列移動対応|VBA技術解説(2月11日)
クラスを使って他ブックのイベントを補足する|VBA技術解説(2月6日)
Excelアドインの作成と登録について|VBA技術解説(2月3日)
参照設定、CreateObject、オブジェクト式の一覧|VBA技術解説(1月20日)
VBAでファイルを規定のアプリで開く方法|VBA技術解説(1月20日)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)|VBA技術解説(1月19日)
他ブックへのリンクエラーを探し解除|VBAサンプル集(1月15日)

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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数とデータ型(Dim)|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.RangeとCellsの使い方|ExcelマクロVBA入門
6.マクロって何?VBAって何?|ExcelマクロVBA入門
7.繰り返し処理(For Next)|ExcelマクロVBA入門
8.とにかく書いて見よう(Sub,End Sub)|VBA入門
9.定数と型宣言文字(Const)|ExcelマクロVBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • VBAでファイルを規定のアプリで開く方法

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


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





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

    本文下部へ

    ↑ PAGE TOP