[Excel] GetOpenFilename FileFilter=répertoire

Résolu
Bonjour,

Bonjour,

Je cherche a récupérer le chemin d'accès à un répertoire grâce à la fonction :
chemin = Application.GetOpenFilename
Seulement comme je cherche à avoir le chemin d'un répertoire (dossier), quand je le selectionne dans ma fenêtre "parcourir" et que je click sur le bouton ouvrir, il m'ouvre le dossier dans ma fenêtre parcourir au lieu de renvoyer le chemin dans ma variable.
Comment puis-je palier a ce problème ?
J'utiliserai bien l'argument "FileFilter", mais je sais pas quel type "d'extension" mettre :
chemin = Application.GetOpenFilename("Répertoire (*.???), *.???")

Merci d'avance ;-)

Raph
Configuration: Windows XP Internet Explorer 6.0

2 réponses

  1. Bonsoir,

    perso j'utilisais Getdirectory() :

    en déclaration :

    Option Explicit
         Public dossier
    
         Public Type BROWSEINFO
            hOwner 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
         '32-bit API declarations
         Declare Function SHGetPathFromIDList Lib "shell32.dll" _
         Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
         Declare Function SHBrowseForFolder Lib "shell32.dll" _
         Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long


    en function() :

    Function GetDirectory(Optional Msg) As String
         Dim bInfo As BROWSEINFO
         Dim path As String
         Dim r As Long, x As Long, pos As Integer
         bInfo.pidlRoot = 0&
         If IsMissing(Msg) Then
         bInfo.lpszTitle = "Choisissez un dossier de destination pour les sauvegardes."
         Else
         bInfo.lpszTitle = Msg
         End If
         bInfo.ulFlags = &H1
         x = SHBrowseForFolder(bInfo)
         path = Space$(512)
         r = SHGetPathFromIDList(ByVal x, ByVal path)
         If r Then
         pos = InStr(path, Chr$(0))
         GetDirectory = Left(path, pos - 1)
         Else
         GetDirectory = ""
         End If
    End Function


    En appel dans une procédure quelconque :

    dossier = GetDirectory("choisissez le dossier à traiter en Post-Publication")
    If dossier <> "" Then .......


    Il y a peut-être plus simple du côté du FileSystemObject mais Getdirectory() me suffisait.

    Cordialement
    0
    1. Merci.

      J'avais finalement utilisé ceci :

      Public Sub Parcourir_Dossier()
      
      Dim chemin As String
      Dim TempDrive As String
      Dim ThePath As String
      Dim UserDir As String
      Dim UserDrive As String
      
      UserDrive = Left(CurDir, 1) 'On Mémorise les Paramètres du User
      UserDir = CurDir  ' idem
      
      chemin = ThisWorkbook.path
      
      TempDrive = Left(chemin, 1) 'le lecteur mappé sur un serveur réseau
      ThePath = chemin 'à ajuster au répertoire contenant tes classeurs
      
      ChDrive TempDrive
      ChDir ThePath
      
      'Recupération du chemin et nom fichier d'extraction
      chemin = Application.GetOpenFilename
      Range("C17").Value = chemin
      
      ChDrive UserDrive 'On remet les paramètres du User
      ChDir UserDir 'idem
      
      End Sub
      


      Utilisant comme module :

      Private Const BIF_RETURNONLYFSDIRS = 1
      Private Const BIF_DONTGOBELOWDOMAIN = 2
      Private Const BFFM_INITIALIZED = 1
      Private Const WM_USER = &H400
      Private Const BFFM_SETSELECTIONA = (WM_USER + 102)
       
      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
      Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
                                    (ByVal hWnd As Long, ByVal wMsg As Long, _
                                    ByVal wParam As Long, lParam As Any) As Long
       
      Private Declare Function SHGetIDListFromPath Lib "SHELL32.DLL" Alias "#162" (ByVal szPath As String) As Long
       
      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
      Function adr(n As Long) As Long
      adr = n
      End Function
       
      Public 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
        'Quand la boite est ouverte actualise le chemin présélectionné
            Call SendMessage(hWnd, BFFM_SETSELECTIONA, False, ByVal lpData)
        End If
      End Function
       
       
       
      Public Function SelectFolder(Titre As String, Handle As Long, Racine As String) As String
       
      Dim lpIDList As Long
      Dim strBuffer As String
      Dim strTitre As String
      Dim tBrowseInfo As BrowseInfo
       
       
       
      strTitre = Titre
      With tBrowseInfo
          .hWndOwner = Handle
          .lpszTitle = lstrcat(strTitre, "")
          .ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
          .lpfnCallback = adr(AddressOf BrowseCallbackProc)
          .lParam = SHGetIDListFromPath(StrConv(Racine, vbUnicode))
      End With
       
      lpIDList = SHBrowseForFolder(tBrowseInfo)
       
      If (lpIDList) Then
          strBuffer = String(260, vbNullChar)
          SHGetPathFromIDList lpIDList, strBuffer
          SelectFolder = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1)
      End If
       
      End Function
      
      
      Public Sub Repertoire()
        Range("C17").Value = SelectFolder("Choisir le répertoire par défaut", 0, ThisWorkbook.path)
      End Sub
      0