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