【VBA】ネットワークドライブ割当てダイアログ表示

VBAで「ネットワークドライブ割り当て」ダイアログを表示する方法です
「Declare Function」で「Windows API」を定義します
「Windows API」は、WindowsのC言語関数をVBから呼び出すインターフェースです

Windows API 呼び出し定義

標準モジュールに下記のコードを記述します
「Windows API」の部分です
dllとリンクさせる記述です
マクロボタンクリックイベントと同じモジュールに記述する場合はPublicではなくPrivateで良いです

Option Explicit

'「ネットワークドライブの割り当て」ダイアログを表示
Public Declare Function WNetConnectionDialog1 Lib "mpr.dll" Alias "WNetConnectionDialog1A" (lpConnectDlgStruct As Any) As Long
   
'メモリを確保
Public Declare Function GlobalAlloc Lib "kernel32.dll" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long
   
'メモリを解放
Public Declare Function GlobalFree Lib "kernel32.dll" (ByVal hMem As Long) As Long
   
'メモリをコピー
Public Declare Sub RtlMoveMemory Lib "kernel32.dll" (Destinatition As Any, Source As Any, ByVal Length As Long)
   
'リソースの詳細を示すデータ型
Public Type tagNETRESOURCE
    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

'「ネットワークドライブの割り当て」ダイアログを示すデータ型
Public Type tagCONNECTDLGSTRUCT
    cbStructure As Long
    hwndOwner   As Long
    lpConnRes   As Long
    dwFlags     As Long
    dwDevNum    As Long
End Type

Public Const RESOURCETYPE_DISK = &H1
Public Const GMEM_FIXED = &H0
Public Const GMEM_ZEROINIT = &H40
Public Const CONNDLG_USE_MRU = &H4
Public Const CONNDLG_HIDE_BOX = &H8
Public Const CONNDLG_NOT_PERSIST = &H20
Public Const NO_ERROR = 0

ネットワークドライブ割当てダイアログの表示

標準モジュールに定義したものを使ってダイアログを表示します
シートにマクロのコマンドボタンを追加し呼び出しします
実際に使用する時は、エラートラップをし、メモリ解放をしっかりした方が良いと思います

Sub ボタン1_Click()
    Dim udtNetResource As tagNETRESOURCE
    Dim udtConnectDlg  As tagCONNECTDLGSTRUCT
    Dim lngReturn      As Long
    
    'リソースの詳細を設定
    With udtNetResource
        .dwType = RESOURCETYPE_DISK
    End With
    
    'ダイアログの詳細を設定
    With udtConnectDlg
        .cbStructure = LenB(udtConnectDlg)
        .hwndOwner = Application.Hwnd
        .lpConnRes = GlobalAlloc(GMEM_FIXED Or _
                                 GMEM_ZEROINIT, _
                                 LenB(udtNetResource))
                                 
        RtlMoveMemory ByVal .lpConnRes, _
                      udtNetResource, _
                      LenB(udtNetResource)
                      
        .dwFlags = CONNDLG_USE_MRU Or _
                   CONNDLG_HIDE_BOX Or _
                   CONNDLG_NOT_PERSIST
    End With
    
    'ダイアログ表示
    lngReturn = WNetConnectionDialog1(udtConnectDlg)
    Select Case lngReturn
        Case NO_ERROR
        
        Case &HFFFFFFFF
            MsgBox "[キャンセル]されました。"
        Case Else
            MsgBox "エラー(" & lngReturn & ")が発生しました。"
    End Select
    
    GlobalFree (udtConnectDlg.lpConnRes)
End Sub

VBA,プログラム

Posted by こっぷ