今回は自分が使っていなかった「デスクトップへのファイル保存」について書いていこうと思います。
なぜ今までデスクトップを使っていなかったの?
自分の場合、VBAでファイル保存するときって、こんな感じで書いていました。
'保存先をカレントブックと同じフォルダに指定 zlSavePath = ThisWorkbook.Path & "\出力結果.xlsx"
理由は単純です:
今開いてるフォルダだから分かりやすい
コードが1行で済む
保存場所がわかりやすいという意味では『デスクトップ』よりわかりやすいフォルダはないと思いますが、今までデスクトップを保存先に指定したことはありませんでした。
その理由とデスクトップのパスを取得する方法を紹介したいと思います。
デスクトップパスの落とし穴
デスクトップを使わなかった理由があります。
それは「人によってパスが違う」から。
'デスクトップパスの例 zmDesktopPath = "C:\Users\XXX\Desktop"
このXXX
の部分。ここにはPCのユーザー名が入ります。
つまり、人によって違うパスになってしまいます。
WScriptで解決
VBAでデスクトップのパスを取得する方法はなさそうですが、VBAから別の機能を呼び出して取得する方法は何種類かあるようです。
その中でWScriptを利用した方法を紹介します。
WScriptとは
Wikipediaによると以下のように説明されています
Windows Script Host(ウインドウズ・スクリプト・ホスト)とは、Microsoft Windowsにおいてテキストファイルに記述したスクリプトを実行するスクリプト実行環境である
Windows Script Host - Wikipedia
SpecialFolders
WScriptに「SpecialFolders」という機能があります。
learn.microsoft.com
SpecialFoldersはWindowsの特殊なフォルダーのパスを返します。
取得できるフォルダの種類は下記のとおりです。
- AllUsersDesktop
- AllUsersStartMenu
- AllUsersPrograms
- AllUsersStartup
- Desktop
- Favorites
- Fonts
- MyDocuments
- NetHood
- PrintHood
- Programs
- Recent
- SendTo
- StartMenu
- Startup
- Templates
使用方法
今回はデスクトップのパスを取得するための関数にしました。
'デスクトップパス取得関数 Function GetDesktopPath() As String '①WScriptオブジェクト作成 Dim zmWScript As Object Set zmWScript = CreateObject("WScript.Shell") '②デスクトップパス取得 Dim zlPath As String zlPath = zmWScript.SpecialFolders("Desktop") GetDesktopPath = zlPath '③オブジェクト解放 Set zmWScript = Nothing End Function
下記のようにプロシージャ内で呼び出すと、デスクトップのパスを取得する事ができます。(XXXはユーザー名です
まとめ
これまでは自分の知識では使用しているブックと同じか上位・下位のフォルダにしか保存することが出来ませんでしたが、今回のテクニックを利用することで色々なフォルダを保存先に指定することが出来るようになりました。