[Excel] GetOpenFilename FileFilter=répertoire

Résolu/Fermé
Raph04 Messages postés 158 Date d'inscription lundi 30 juin 2008 Statut Membre Dernière intervention 17 mai 2022 - 7 déc. 2009 à 15:12
Raph04 Messages postés 158 Date d'inscription lundi 30 juin 2008 Statut Membre Dernière intervention 17 mai 2022 - 14 déc. 2009 à 09:58
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

2 réponses

JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 856
8 déc. 2009 à 03:47
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
Raph04 Messages postés 158 Date d'inscription lundi 30 juin 2008 Statut Membre Dernière intervention 17 mai 2022 24
14 déc. 2009 à 09:58
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