HOME > 即効テクニック > Excel VBA > ファイル操作関連のテクニック > 拡張子関連づけでファイルを開く

即効テクニック

ファイル操作関連のテクニック

拡張子関連づけでファイルを開く

(Excel 97/2000/2002/2003/2007/2013/2016)
VBAから、exe形式などの実行形式ファイルを起動するにはShell関数を使います。
次のコードは、Windowsに標準添付されている「メモ帳」を起動します。

Sub Sample1()
    Shell "notepad.exe", vbNormalFocus
End Sub
「メモ帳」の実体は「notepad.exe」という実行形式ファイルで、一般的にWindowsフォルダに保存されています。 本来なら"C:\Windows\notepad.exe"のようにパスを指定しますが、Windowsフォルダには環境変数のパスが設定されていますので、"notepad.exe"のようにファイル名を指定するだけでも起動できます。 このように、実行形式ファイルを起動するにはShell関数を使えますが、データファイルを指定して、そのデータファイルが関連づけられているアプリケーションで開くにはどうしたらいいでしょう。 たとえば、拡張子txtのテキストファイルは、一般的にメモ帳に関連づけられていますので、テキストファイルのアイコンをダブルクリックすると、自動的にメモ帳が起動してテキストファイルが開かれますよね。 その動作をVBAから実行するようなケースです。 これにはWindowsのAPIを使う方法もありますが、手軽なのはWindows Scripting Host(WSH)を使うやり方です。 次のコードは"C:\Sample.txt"を拡張子関連づけで開きます。
Sub Sample1()
    Dim WSH
    Set WSH = CreateObject("Wscript.Shell")
    WSH.Run "C:\Sample.txt", 3
    Set WSH = Nothing
End Sub
WSHのRunメソッドが、ファイルを開く命令です。 非常に便利なWSHですが、思わぬ落とし穴がありますので注意が必要です。 たとえば、次のコードはエラーになります。
Sub Sample2()
    Dim WSH
    Set WSH = CreateObject("Wscript.Shell")
    WSH.Run "C:\My Documents\Sample.txt", 3
    Set WSH = Nothing
End Sub
Sample1とまったく同じコードですが、何がいけないのでしょう。 実は、WSHのRunメソッドに指定するファイル名には「空白を含まない」というルールがあります。 ファイル名に空白が含まれていると、Runメソッドは空白までがファイル名であると認識してしまうのです。 Sample2で指定したファイル名「C:\My Documents\Sample.txt」には空白が含まれています。 このような場合は「"C:\My Documents\Sample.txt"」と、ファイル名全体を「""」で囲む必要があります。
Sub Sample3()
    Dim WSH
    Set WSH = CreateObject("Wscript.Shell")
    WSH.Run """C:\My Documents\Sample.txt""", 3
    Set WSH = Nothing
End Sub
あるいは、「"」という文字はCha(34)で表せますので、次のように書くこともできます。
Sub Sample4()
    Dim WSH
    Set WSH = CreateObject("Wscript.Shell")
    WSH.Run Chr(34) & "C:\My Documents\Sample.txt" & Chr(34), 3
    Set WSH = Nothing
End Sub
もちろん、空白を含まないファイル名を「""」で囲っても正常に動作します。 GetOpenFilenameメソッドなどを使って、任意のファイル名を開きたい場合には、次のように、念のため「""」を付加するようにしてください。
Sub Sample5()
    Dim WSH, Target As String
    Target = Application.GetOpenFilename
    If Target = "False" Then Exit Sub
    Set WSH = CreateObject("Wscript.Shell")
    WSH.Run Chr(34) & Target & Chr(34), 3
    Set WSH = Nothing
End Sub