Excelが大好きだ!

Excel大好き経理マンがExcelの事を書き綴っていきます。


スポンサードリンク

マクロを実行したPCのデスクトップのパスを取得する方法

今回は自分が使っていなかった「デスクトップへのファイル保存」について書いていこうと思います。


なぜ今までデスクトップを使っていなかったの?

自分の場合、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はユーザー名です


まとめ

これまでは自分の知識では使用しているブックと同じか上位・下位のフォルダにしか保存することが出来ませんでしたが、今回のテクニックを利用することで色々なフォルダを保存先に指定することが出来るようになりました。