『ながっちゃん』のページ

気まぐれ兄ちゃんの独り言

#1[VBA]フォルダ選択のダイアログを表示

内容

Windowsが標準で持っているフォルダ選択のダイアログを表示し、ユーザが選択したフォルダのパスを取得する方法です。

解説

 フォルダ選択のダイアログはWindows APIのSHBrowseForFolder( )を使って表示します。
 サンプルは、フォーム上のボタンがクリックされたときに呼ばれることを想定しており、関数SelectFolder_FS( )の中でSHBrowseForFolder( )の引数の値を設定しSHBrowseForFolder( )をコールしてフォルダのパスを取得しています。フォルダ選択のダイアログを表示する際、SelectFolder_FS( )の2番目の引数で指定された文字列をフォルダ選択のダイアログ上に表示します。

サンプル

Option Compare Database

'Windows API用の定数の宣言
'---フォルダ選択用
Private Const BIF_RETURNONLYFSDIRS = 1
Private Const BIF_DONTGOBELOWDOMAIN = 2

'ユーザ定義型の宣言
Private Type BrowseInfo
   hWndOwner      As Long
   pIDLRoot       As Long
   pszDisplayName As Long
   lpszTitle      As Long
   ulFlags        As Long
   lpfnCallback   As Long
   lParam         As Long
   iImage         As Long
End Type

'Windows API関数の宣言
Private Declare Function SHBrowseForFolder Lib "shell32" _
                                  (lpbi As BrowseInfo) As Long

Private Declare Function SHGetPathFromIDList Lib "shell32" _
                                  (ByVal pidList As Long, _
                                  ByVal lpBuffer As String) As Long

Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" _
                                  (ByVal lpString1 As String, ByVal _
                                  lpString2 As String) As Long

Public Function SelectFolder_FS(MyForm As Form, szTitle As String) As String
    Dim lpIDList As Long
    Dim sBuffer As String
    Dim tBrowseInfo As BrowseInfo

On Error GoTo HandleErr
    'szTitle = "フォルダを選択してください。"
    With tBrowseInfo
        .hWndOwner = MyForm.Hwnd
        .lpszTitle = lstrcat(szTitle, "")
        .ulFlags = BIF_RETURNONLYFSDIRS
    End With
    
    lpIDList = SHBrowseForFolder(tBrowseInfo)
    
    If (lpIDList) Then
        sBuffer = Space(MAX_PATH)
        SHGetPathFromIDList lpIDList, sBuffer
        sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
        SelectFolder_FS = sBuffer
    End If
ExitHere:
    Exit Function

HandleErr:
    Select Case Err.Number
        Case Else
            MsgBox "エラー " & Err.Number & ": " & Err.Description, vbCritical, "ConvMain.SelectFolder_FS"   'ErrorHandler:$$N=ComUtil.SelectFolder_FS
    End Select
' エラー処理ブロックを終了します。

    SelectFolder_FS = ""
    Resume ExitHere:
End Function