即効テクニック |
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 SubWSHのRunメソッドが、ファイルを開く命令です。 非常に便利なWSHですが、思わぬ落とし穴がありますので注意が必要です。 たとえば、次のコードはエラーになります。Sub Sample2() Dim WSH Set WSH = CreateObject("Wscript.Shell") WSH.Run "C:\My Documents\Sample.txt", 3 Set WSH = Nothing End SubSample1とまったく同じコードですが、何がいけないのでしょう。 実は、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