WshNetworkクラスでネットワークドライブの制御を行う

プログラムの処理中だけネットワークドライブの接続を行い、処理が終わったら切断する、という設計を行うことがあります。

その際にどうやって実装したらよいかという話になりますが、候補として上がるのはWindows APIとnet useコマンドとWshNetworkです。

それぞれ一長一短ありますが、VBAでのネットワークドライブの制御はWshNetworkクラスを使うのが結果的に一番ラクだと思います。

参照設定

WshNetworkはCreateObject関数を利用してこのような書き方を紹介されることが多いと思います。

しかしこの書き方では利用できるプロパティやメソッドを候補表示できません。しかし参照設定を行えばプロパティやメソッドを表示することが可能です。

WshNetworkの参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。これでWshNetworkクラスを利用できるようになります。

以下はWshNetworkクラスのインスタンス変数の作成サンプルです。書き方は2通りあります。どちらでもいいです。1つ目のように1行で書いてもいいですし、2つ目のように変数定義とSetを別に書いてもいいです。厳密には2行に分けて書いた方がいいですが、詳細は「VBAでクラス変数の宣言とNewを1行で書いてよいか」をご参照ください。

以降のサンプルコードは参照設定を行った場合の書き方になります。

構文

WshNetworkクラスには複数のメソッドやプロパティが用意されています。その中でネットワークドライブの接続と切断と一覧取得を行うものは以下になります。

1. ネットワークドライブの接続

LocalName 新規に割り当てるドライブ名を指定します。コロンを含めて”Z:”のように指定します。
RemoteName ネットワークドライブを割り当てる先のパスを指定します。
UpdateProfile 省略可能です。ログオン時に自動で接続するかどうかを指定します。Trueは再接続を行いますが、Falseは行いません。省略時はFalseとなります。
UserName 接続する際のログインユーザ名を指定します。省略時は現在のユーザになります。
Password 接続する際のログインユーザのパスワードを指定します。省略時は現在のユーザのパスワードになります。

2. ネットワークドライブの切断

Name 切断するネットワークドライブ名を指定します。
Force 切断するドライブが使用中でも強制切断するかどうかを指定します。Trueは強制切断を行いますが、Falseは行いません。
UpdateProfile 再接続時に利用するユーザープロファイルを削除するかどうかを指定します。Trueは削除しますが、Falseは削除しません。

3. ネットワークドライブの一覧取得

WshCollection ネットワークドライブの一覧が取得できた場合はWshCollectionコレクションとして返却されます。

0と偶数の要素番号にはドライブ名+コロン(:)が設定され、奇数の要素番号にはドライブ名に対応するパスが設定されます。

サンプルコード

ネットワークドライブの一覧の取得を行い、X,Y,Wドライブの接続および切断を行うサンプルです。

2行目 エラー発生時にERR_LABELに処理を移すようにしています。
4行目 WshNetworkクラスのインスタンスを作成しています。
5行目 EnumNetworkDrivesメソッドの結果取得用の変数です。
6行目 ネットワークドライブ取得時のループカウンタです。
9行目 EnumNetworkDrivesメソッドを実行してネットワークドライブの一覧を取得します。
11行目 ネットワークドライブが1つ以上ある場合にのみネットワークドライブの出力を行うようにしています。
13~15行目 取得したネットワークドライブをイミディエイトウィンドウに出力しています。
19~21行目 ネットワークドライブの接続をパラメータを変えて実行しています。
24~26行目 ネットワークドライブの切断をパラメータを変えて実行しています。
28行目 エラー発生時にここに処理が移ります。
29~31行目 エラー発生時はエラー番号に0ではない値が設定されます。0の場合はエラーが発生していないとして関数を抜けます。
33行目 エラー発生時にエラー番号やエラー内容やヘルプをイミディエイトウィンドウに出力しています。