WshNetworkクラスでネットワークドライブの制御を行う
プログラムの処理中だけネットワークドライブの接続を行い、処理が終わったら切断する、という設計を行うことがあります。
その際にどうやって実装したらよいかという話になりますが、候補として上がるのはWindows APIとnet useコマンドとWshNetworkです。
それぞれ一長一短ありますが、VBAでのネットワークドライブの制御はWshNetworkクラスを使うのが結果的に一番ラクだと思います。
参照設定
WshNetworkはCreateObject関数を利用してこのような書き方を紹介されることが多いと思います。
1 2 |
Dim obj Set obj = CreateObject("WScript.Network") |
しかしこの書き方では利用できるプロパティやメソッドを候補表示できません。しかし参照設定を行えばプロパティやメソッドを表示することが可能です。
WshNetworkの参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。これでWshNetworkクラスを利用できるようになります。
以下はWshNetworkクラスのインスタンス変数の作成サンプルです。書き方は2通りあります。どちらでもいいです。1つ目のように1行で書いてもいいですし、2つ目のように変数定義とSetを別に書いてもいいです。厳密には2行に分けて書いた方がいいですが、詳細は「VBAでクラス変数の宣言とNewを1行で書いてよいか」をご参照ください。
1 |
Dim oNetwork As New IWshRuntimeLibrary.WshNetwork |
1 2 |
Dim oNetwork As IWshRuntimeLibrary.WshNetwork Set oNetwork = New IWshRuntimeLibrary.WshNetwork |
以降のサンプルコードは参照設定を行った場合の書き方になります。
構文
WshNetworkクラスには複数のメソッドやプロパティが用意されています。その中でネットワークドライブの接続と切断と一覧取得を行うものは以下になります。
1. ネットワークドライブの接続
1 |
Sub MapNetworkDrive(LocalName As String, RemoteName As String, [UpdateProfile], [UserName], [Password]) |
LocalName | 新規に割り当てるドライブ名を指定します。コロンを含めて”Z:”のように指定します。 |
RemoteName | ネットワークドライブを割り当てる先のパスを指定します。 |
UpdateProfile | 省略可能です。ログオン時に自動で接続するかどうかを指定します。Trueは再接続を行いますが、Falseは行いません。省略時はFalseとなります。 |
UserName | 接続する際のログインユーザ名を指定します。省略時は現在のユーザになります。 |
Password | 接続する際のログインユーザのパスワードを指定します。省略時は現在のユーザのパスワードになります。 |
2. ネットワークドライブの切断
1 |
Sub RemoveNetworkDrive(Name As String, [Force], [UpdateProfile]) |
Name | 切断するネットワークドライブ名を指定します。 |
Force | 切断するドライブが使用中でも強制切断するかどうかを指定します。Trueは強制切断を行いますが、Falseは行いません。 |
UpdateProfile | 再接続時に利用するユーザープロファイルを削除するかどうかを指定します。Trueは削除しますが、Falseは削除しません。 |
3. ネットワークドライブの一覧取得
1 |
Function EnumNetworkDrives() As WshCollection |
WshCollection | ネットワークドライブの一覧が取得できた場合はWshCollectionコレクションとして返却されます。 |
0と偶数の要素番号にはドライブ名+コロン(:)が設定され、奇数の要素番号にはドライブ名に対応するパスが設定されます。
サンプルコード
ネットワークドライブの一覧の取得を行い、X,Y,Wドライブの接続および切断を行うサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Sub WshNetworkTest() On Error GoTo ERR_LABEL Dim oNetwork As New IWshRuntimeLibrary.WshNetwork '// WshNetworkクラス Dim oList As WshCollection '// ネットワークドライブコレクション Dim i '// ネットワークドライブの一覧を取得 Set oList = oNetwork.EnumNetworkDrives If (oList.Length > 0) Then '// 取得したネットワークドライブコレクションを出力 For i = 0 To oList.Count - 1 Debug.Print oList.Item(i) Next End If '// ネットワークドライブ接続 Call oNetwork.MapNetworkDrive("X:", "\\landisk\disk", False, "TestUser", "TestPassword") Call oNetwork.MapNetworkDrive("Y:", "\\landisk\share", True) Call oNetwork.MapNetworkDrive("W:", "\\landisk\video") '// ネットワークドライブ切断 Call oNetwork.RemoveNetworkDrive("s:", True, True) Call oNetwork.RemoveNetworkDrive("Y:", True) Call oNetwork.RemoveNetworkDrive("W:") ERR_LABEL: If Err.Number = 0 Then Exit Sub End If Debug.Print Err.Number & ":" & Err.Description & ":" & Err.HelpFile End Sub |
2行目 | エラー発生時にERR_LABELに処理を移すようにしています。 |
4行目 | WshNetworkクラスのインスタンスを作成しています。 |
5行目 | EnumNetworkDrivesメソッドの結果取得用の変数です。 |
6行目 | ネットワークドライブ取得時のループカウンタです。 |
9行目 | EnumNetworkDrivesメソッドを実行してネットワークドライブの一覧を取得します。 |
11行目 | ネットワークドライブが1つ以上ある場合にのみネットワークドライブの出力を行うようにしています。 |
13~15行目 | 取得したネットワークドライブをイミディエイトウィンドウに出力しています。 |
19~21行目 | ネットワークドライブの接続をパラメータを変えて実行しています。 |
24~26行目 | ネットワークドライブの切断をパラメータを変えて実行しています。 |
28行目 | エラー発生時にここに処理が移ります。 |
29~31行目 | エラー発生時はエラー番号に0ではない値が設定されます。0の場合はエラーが発生していないとして関数を抜けます。 |
33行目 | エラー発生時にエラー番号やエラー内容やヘルプをイミディエイトウィンドウに出力しています。 |