ドライブレターありきのChDrive/ChDir
VBAでカレントディレクトリ(今のWindowsなら「カンレトフォルダ」という言い方が正しい?)を変更するには、ChDriveとChDirします。
VBAの話なので、Wordに限らずExcelやAccess等でも同じはず。さらにはVB6でも同じだと思うけど知らない。
C:\yamada\takaoへ変更する例
ChDrive "C:"
ChDir "yamada\takao" 'C:\yamada\takaoでも構わない
まるでコマンドプロンプトです。いや、cdコマンドに/dオプションがあるだけcmd.exeの方が賢いかも。
UNCが使えない
サーバー上のいわゆる共有フォルダを扱う際に、UNC(\ServerName\FolderName…のような表記)を利用することがよくあります。ところが、ChDrive / ChDirではUNCを扱えません。きっと、VSTOへの移行を促したいM$の(地味な)陰謀であります。
SetCurrentDirectoryを使えばUNCでOK
Windows APIであるSetCurrentDirectoryを使えばUNCが使えます。”\ServerName\FolderName”をカレントディレクトリとする場合は以下のとおりです。
Declare Function SetCurrentDirectoryW Lib "kernel32" (ByVal lpPathName As Long) As Long
Public Sub TestCd()
SetCurrentDirectoryW StrPtr("\\ServerName\FolderName")
Debug.Print CurDir
End Sub
実行結果は、
\\ServerName\FolderName
となります。
SetCurrentDirectoryAではなくSetCurrentDirectoryWがおすすめ
あくまで個人的な印象に過ぎませんが、Windows Vista(MS-IME 2007)が出てからファイル名にUnicodeが使われることが多くなっています。SetCurrentDirectoryAではUnicodeが使えないので、SetCurrentDirectoryWが良さそうです。
宣言時にlpPathNameをLongにすること、呼ぶ時にStrPtrを介すことに気をつけてください。
ところで、Officeが64bitになったらAPIも64bitの方を呼ぶんだろうな。そうなるとポインタを渡すときはLongじゃダメってことか。64bit……Double型??
余談
もちろん、
SetCurrentDirectoryW StrPtr("C:\yamada\takao")
でもいけますが、
SetCurrentDirectoryW StrPtr("\\?\C:\yamada\takao")
でもいけたりします。