マクロで作成したファイルをユーザーのデスクトップに保存したい、あるいはドキュメントフォルダにあるファイルを読み込みたい、という場面はよくあります。
しかし、これらのフォルダのパスは「C:\Users\Taro\Desktop
」のようにユーザー名によって異なり、VBAコード内にパスを直接書き込む(ハードコーディングする)と、他の人のPCでは動作しなくなってしまいます。
この記事では、WScript.Shell
オブジェクトを使い、現在のPC環境における特殊フォルダのパスを、誰が実行しても確実に取得するための方法を解説します。
完成したVBAコード
Sub GetSpecialFolderPath()
' 変数を宣言します
Dim wsh As Object
Dim desktopPath As String
Dim documentsPath As String
'--- 1. WScript.Shellオブジェクトを生成 ---
Set wsh = CreateObject("WScript.Shell")
'--- 2. SpecialFoldersプロパティで、各特殊フォルダのパスを取得 ---
desktopPath = wsh.SpecialFolders("Desktop")
documentsPath = wsh.SpecialFolders("MyDocuments")
'--- 3. 取得したパスを表示 ---
MsgBox "現在のPCでのパスは以下の通りです。" & vbCrLf & vbCrLf & _
"デスクトップ: " & desktopPath & vbCrLf & _
"ドキュメント: " & documentsPath, vbInformation, "特殊フォルダのパス"
'--- 4. オブジェクトを解放 ---
Set wsh = Nothing
End Sub
コードのポイント解説
① CreateObject("WScript.Shell")
これは、Windowsの様々な機能(シェルの機能)をVBAから操作するための、おまじないのようなものです。この一行で生成されたwsh
オブジェクトを通じて、OSの情報にアクセスします。
② wsh.SpecialFolders("フォルダ名")
これが、特殊フォルダのパスを取得する核心部分です。.SpecialFolders
プロパティに、目的のフォルダを示す特定の文字列を引数として渡すことで、そのフルパスが返されます。
この方法を使えば、PCの環境やWindowsの言語設定(例:「デスクトップ」か「Desktop」か)を意識することなく、常に正しいパスを取得できます。
指定できる主な特殊フォルダ名
SpecialFolders
の引数として指定できる、代表的なフォルダ名は以下の通りです。
引数の文字列 | 対応する特殊フォルダ |
Desktop | デスクトップ |
MyDocuments | ドキュメント(マイドキュメント) |
Favorites | お気に入り |
Startup | スタートアップ |
Recent | 最近使ったファイル |
SendTo | 送る |
Templates | テンプレート |
Fonts | フォント |
【応用】デスクトップにファイルを保存する
このテクニックを使えば、「現在実行しているユーザーのデスクトップに、ファイルを保存する」といった処理を確実に行えます。
Sub SaveFileToDesktop()
Dim wsh As Object
Dim desktopPath As String
Set wsh = CreateObject("WScript.Shell")
desktopPath = wsh.SpecialFolders("Desktop")
' デスクトップパスとファイル名を結合して、フルパスを作成
ThisWorkbook.SaveAs Filename:=desktopPath & "\VBAからの保存テスト.xlsx"
MsgBox "デスクトップにファイルを保存しました。"
Set wsh = Nothing
End Sub
まとめ
ユーザーごとの環境に依存する特殊フォルダのパスを取得する際は、パスを直接コードに書くのではなく、 CreateObject("WScript.Shell").SpecialFolders("フォルダ名")
という方法を使いましょう。
これにより、作成したマクロが「自分のPCでしか動かない」といった事態を防ぎ、誰が使っても正しく動作する、汎用性の高いツールを作成することができます。