共有フォルダの制御はnet shareコマンドで行う
VBAには共有フォルダを制御する方法がありません。
そのため、コマンドプロンプトでnet shareコマンドを使って共有フォルダの作成や削除を行います。
コマンドプロンプトを起動したあとにnet shareコマンドの入力を行うため、外部アプリケーション起動後に制御が離れるShell関数ではなくWshShellクラスを利用します。
WshShellクラスを利用するにはCreateObject関数もしくは参照設定が必要です。紹介するマクロも以下の参照設定が前提になります。
事前設定
WshShellの参照設定は、VBA画面→ツールメニュー→参照設定で「Windows Script Host Object Model」を選択します。これでWshShellクラスを利用できるようになります。
WshShellはCreateObject関数を利用してこのような書き方を紹介されることが多いと思いますが、参照設定をしておけばプロパティやメソッドが候補表示されるようになります。
1 2 |
Dim obj Set obj = CreateObject("WScript.Shell") |
net shareコマンドの簡易説明
おおざっぱにですがnet shareコマンドの説明をします。
そもそもの共有フォルダですが、共有フォルダの名前は実際のフォルダ名と別の名前を付けることが出来ます。
例えば、以下の説明で出てくる「test_share」というのは「C:\web\test」に対して設定された共有フォルダ名です。
net shareコマンドを使うと共有フォルダの一覧取得や共有フォルダの作成と削除やアクセス権の設定を行うことが出来ます。
以下にコマンド例を示します。
共有フォルダの一覧表示 |
|
||
個別の共有フォルダの詳細表示 |
|
||
共有フォルダを作成する |
|
||
共有フォルダの共有を削除する |
|
||
アクセス権限付きで共有フォルダを作成する |
|
他にもユーザー数の設定なども可能です。そのあたりが必要な場合は別途設定してください。
共有フォルダ作成マクロ
以下のConnectNetShare関数は共有フォルダ名と対象フォルダのフルパスを指定して共有フォルダを作成します。
単純な共有フォルダ作成のため、権限などが必要な場合は12行目を編集してください。
処理は、NET SHAREコマンドの文字列を作成し、それをWshShellクラスのExecメソッドでコマンドプロンプトに対して実行しています。
コマンド失敗時は以降の処理実行が必要ないため関数を抜けています。また、NET SHAREコマンドがすぐに返ってこないことを想定してDoEventsでコマンド実行状態を終わるまで待ちます。
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 |
Sub ConnectNetShare(a_sShareName, a_sPath) Dim sh As New IWshRuntimeLibrary.WshShell '// WshShellクラスオブジェクト Dim ex As WshExec '// Execメソッド戻り値 Dim sCmd '// 実行コマンド '// 引数未設定時は抜ける If (a_sShareName = "") Or (a_sPath = "") Then Exit Sub End If '// 実行するコマンドを設定 sCmd = "NET SHARE " & a_sShareName & "=" & a_sPath '// コマンド実行 Set ex = sh.Exec("cmd.exe /c " & sCmd) '// コマンド失敗時 If (ex.Status = WshFailed) Then '// 処理を抜ける Exit Sub End If '// コマンド実行中は待ち Do While (ex.Status = WshRunning) DoEvents Loop End Sub |
共有フォルダ削除マクロ
共有フォルダ作成マクロとほとんど同様です。共有名に対して/DELETEしているだけですね。
NET SHARE文字列の部分を引数すれば汎用化も可能です。ここではわかりやすいようにわざと長いコードにしています。
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 |
Sub DeleteNetShare(a_sShareName) Dim sh As New IWshRuntimeLibrary.WshShell '// WshShellクラスオブジェクト Dim ex As WshExec '// Execメソッド戻り値 Dim sCmd '// 実行コマンド '// 引数未設定時は抜ける If (a_sShareName = "") Then Exit Sub End If '// 実行するコマンドを設定 sCmd = "NET SHARE " & a_sShareName & " /DELETE" '// コマンド実行 Set ex = sh.Exec("cmd.exe /c " & sCmd) '// コマンド失敗時 If (ex.Status = WshFailed) Then '// 処理を抜ける Exit Sub End If '// コマンド実行中は待ち Do While (ex.Status = WshRunning) DoEvents Loop End Sub |
使い方
こちらが共有フォルダ作成のサンプルです。引数に共有フォルダ名とパスを渡しています。
1 2 3 |
Sub ConnectNetShareTest() Call ConnectNetShare("test_share", "C:\web\test") End Sub |
こちらは共有フォルダ削除のサンプルです。引数に削除する共有フォルダ名を渡しています。
1 2 3 |
Sub DeleteNetShareTest() Call DeleteNetShare("test_share") End Sub |