【AccessVBA/ExcelVBA】特殊フォルダのPath(場所)をプログラムで取得する

Windows環境でVBAプログラムを作成しているときに、Windows自体が管理している特殊なフォルダの場所を取得したいケースが出てきたりします。

私がAccessアプリを作成していてよく使うのは、外部ファイルからデータを取り込んだり、外部ファイルへデータを書き出すときです。それらの処理の作業場所として、書き込みエラーにならずに一時的なファイルの置き場になってくれるTemporaryフォルダを取得する、という使い方を頻繁に行っています。

実現方法はいたって簡単で、取得するだけなら1行で書けます。

MsgBox CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2)

これを実行すると、OSがWindows10の方は「C:\Users\hoge\AppData\Local\Temp」のような出力結果が表示されると思います。hogeの部分は皆さんのユーザ名ですね。

ちなみに、少し脱線しますが、今回は説明をシンプルにするために実行時バインディングで記述しています。参照設定(=事前バインディング)や実行時(遅延)バインディングについては別の機会に詳しく書きたいと思うので、初めて聞いた方や今はよく分からない方は安心してスルーしてもらって全然大丈夫です!

話を戻しますが、先ほどのコードの最後に(2)と書かれています。この2がTemporaryフォルダを取得したい、という意味になります。他に2種類のフォルダを取得することができますので、その際に指定する数字と取得できるフォルダの種類を載せておきます。

フォルダ実行結果(サンプル)
0WindowsフォルダC:\Windows
1SystemフォルダC:\Windows\System32
2TemporaryフォルダC:\Users\hoge\AppData\Local\Temp

これを、以前の「開いているAccessファイルの場所を取得する」で使った方法で少し手を加えてあげるとより実用的になります。以下は一番多く使われているであろうTemporaryフォルダを取得するためのサンプルです。

Public Function strGetTemporaryPath() As String
    Dim strPath As String
    Dim strSign As String
    strPath = CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2)
    strSign = "\"
    'Pathの一番右側が区切り文字かどうかチェックし、
    '区切り文字ではなかった場合に区切り文字を追加
    If Right(strPath, 1) <> strSign Then
        strGetTemporaryPath = strPath & strSign
    Else
        strGetTemporaryPath = strPath
    End If
End Function

一時的にテキストファイルを出力する場合など、以下のように保存場所を指定する際に使います。

strSaveFile = strGetTemporaryPath & Format(Now, "yyyymmddhhmmss.txt")

読み込みたいファイルを直接開かずにこのフォルダにコピーしてから読み込んだり、書き出したいファイルを一度このフォルダに書き出して(書き込み途中に触られないように)全て書き出し終わってから本来の保存場所にコピーしたり、といったシーンで使えます。