エクセルVBAで使うコードの備忘録。VBAでデスクトップやマイドキュメントなどの特殊フォルダのパスを取得するコード。これらのフォルダの中にはログインユーザー名のフォルダ直下に存在する場合がありますが、その場合にはPCごとに異なるパスを取得します。
Windows Script Host (WSH)
Windows Script Host (昔はWindows Scripting Hostと呼ばれてました)は、Windows上のScript(簡易プログラム)の実行環境です。デスクトップやマイドキュメントフォルダはWindowsのシステム上に作成されている特殊フォルダですので、このWSHを利用してWindows内の情報にアクセスしパスを取得します。
一応、下記にマイクロソフトのサイトからの引用を載せておきます(が、読んでもよくわからないかもしれません)。
Windows Script Host (WSH) は、Windows 管理ツールの 1 つです。
MSDN
WSH は、スクリプト実行用のホスト環境を提供します。スクリプトがコンピュータに到着すると、WSH がホストの役目を果たします。WSH はスクリプトがオブジェクトとサービスを利用できるようにし、スクリプトを実行するためのガイドラインを提供します。また、セキュリティの管理を行うほか、適切なスクリプト エンジンを呼び出します。
スクリプト エンジンが WSH に対応していれば、WSH は言語に依存せずに動作します。そのため、Windows プラットフォーム上でのスクリプト処理が簡単、強力、かつ柔軟になります。スクリプトは、Windows デスクトップおよびコマンド プロンプトのどちらからでも実行できます。
ログオン スクリプト、管理スクリプト、およびコンピュータの自動処理など、非対話型のスクリプトを用いる場面では、Windows Script Host は理想的なツールとなります。
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に引数として与えます。パスは特に何もしていない場合に表示される一般的なものを記載しています。
値 | 文字列 | 特殊フォルダ名 | パス |
0 | AllUsersDesktop | 全ユーザー共通 デスクトップ | C:\Users\Public\Desktop |
1 | AllUsersStartMenu | 全ユーザー共通 スタートメニュー | C:\ProgramData\Microsoft\Windows \Start Menu |
2 | AllUsersPrograms | 全ユーザー共通 プログラムメニュー | C:\ProgramData\Microsoft\Windows \Start Menu\Programs |
3 | AllUsersStartup | 全ユーザー共通 スタートアップ | C:\ProgramData\Microsoft\Windows \Start Menu\Programs\StartUp |
4 | Desktop | ログインユーザー デスクトップ | C:\Users\[ユーザー名]\Desktop |
5 | AppData | ログインユーザー アプリデータ | C:\Users\[ユーザー名]\AppData\Roaming |
6 | PrintHood | ログインユーザー プリンタ | C:\Users\[ユーザー名]\AppData\Roaming \Microsoft\Windows\Printer Shortcuts |
7 | Templates | ログインユーザー テンプレート | C:\Users\ [ユーザー名] \AppData\Roaming \Microsoft\Windows\Templates |
8 | Fonts | 全ユーザー共通 フォント | C:\Windows\Fonts |
9 | NetHood | ログインユーザー ネットワーク | C:\Users\[ユーザー名]\AppData\Roaming \Microsoft\Windows\Network Shortcuts |
10 | Desktop | ログインユーザー デスクトップ | C:\Users\[ユーザー名]\Desktop |
11 | StartMenu | ログインユーザー スタートメニュー | C:\Users\[ユーザー名]\AppData\Roaming \Microsoft\Windows\Start Menu |
12 | SendTo | ログインユーザー 送る | C:\Users\[ユーザー名]\AppData\Roaming \Microsoft\Windows\SendTo |
13 | Recent | ログインユーザー 最近使ったファイル | C:\Users\[ユーザー名]\AppData\Roaming \Microsoft\Windows\Recent |
14 | Startup | ログインユーザー スタートアップ | C:\Users\[ユーザー名]\AppData\Roaming \Microsoft\Windows\Start Menu\Programs\Startup |
15 | Favorites | ログインユーザー お気に入り | C:\Users\[ユーザー名]\Favorites |
16 | MyDocuments | ログインユーザー マイドキュメント | C:\Users\[ユーザー名]\Documents |
17 | Programs | ログインユーザー プログラム | 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