カレントディレクトリ(現行フォルダ、ファイルパス)の変更



メソッド構文
VBAでカレントディレクトリ(現行フォルダ)の変更方法です。
2018/7/25 64bit対処、CreateObjectのエラーについて追記しました。

通常、カレントフォルダはファイルを開いたり保存したりすると自動的に変更されます。
ここでは任意にカレントフォルダを変更する方法についてまとめます。
使用中のPC内のローカルのフォルダ参照をする場合は ChDir を使用すれば簡単にカレントフォルダを変更出来ますが、 ネットワークドライブ上のフォルダに変更する場合は,WIN32API ( Application Programming Interface )かWSH (Windows Script Host)を使用することになります。
ユーザーにファイルを選択させて開かせる処理やファイル保存時などに活用出来ると思います。


1.ローカルPC上での変更方法

ChDir path
path に変更したいフォルダ(ファイルパス)を指定します。

サンプルコード
Sub S1_ChDir()
    'CurrentDirectoryを変更する
    ChDir "C:\Documents and Settings"
End Sub


2.ネットワーク上への変更方法 ( WIN32API )
宣言
32bit:
Private Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA"
(ByVal lpPathName As String) As Long

64bit:
Private Declare PtrSafe Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA"
(ByVal lpPathName As String) As Long


実行
Call SetCurrentDirectory ( FilePath )

エクセルの32bit と 64bitで宣言部分が異なります。
~宣言部分の意味~
Declare Function~ でAPI関数であることを宣言しています。
SetCurrentDirectory は関数名(通常名)を表示しており、
Lib "kernel32" は関数があるDLL名で、 Alias "SetCurrentDirectoryA" は関数名(実際の)です。
(ByVal:値渡し(プロシージャに値を提供)、lpPathName はパス名で(ByVal lpPathName As String)はSetCurrentDirectory関数の引数です。
 As LongはSetCurrentDirectory関数の戻り値が整数型ということを意味しており、失敗すると0が返り、成功すると0以外の値が返ります。

~実行部分の意味~
SetCurrentDirectory 関数の引数FilePathを呼び出す(現行フォルダにする)
FilePathに変更したいフォルダ(ファイルパス)を指定します。

サンプルコード
Private Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long

Sub S2_ChDir()
'変更後パスFilePathの宣言
Dim FilePath As String
    '変更するファイルパスの指定
    FilePath = "\\NetWork\Path01"
    '変更の実行
    Call SetCurrentDirectory(FilePath)
End Sub


3.ネットワーク上への変更方法 ( WSH )

CreateObject("WScript.Shell").CurrentDirectory = FilePath

FilePathに変更したいフォルダ(ファイルパス)を指定します。

サンプルコード
Sub S3_ChDir()
  'CurrentDirectoryを変更する
  CreateObject("WScript.Shell").CurrentDirectory _
  = "\\NetWork\Path01"
End Sub


指定したパスが存在しない場合は

と、「CurrentDirectoryメソッドは失敗しました。'IwshShell3'オブジェクト」というエラーが表示されます。
正しいパスを指定してください。