ChDriveではネットワークドライブにカレントドライブを変更できない
VBAでカレントドライブの変更を行うには通常であればChDriveステートメントを利用しますが、残念なことにChDriveステートメントはネットワークドライブへの変更が出来ません。
そのため、他の方法を利用することになります。
一番簡単なのはWSHのWshShellクラスのCurrentDirectoryプロパティを使う方法です。他にもWin32APIのSetCurrentDirectory関数もあります。また、外部アプリケーションを使って、例えばPowerShellを起動でset-location -pathコマンドを使ったりする方法などもあります。
ここでは一番簡単なCurrentDirectoryプロパティでの方法を紹介します。
事前設定
WshShellの参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。これでWshShellクラスを利用できるようになります。
以下はWshShellクラスのインスタンス変数の作成サンプルです。書き方は2通りあります。どちらでもいいです。
1つ目のように1行で書いてもいいですし、2つ目のように変数定義とSetを別に書いてもいいです。
1 |
Dim obj As New IWshRuntimeLibrary.WshShell |
1 2 |
Dim obj As IWshRuntimeLibrary.WshShell Set obj = New IWshRuntimeLibrary.WshShell |
厳密には2行に分けて書いた方がいいです。その理由の詳細は「VBAでクラス変数の宣言とNewを1行で書いてよいか」をご参照ください。ちなみに個人的には1行で書くことが多いです。
以降のサンプルコードは参照設定を行った場合の書き方になります。
WshShell.CurrentDirectoryプロパティ
CurrentDirectoryプロパティに設定したいカレントディレクトリを代入することでカレントディレクトリの変更を行います。
存在しないフォルダをカレントディレクトリに設定しようとした場合は以下のようなエラーになります。
「-2147024894 ‘CurrentDirectory’ メソッドは失敗しました: ‘IWshShell3’ オブジェクト」
ネットワークドライブの設定でありがちですが、よくあるミスがフォルダ自体は存在していても共有の設定をされていない場合です。
エクスプローラのアドレス欄に対象のパスを設定してEnterキーを押してみると、そのパスが有効かどうかが分かりますので、エラーが出る場合は確認してみてください。
サンプルコード
WshShellクラスのCurrentDirectoryプロパティを使ってカレントディレクトリを変更するサンプルコードです。
事前にWshShellクラスの参照設定を行っていない場合は2行目をコメントアウトして3,4,5行目のコメントを外してください。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub ChNetworkDrive() Dim sh As New IWshRuntimeLibrary.WshShell '// WshShell '//Dim sh As Object '// '//Set sh = CreateObject("WScript.Shell") '// カレントディレクトリの変更 sh.CurrentDirectory = "\\testServer\test" '// 現在のカレントディレクトリを表示 MsgBox CurDir End Sub |