更新日:、 作成日:

VBA ファイルやフォルダと特殊なパスを取得する

はじめに

Excel VBA マクロでファイルやフォルダのパスと特殊なパスを取得する方法を紹介します。

File, Folder オブジェクトの Path プロパティから、そのパスを取得できます。

エクセルの実行パスや Windows のパスなども取得できます。

パスを結合するには「パスの操作」をご覧ください。
カレントディレクトリについては「カレントディレクトリと相対パス」をご覧ください。

FileSystemObject について

ここでは VBA の標準の関数より便利な FileSystemObject を使った方法を紹介しています。基本的な使い方については「FileSystemObject ファイル操作の基礎」をご覧ください。

コードを見やすくするため FileSystemObject を参照設定しています。また、エラー処理は行っていません。

ファイルやフォルダのパスを取得する

ファイルのパスを取得

フォルダ内にあるファイルのパスを取得するには次のようにします。

Dim fso As FileSystemObject
Set fso = New FileSystemObject

Dim fl As Folder
Set fl = fso.GetFolder("D:\TipsFolder") ' フォルダを取得

Dim s As String
Dim f As File
For Each f In fl.Files ' フォルダ内のファイルを取得
    s = f.Path      ' パスを取得
    Debug.Print(s) ' D:\TipsFolder\Tips.txt など
Next

' 後始末
Set fso = Nothing

fso.GetFolder 関数で指定したパスの Folder オブジェクトを取得します。フォルダが存在しないときはエラーが発生します。

fl.Files プロパティから、そのフォルダの File オブジェクトの一覧を取得できます。

f.Path プロパティから、そのファイルのパスを取得します。File オブジェクトさえ取得できれば、そこからパスを取得できます。

フォルダのパスを取得

サブフォルダのパスを取得するには次のようにします。

Dim fso As FileSystemObject
Set fso = New FileSystemObject

Dim pfl As Folder
Set pfl = fso.GetFolder("D:\TipsFolder") ' 親フォルダを取得

Dim s As String
Dim fl As Folder
For Each fl In pfl.SubFolders ' サブフォルダの一覧を取得
    s = fl.Path     ' パスを取得
    Debug.Print(s) ' D:\TipsFolder\SubTips など
Next

' 後始末
Set fso = Nothing

fso.GetFolder 関数で指定したパスの Folder オブジェクトを取得します。フォルダが存在しないときはエラーが発生します。

pfl.SubFolders プロパティから、そのフォルダ内にある Folder オブジェクトの一覧を取得できます。

fl.Path プロパティから、そのフォルダのパスを取得します。Folder オブジェクトさえ取得できれば、そこからパスを取得できます。

特殊フォルダのパスを取得する

Application オブジェクトから取得

コード パスの例
Application.DefaultFilePathエクセルを保存するときの既定のパス
C:\Users\%USERNAME%\Desktop
Application.Pathエクセルの .exe があるフォルダのパス
C:\Program Files (x86)\Microsoft Office\root\Office16
Application.StartupPathエクセル起動時に開かれるファイルなどが置いてあるフォルダ
C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Excel\XLSTART
Application.ActiveWorkbook.Path開いているアクティブなエクセルファイルのパス。保存していないエクセルでは空になります。
C:\Users\%USERNAME%\Desktop
Application.ThisWorkbook.PathVBA を実行しているエクセルファイルのパス。保存していないエクセルでは空になります。
C:\Users\%USERNAME%\Desktop
Dim s As String

s = Application.DefaultFilePath
Debug.Print(s) ' C:\Users\Tipsfound\Desktop

%USERNAME% はログインしているユーザー名に置き換わります。

FileSystemObject オブジェクトから取得

コード パスの例
fso.GetSpecialFolder(WindowsFolder)Windows フォルダのパス
C:\Windows
fso.GetSpecialFolder(SystemFolder)システムフォルダのパス
C:\Windows\System32
fso.GetSpecialFolder(TemporaryFolder)環境変数 TMP のパス
C:\Users\%USERNAME%\AppData\Local\Temp
Dim fso As FileSystemObject
Set fso = New FileSystemObject ' インスタンス化

Dim s As String
Dim fl As Folder
Set fl = fso.GetSpecialFolder(WindowsFolder)
s = fl.Path
Debug.Print(s) ' C:\Windows

Set fso = Nothing

WScript.Shell オブジェクトから取得

コード パスの例
wsh.SpecialFolders("AllUsersDesktop")共通のデスクトップ
C:\Users\Public\Desktop
wsh.SpecialFolders("AllUsersStartMenu")共通のスタートメニュー
C:\ProgramData\Microsoft\Windows\Start Menu
wsh.SpecialFolders("AllUsersPrograms")共通のスタートメニューのプログラム
C:\ProgramData\Microsoft\Windows\Start Menu\Programs
wsh.SpecialFolders("AllUsersStartup")共通のスタートアップ
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
wsh.SpecialFolders("AppData")アプリケーションデータ
C:\Users\%USERNAME%\AppData\Roaming
wsh.SpecialFolders("Desktop")デスクトップ
C:\Users\%USERNAME%\Desktop
wsh.SpecialFolders("Favorites")お気に入り
C:\Users\%USERNAME%\Favorites
wsh.SpecialFolders("Fonts")フォント
C:\Windows\Fonts
wsh.SpecialFolders("MyDocuments")ドキュメント
C:\Users\%USERNAME%\Documents
wsh.SpecialFolders("NetHood")ネットワーク
C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Network Shortcuts
wsh.SpecialFolders("PrintHood")プリンタ
C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
wsh.SpecialFolders("Programs")スタートメニューのプログラム
C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
wsh.SpecialFolders("Recent")最近使ったファイル
C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Recent
wsh.SpecialFolders("SendTo")送る
C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\SendTo
wsh.SpecialFolders("StartMenu")スタートメニュー
C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu
wsh.SpecialFolders("Startup")スタートアップ
C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
wsh.SpecialFolders("Templates")テンプレート
C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Templates
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell") ' インスタンス化

Dim s As String
s = wsh.SpecialFolders("Desktop")       
Debug.Print(s) ' C:\Users\Tipsfound\Desktop

Set wsh = Nothing

環境変数のパスを取得

コード パスの例
wsh.ExpandEnvironmentStrings("%PATH%")環境変数 PATH のパスを取得
C:\Program Files (x86)\Microsoft Office\Root\Office16\;・・・
wsh.ExpandEnvironmentStrings("%ProgramFiles%")環境変数 ProgramFiles のパスを取得
C:\Program Files (x86)
wsh.ExpandEnvironmentStrings("%TMP%")環境変数 TMP のパスを取得
C:\Users\%USERNAME%\AppData\Local\Temp
% で囲った環境変数名のパスを取得します。
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell") ' インスタンス化

Dim s As String
s = wsh.ExpandEnvironmentStrings("%ProgramFiles%")
Debug.Print(s) ' C:\Program Files (x86)

Set wsh = Nothing