【VBA】デスクトップやマイドキュメントのパスを取得(特殊フォルダ)

エクセルVBAで使うコードの備忘録。VBAでデスクトップやマイドキュメントなどの特殊フォルダのパスを取得するコード。これらのフォルダの中にはログインユーザー名のフォルダ直下に存在する場合がありますが、その場合にはPCごとに異なるパスを取得します。

スポンサーリンク

Windows Script Host (WSH)

Windows Script Host (昔はWindows Scripting Hostと呼ばれてました)は、Windows上のScript(簡易プログラム)の実行環境です。デスクトップやマイドキュメントフォルダはWindowsのシステム上に作成されている特殊フォルダですので、このWSHを利用してWindows内の情報にアクセスしパスを取得します。

一応、下記にマイクロソフトのサイトからの引用を載せておきます(が、読んでもよくわからないかもしれません)。

Windows Script Host (WSH) は、Windows 管理ツールの 1 つです。
WSH は、スクリプト実行用のホスト環境を提供します。スクリプトがコンピュータに到着すると、WSH がホストの役目を果たします。WSH はスクリプトがオブジェクトとサービスを利用できるようにし、スクリプトを実行するためのガイドラインを提供します。また、セキュリティの管理を行うほか、適切なスクリプト エンジンを呼び出します。
スクリプト エンジンが WSH に対応していれば、WSH は言語に依存せずに動作します。そのため、Windows プラットフォーム上でのスクリプト処理が簡単、強力、かつ柔軟になります。スクリプトは、Windows デスクトップおよびコマンド プロンプトのどちらからでも実行できます。
ログオン スクリプト、管理スクリプト、およびコンピュータの自動処理など、非対話型のスクリプトを用いる場面では、Windows Script Host は理想的なツールとなります。

MSDN

SpecialFolders関数

特殊フォルダのパスを取得する際には、まず「WScript.Shell」オブジェクトを作成し、そのオブジェクトの「SpecialFolders」にアクセスします。 特殊フォルダはいくつも種類があるので、「SpecialFolders」にアクセスする際、どのファイルのパスを取得するかを引数に指定する必要があります。引数指定の方法は、(1)文字列、(2)数字、のどちらかで指定します。可読性の観点からは文字列での指定の方がよいです。引数と対応する特殊フォルダの関係については後述します。

構文

'--- WSHオブジェクト ---'
Dim wsh as object
Set wsh = CreateObject("WScript.Shell")

'--- 特殊フォルダのパスを格納する変数 ---'
Dim path as String
path = wsh.SpecialFolders([フォルダ番号 or フォルダ文字列])

取得できる特殊フォルダ

引数と対応する特殊フォルダの一覧です。文字列か数字をSpecialFoldersに引数として与えます。パスは特に何もしていない場合に表示される一般的なものを記載しています。

文字列特殊フォルダ名パス
0AllUsersDesktop全ユーザー共通
デスクトップ
C:\Users\Public\Desktop
1AllUsersStartMenu全ユーザー共通
スタートメニュー
C:\ProgramData\Microsoft\Windows
\Start Menu
2AllUsersPrograms全ユーザー共通
プログラムメニュー
C:\ProgramData\Microsoft\Windows
\Start Menu\Programs
3AllUsersStartup全ユーザー共通
スタートアップ
C:\ProgramData\Microsoft\Windows
\Start Menu\Programs\StartUp
4Desktopログインユーザー
デスクトップ
C:\Users\[ユーザー名]\Desktop
5AppDataログインユーザー
アプリデータ
C:\Users\[ユーザー名]\AppData\Roaming
6PrintHoodログインユーザー
プリンタ
C:\Users\[ユーザー名]\AppData\Roaming
\Microsoft\Windows\Printer Shortcuts
7Templatesログインユーザー
テンプレート
C:\Users\ [ユーザー名] \AppData\Roaming
\Microsoft\Windows\Templates
8Fonts全ユーザー共通
フォント
C:\Windows\Fonts
9NetHoodログインユーザー
ネットワーク
C:\Users\[ユーザー名]\AppData\Roaming
\Microsoft\Windows\Network Shortcuts
10Desktopログインユーザー
デスクトップ
C:\Users\[ユーザー名]\Desktop
11StartMenuログインユーザー
スタートメニュー
C:\Users\[ユーザー名]\AppData\Roaming
\Microsoft\Windows\Start Menu
12SendToログインユーザー
送る
C:\Users\[ユーザー名]\AppData\Roaming
\Microsoft\Windows\SendTo
13Recentログインユーザー
最近使ったファイル
C:\Users\[ユーザー名]\AppData\Roaming
\Microsoft\Windows\Recent
14Startupログインユーザー
スタートアップ
C:\Users\[ユーザー名]\AppData\Roaming
\Microsoft\Windows\Start Menu\Programs\Startup
15Favoritesログインユーザー
お気に入り
C:\Users\[ユーザー名]\Favorites
16MyDocumentsログインユーザー
マイドキュメント
C:\Users\[ユーザー名]\Documents
17Programsログインユーザー
プログラム
C:\Users\[ユーザー名]\AppData\Roaming
\Microsoft\Windows\Start Menu\Programs

サンプルコード

下記のサンプルコードでは、すべての引数について文字列の場合と値の場合それぞれを使ってパスを取得しています。

Public Sub getSpecialFolders()
    
    '--- WSHオブジェクト ---'
    Dim wsh As Object
    Set wsh = CreateObject("WScript.Shell")
    
    '--- 特殊フォルダのパスを格納する変数 ---'
    Dim path As String
    
    
    '--- 全ユーザー共通のデスクトップ ---'
    path = wsh.SpecialFolders("AllUsersDesktop")
    path = wsh.SpecialFolders(0)
    
    '--- 全ユーザー共通のスタートメニュー ---'
    path = wsh.SpecialFolders("AllUsersStartMenu")
    path = wsh.SpecialFolders(1)
    
    '--- 全ユーザー共通のプログラムメニュー ---'
    path = wsh.SpecialFolders("AllUsersPrograms")
    path = wsh.SpecialFolders(2)
    
    '--- 全ユーザー共通のスタートアップ ---'
    path = wsh.SpecialFolders("AllUsersStartup")
    path = wsh.SpecialFolders(3)
    
    '--- ログインユーザーのデスクトップ ---'
    path = wsh.SpecialFolders("Desktop")
    path = wsh.SpecialFolders(4)
    
    '--- ログインユーザーのアプリデータ ---'
    path = wsh.SpecialFolders("AppData")
    path = wsh.SpecialFolders(5)
    
    '--- ログインユーザーのプリンタ ---'
    path = wsh.SpecialFolders("PrintHood")
    path = wsh.SpecialFolders(6)
    
    '--- ログインユーザーのテンプレート ---'
    path = wsh.SpecialFolders("Templates")
    path = wsh.SpecialFolders(7)
    
    '--- ログインユーザーのフォント ---'
    path = wsh.SpecialFolders("Fonts")
    path = wsh.SpecialFolders(8)
    
    '--- ログインユーザーのネットワーク ---'
    path = wsh.SpecialFolders("NetHood")
    path = wsh.SpecialFolders(9)
    
    '--- ログインユーザーのデスクトップ ---'
    path = wsh.SpecialFolders("Desktop")
    path = wsh.SpecialFolders(10)
    
    '--- ログインユーザーのスタートメニュー ---'
    path = wsh.SpecialFolders("StartMenu")
    path = wsh.SpecialFolders(11)
    
    '--- ログインユーザーの送る ---'
    path = wsh.SpecialFolders("SendTo")
    path = wsh.SpecialFolders(12)
    
    '--- ログインユーザーの最近使ったファイル ---'
    path = wsh.SpecialFolders("Recent")
    path = wsh.SpecialFolders(13)
    
    '--- ログインユーザーのスタートアップ ---'
    path = wsh.SpecialFolders("Startup")
    path = wsh.SpecialFolders(14)
    
    '--- ログインユーザーのお気に入り ---'
    path = wsh.SpecialFolders("Favorites")
    path = wsh.SpecialFolders(15)
    
    '--- ログインユーザーのマイドキュメント ---'
    path = wsh.SpecialFolders("MyDocuments")
    path = wsh.SpecialFolders(16)
    
    '--- ログインユーザーのプログラム ---'
    path = wsh.SpecialFolders("Programs")
    path = wsh.SpecialFolders(17)
    
End Sub