【VBA】ユーザー配下のパスを取得する

スポンサーリンク
excelvba エクセル
スポンサーリンク

ユーザー配下のパスはパソコンによって変わります。

ユーザー配下のパスはユーザー名が入り、いちいち指定するのは面倒です。

そこでCreateObject(“Wscript.Shell”)を利用して、パソコンが持っている変数からパスを取得してみましょう。

まずは、ファイル参照が必要です。

[ツール] から [参照設定] ⇒「Microsoft Scripting Runtime」にチェックを入れましょう。

 

スポンサーリンク

取得方法

 

wshell = CreateObject("Wscript.Shell")'windowsのシェルオブジェクトを生成
mypath = wshell.SpecialFolders("MyDocuments")'SpecialFoldersプロパティでユーザーのマイドキュメントへのパスを取得

mypathは「C:\Users\[ユーザー名]\Documents」となります。

SpecialFoldersの引数は以下のようになります。(ユーザーに関する物だけ抜粋)

Desktop ログインユーザーのデスクトップ
AppData ログインユーザーのアプリ用データ
PrintHood ログインユーザーのプリンタ
Templates ログインユーザーの新規作成のテンプレート
NetHood ログインユーザーのネットワーク
Desktop ログインユーザーのデスクトップ
StartMenu ログインユーザーのスタートメニュー
SendTo ログインユーザーの送る
Recent ログインユーザーの最近使ったファイル
Startup ログインユーザーのスタートアップ
Favorites ログインユーザーのお気に入り
MyDocuments ログインユーザーのマイドキュメント
Programs ログインユーザーのプログラムメニュー

と、ここで困ることも出てきます。

プロパティになりフォルダーを取りたい場合です。

私が困ったのはダウンロードフォルダです。

ダウンロードフォルダは普通に開くと「PC\ダウンロード」となっています。

これは仮のパスで本当はユーザーフォルダ配下に存在しています。

「C:\Users\[ユーザー名]\Downloads」となります。

これを取得したいのでVBA上で置換をしてみます。

wshell = CreateObject("Wscript.Shell")'windowsのシェルオブジェクトを生成 
mypath = wshell.SpecialFolders("MyDocuments")'SpecialFoldersプロパティでユーザーのマイドキュメントへのパスを取得
mydownload = Replace(Path, "\Documents", "\Downloads", 1, 1)

mydownloadは「C:\Users\[ユーザー名]\Downloads」となります。

ただ、この置換だと「C:\Users\Documents\Documents

というユーザフォルダがある場合は最初のほうが置換されてしまいます。

かなり特殊なケースだとは思いますが、完璧にしたい場合は「RegExp」を使って正規表現で置換したほうがよろしいかと思います。

RegExpは別の機会で説明したいと思います。

 

この方法は他にもVBA側でユーザーごとにフォルダを作成したい時などでも必要な取得方法だと思います。

 

コメント

タイトルとURLをコピーしました