■ フォルダ選択ダイアログ(GetFolder)

フォルダ選択のダイアログを表示します
コールバック関数を作成しているので、初期フォルダの指定も実現しています
ディレクトリチェック処理は掲載していないので、適宜作成してください
フォルダ選択ダイアログの表示には、SHBrowseForFolder のAPIを使用します
単純にフォルダ名だけを取得したい場合には、 pszDisplayName を参照すればOKなのですが
フルパスで取得したい場合には、返却されたLong型のIDを、SHGetPathFromIDList を使用して
パス名に変換する必要があります
取得したパス名の後ろには Null になっているので、削除する必要があります
ここでは、NullTrim という関数を自作して削除することを想定しています (掲載なし
使用後のIDは、CoTaskMemFree を使用して、タスクのメモリブロックを解放します
変換後のパス名格納バッファは少なくとも260バイト以上にします

Const CSIDL_DESKTOP = &H0                   ' デスクトップ
Const BIF_RETURNONLYFSDIRS = &H1
Const BIF_DONTGOBELOWDOMAIN = &H2
Const MAX_PATH = 260                        ' ファイルパス長
Const WM_USER = &H400                       ' 初期フォルダの設定
Const BFFM_SETSELECTIONA = (WM_USER + 102)
Const BFFM_INITIALIZED = 1

Type BROWSEINFO
   hwndOwner       As Long               ' 呼び出し元ウインドウハンドル
   pidlRoot        As Long               ' 表示上のルートフォルダの位置
   pszDisplayName  As String             ' 選択されたフォルダ名
   lpszTitle       As String             ' ダイアログに表示する文字列
   ulFlags         As Long               ' ダイアログのオプションフラグ
   lpfn            As Long               ' コールバック関数のアドレス
   lParam          As Long               ' コールバック関数へ渡すパラメータ
   iImage          As Long
End Type

'******************************************************************************
'*  関数名:フォルダ選択ダイアログ(GetFolder)
'*  引 数:呼び出しフォーム(w_form As Form)
'*      ダイアログタイトル(ByVal w_title As String)
'*      選択フォルダ(w_path As String)
'*  戻り値:確定/キャンセル(Boolean)
'*  機 能:フォルダ選択ダイアログを表示し、フォルダを選択させる
'******************************************************************************
Public Function GetFolder(w_form As Form, w_title As String, w_path As String) _
        As Boolean

Dim w_ret             As Long               ' 戻り値
Dim w_tbrowseinfo     As BrowseInfo         ' フォルダダイアログ構造体
Dim w_buff            As String * MAX_PATH  ' パス名格納バッファ

    ' 呼び出し元ウインドウハンドルを設定
    w_tbrowseinfo.hWndOwner = W_form.hwnd
    ' デスクトップをルートに指定
    w_tbrowseinfo.pIDLRoot = CSIDL_DESKTOP
    ' ダイアログボックスの表示文字を設定
    w_tbrowseinfo.lpszTitle = W_title
    ' ダイアログボックスのオプションを設定
    w_tbrowseinfo.ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN

    ' 初期表示ディレクトリが存在する場合
    If DirCheck(W_path) = True Then
        ' コールバック関数のアドレス
        W_tbrowseinfo.lpfn = FARPROC(AddressOf BrowseCallbackProc)
        ' 初期フォルダのパス名
        W_tbrowseinfo.lParam = W_path & vbNullChar
    End If
    ' ダイアログを表示する
    w_ret = SHBrowseForFolder(w_tbrowseinfo)
    ' フォルダが選択された場合
    If w_ret <> 0 Then
        ' パス名格納バッファを初期化
        w_buff = String$(MAX_PATH, vbNullChar)
        ' 返却されたID値をパス名に変換する
        w_ret = SHGetPathFromIDList(w_ret, w_buff)
        ' パス名の後ろのNullを削除します
        w_path = NullTrim(w_buff)
        
    Else
        ' 戻り値にキャンセルを設定
        GetFolder = False
    End If
    ' 割り当てられたメモリを解放する
    CoTaskMemFree W_ret

End Function

'******************************************************************************
'*  関数名:FARPROC処理(FARPROC)
'*  機 能:AddressOf演算子の戻り値を戻す
'******************************************************************************
Private Function FARPROC(pfn As Long) As Long

    FARPROC = pfn

End Function

'******************************************************************************
'*  関数名:コールバック処理(BrowseCallbackProc)
'*  機 能:フォルダ選択ダイアログを初期表示するためのアドレスを取得する
'******************************************************************************
Private Function BrowseCallbackProc(ByVal hWnd As Long, ByVal uMsg As Long, _
        ByVal lParam As Long, ByVal lpData As Long) As Long

    If uMsg = BFFM_INITIALIZED Then
        SendMessage hWnd, BFFM_SETSELECTIONA, 1, ByVal lpData
    End If

End Function