教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について紹介します。

【ExcelVBA API操作】共有フォルダへ接続(WNetAddConnection2)する方法を教えて!

f:id:m_kbou:20200417220956p:plain

共有フォルダへ接続するWindowsAPI関数(WNetAddConnection2)について紹介します。

 

 

構文

記述方法は以下の通りとなります。

(API定義)

Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long

----------------------------------------

(構造体定義)
Public Type NETRESOURCE
  dwScope As Long
  dwType As Long
  dwDisplayType As Long
  dwUsage As Long
  lpLocalName As String
  lpRemoteName As String
  lpComment As String
  lpProvider As String
End Type

----------------------------------------

(VBA記述)

WNetAddConnection(lpNetResource,lpPassword,lpUserName, dwFlags)

[説明]:

共有フォルダへ接続するAPI関数はWNetAddConnection2関数となります。VBAから呼び出して使用する場合には、

---------------------------------

・API定義

Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long

・構造体定義

Public Type NETRESOURCE
  dwScope As Long
  dwType As Long
  dwDisplayType As Long
  dwUsage As Long
  lpLocalName As String
  lpRemoteName As String
  lpComment As String
  lpProvider As String
End Type

---------------------------------

をプロシージャ外で宣言します。

引数であるlpNetResourceには上記で定義した構造体を指定し、lpPasswordには接続するパスワードを指定し、lpUserNameには接続するユーザ名を指定し、dwFlagsには接続方法を指定します。lpPassword及びlpUserNameについては固定値で「vbNullString」を指定して下さい。また、dwFlagsについては固定値で「0」を指定して下さい。WNetAddConnection2関数を実行すると戻り値が返ります。返ってきた戻り値の内容についてはこちらを参考にして下さい。

 

使い方

使用方法について説明します。 

[プログラミング例]:

Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long

Public Type NETRESOURCE
  dwScope As Long
  dwType As Long
  dwDisplayType As Long
  dwUsage As Long
  lpLocalName As String
  lpRemoteName As String
  lpComment As String
  lpProvider As String
End Type

Sub ネットワークドライブの接続()

  '↓処理①
  Dim 戻り値 As Long
  Dim 構造体 As NETRESOURCE

  '↓処理②
  With 構造体
    '*-------------------
    'vbNull(固定値)をセットする。
    .dwScope = vbNull
    '*-------------------
    'vbNull(固定値)をセットする。
    .dwType = vbNull
    '*-------------------
    'vbNull(固定値)をセットする。
    .dwDisplayType = vbNull
    '*-------------------
    'vbNull(固定値)をセットする。
    .dwUsage = vbNull
    '*-------------------
    '接続先ドライブをセットする。
    .lpLocalName = "Z:"
    '*-------------------
    '接続先ディレクトリパスをセットする。
    .lpRemoteName = "\\192.168.11.147\テスト"
    '*-------------------
    'vbNullString(固定値)をセットする。
    .lpComment = vbNullString
    '*-------------------
    'vbNullString(固定値)をセットする。
    .lpProvider = vbNullString
    '*-------------------
  End With

  '↓処理③
  戻り値 = WNetAddConnection2(構造体, vbNullString, vbNullString, 0)

  If (戻り値 = 0) Then
    MsgBox "正常に接続されました。(戻り値:" & 戻り値 & ")"
  Else
    MsgBox "エラーがあります。(戻り値:" & 戻り値 & ")", 16, "エラー"
  End If

End Sub

処理の流れは以下の通りとなります。

[処理①]:変数定義
戻り値や構造体を格納する変数定義となります。

[処理②]:変数に格納した構造体へ共有フォルダ接続条件をセット
上記[処理①]で変数に格納した構造体の以下項目に条件をセットします。
・dwScope・・・「vbNull」(固定値)をセットします。
・dwType・・・「vbNull」(固定値)をセットします。
・dwDisplayType・・・「vbNull」(固定値)をセットします。
・dwUsage・・・「vbNull」(固定値)をセットします。
・lpLocalName・・・接続先ドライブを指定します。
       ※今回は「"Z:"」を指定しました。
・lpRemoteName・・・接続先ディレクトリパスを指定します。
       ※今回「"\\192.168.11.147\テスト"」を指定しました。
       (アドレスは任意に変更して下さい。)
・lpComment・・・「vbNullString」(固定値)をセットします。
・lpProvider・・・「vbNullString」(固定値)をセットします。

[処理③]:WNetAddConnection2による共有フォルダへの接続
WindowsAPI関数であるWNetAddConnection2を使用した共有フォルダへの接続となります。各引数には以下の内容をセットして処理を実行します。
・lpNetResource・・・構造体をセットします。
     ※上記[処理②]で格納した変数:構造体をセットします。
・lpPassword・・・接続するパスワードをセットします。
     ※「vbNullString」(固定値)をセットします。
・lpUserName・・・接続するユーザ名をセットします。
     ※「vbNullString」(固定値)をセットします。
・dwFlags・・・接続方法をセットします。
     ※「0」(固定値)をセットします。
実行すると戻り値で「0」又は「0以外」が返されます。戻り値が「0」の場合は処理が正常終了した事となり、MsgBoxで”正常に接続されました。”を表示します。また、「0以外」の場合は処理にエラーがある事となり、MsgBoxで”エラーがあります。”を表示します。

f:id:m_kbou:20210522180121p:plain

※上記のプログラミング例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方についてはこちらを参考にして下さい。

[実行例]:

(事前確認)

エクスプローラーを開き、Zドライブが接続されていない事を確認します。

f:id:m_kbou:20210522180142p:plain

①<接続>ボタンには上記のプログラミング例のプログラムが登録されています。この<接続>ボタンをクリックします。(※ボタンの作り方やボタンにプログラムを割り当てるにはこちらを参考にして下さい。)

f:id:m_kbou:20210510141527p:plain

②結果は正常に接続され、MsgBoxで「正常に接続されました。(戻り値:0)」が表示されます。(※今回は正常に接続された状態について紹介しましたが、戻り値が0以外の場合は何かしらのエラーがあります。その場合は上記プログラミング内の処理②にある接続先ドライブ(lpLocalName)の指定や接続先ディレクトリパス(lpRemoteName)の指定を見直してみて下さい。)

f:id:m_kbou:20210510141540p:plain

③再度エクスプローラーを開いてみると、Zドライブが接続されている事が分かります。

f:id:m_kbou:20210522180203p:plain

[サンプル]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

共有フォルダへ接続する方法についての説明は以上です。

 

おわりに

今回はWindowsAPI関数による共有フォルダへ接続する方法について説明しました。類似の内容に共有フォルダの切断方法もあります。こちらも是非参考にして下さい。