Ouvrir un explorateur sous VBA pour choisir un fichier
PtitGrumo
Messages postés205Date d'inscriptionsamedi 22 janvier 2005StatutMembreDernière intervention28 novembre 2005
-
9 juin 2005 à 14:58
cs_FREDO24
Messages postés2Date d'inscriptionjeudi 24 février 2005StatutMembreDernière intervention19 septembre 2011
-
28 oct. 2008 à 19:56
Bonjour tous,
Je cherche sur un click boutton à ouvrir un explorateur pour que l'utilisateur puisse choisir un fichier!
J'ai regardé les différente réponse à ce jour sur ce sujet:
- réponse 1 : avec Application.FileDialog mais chez moi ca ne marche pas même en mettant la référence microsoft office xx.x object library
- réponse deux en passant par les API SHBrowseForFolder et SHGetPathFromIDList mais là ca n'ouvre qu'un explorateur permettant de choisir un Répertoire et non un fichier
Je souhaite donc ouvrir un explorateur complet permettant de rechercher un fichier et de le sélectionner !
awasarr
Messages postés5Date d'inscriptionlundi 20 septembre 2004StatutMembreDernière intervention15 juin 2005 9 juin 2005 à 17:54
Excuses pour le message vide.
Si j'ai bien compris ton message...........
Tu fais Projet ---> composants et tu choisis Microsoft Common Dialog Control 6.0
Tu vois apparaître un contrôle nommé CommonDialog. Tu la place sur ton
formulaire. Tu place un bouton de commande derrière lequel tu mets le
code. controldialog1.showopen pour ouvrir l'explorateur. Les autres
méthodes de ce contrôle sont très intéressantes. Alors contactes moi si
tu as besoin d'aide.
PtitGrumo
Messages postés205Date d'inscriptionsamedi 22 janvier 2005StatutMembreDernière intervention28 novembre 20052 9 juin 2005 à 18:27
Salut!
Je suis sous access 2000 donc je n'ai pas le menu projet ----> composant
Par contre j'ai le menu référence et n'y trouve pas l'objet Microsoft Common Dialog Control 6.0
snifffff
sinon jpleroisse ton code ne fonctionne pas chez moi!
A++ j'espère
Vous n’avez pas trouvé la réponse que vous recherchez ?
dsomped
Messages postés22Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention16 juin 20054 13 juin 2005 à 10:21
Essaye ceci (ça marche avec Office XP en cochant la référence Microsoft Office 10.0 Object library):
Dim strChemin As String
Dim Fd As FileDialog
Set Fd = Application.FileDialog(msoFileDialogFilePicker)
With Fd
.AllowMultiSelect = False
.Title = "Sélectionnez la base contenant les données à importer"
.ButtonName = "Sélectionner"
.InitialFileName = CurrentProject.path
.InitialView = msoFileDialogViewDetails
.Filters.Clear
.Filters.Add "Bases de données Microsoft Access", "*.mdb" If .Show -1 Then strChemin .SelectedItems(1)
End With
Set Fd = Nothing
Tu peux personnaliser le titre, le nom du bouton de sélection, et les filtres sur les types de fichiers, pour + d'infos cherche FileDialog dans l'aide d'Access ou MSDN.
Si ça ne marche pas j'ai aussi la solution avec les API...
dsomped
Messages postés22Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention16 juin 20054 13 juin 2005 à 10:31
version API, comporte les fonctions pour ouvrir ou choisir un fichier, enregistre un fichier, choisir un répertoire:
Option Compare Database
Option Explicit
'Déclaration de l'API
Private Declare Sub PathStripPath Lib "shlwapi.dll" Alias "PathStripPathA" (ByVal pszPath As String)
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Declare Function GetSaveFileName Lib "comdlg32.dll" _
Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) _
As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
Private Declare Function lstrcat Lib "kernel32" _
Alias "lstrcatA" (ByVal lpString1 As String, _
ByVal lpString2 As String) As Long
Private Declare Function OleInitialize Lib "ole32.dll" _
(lp As Any) As Long
Private Declare Sub OleUninitialize Lib "ole32" ()
'Structure du fichier
Private Type OPENFILENAME
lStructSize As Long
hWndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
Flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
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
'Constants for vFlags
'Only return computers. If the user selects anything
'other than a computer, the OK button is greyed out.
Private Const BIF_BROWSEFORCOMPUTER = &H1000
'Only return printers.'If the user selects anything
'other than a printer, the OK button is greyed out.
Private Const BIF_BROWSEFORPRINTER = &H2000
'Display files as well as folders.
Private Const BIF_BROWSEINCLUDEFILES = &H4000
'Do not include network folders below the domain level.
Private Const BIF_DONTGOBELOWDOMAIN = &H2
'Include an edit control so the user can type the name
'of an item.
Private Const BIF_EDITBOX = &H10
'Only return file system ancestors. If the user selects
'anything other than a file system ancestor, the OK
'button is greyed out.
Private Const BIF_RETURNFSANCESTORS = &H8
'Only return file system directories. If the user
'selects folders that are not part of the file system,
'the OK button is greyed out.
Private Const BIF_RETURNONLYFSDIRS = &H1
'Include a status area in the dialog box. 'The callback
'function can set the status text by sending messages
'to the dialog box.
''Private Const BIF_STATUSTEXT = &H4
'Use the new user-interface. 'Setting this flag provides
'the user with a larger dialog box that can be resized.
'It has several new capabilities including: drag and
'drop capability within the dialog box, reordering,
'context menus, new folders, delete, and other context
'menu commands. To use this flag, you must call
'OleInitialize or CoInitialize before calling
'SHBrowseForFolder.
Private Const BIF_USENEWUI = &H40
'If the user types an invalid name into the edit box,
'the browse dialog will call the application's
'BrowseCallbackProc with the BFFM_VALIDATEFAILED
'message. This flag is ignored if BIF_EDITBOX is not
'specified.
''Private Const BIF_VALIDATE = &H20
Public Const MAX_PATH = 260
Public Function OuvrirUnFichier(Handle As Long, _
Titre As String, _
TypeRetour As Byte, _
Optional TitreFiltre As String, _
Optional TypeFichier As String, _
Optional RepParDefaut As String) As String
'OuvrirUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir _
la boîte de dialogue de sélection d'un fichier.
'Explication des paramètres
'Handle = le handle de la fenêtre (Me.Hwnd)
'Titre = Titre de la boîte de dialogue
'TypeRetour (Définit la valeur, de type String, renvoyée par la fonction)
'1 = Chemin complet + Nom du fichier
'2 = Nom fichier seulement
'TitreFiltre = Titre du filtre
'Exemple: Fichier Access
'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
'TypeFichier = Extention du fichier (Sans le .)
'Exemple: MDB
'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
'RepParDefaut = Répertoire d'ouverture par defaut
'Exemple: C:\windows\system32
'Si vous laissé l'argument vide, par defaut il se place dans le répertoire de votre application
Dim StructFile As OPENFILENAME
Dim sFiltre As String
'Construction du filtre en fonction des arguments spécifiés
If Len(TitreFiltre) > 0 And Len(TypeFichier) > 0 Then
sFiltre = TitreFiltre & " (" & TypeFichier & ")" & Chr$(0) & "*." & TypeFichier & Chr$(0)
End If
sFiltre = sFiltre & "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0)
'Configuration de la boîte de dialogue
With StructFile
.lStructSize = Len(StructFile) 'Initialisation de la grosseur de la structure
.hWndOwner = Handle 'Identification du handle de la fenêtre
.lpstrFilter = sFiltre 'Application du filtre
.lpstrFile = String$(254, vbNullChar) 'Initialisation du fichier '0' x 254
.nMaxFile = 254 'Taille maximale du fichier
.lpstrFileTitle = String$(254, vbNullChar) 'Initialisation du nom du fichier '0' x 254
.nMaxFileTitle = 254 'Taille maximale du nom du fichier
.lpstrTitle = Titre 'Titre de la boîte de dialogue
.Flags = OFN_HIDEREADONLY 'Option de la boite de dialogue
If ((IsNull(RepParDefaut)) Or (RepParDefaut = "")) Then
RepParDefaut = CurrentDb.name
PathStripPath (RepParDefaut)
.lpstrInitialDir = Left(CurrentDb.name, Len(CurrentDb.name) - Len(Mid$(RepParDefaut, 1, InStr(1, RepParDefaut, vbNullChar) - 1)))
Else: .lpstrInitialDir = RepParDefaut
End If
End With
If (GetOpenFileName(StructFile)) Then 'Si un fichier est sélectionné
Select Case TypeRetour
Case 1: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFile, InStr(1, StructFile.lpstrFile, vbNullChar) - 1))
Case 2: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFileTitle, InStr(1, StructFile.lpstrFileTitle, vbNullChar) - 1))
End Select
End If
End Function
Function EnregistrerUnFichier(Handle As Long, Titre As String, _
NomFichier As String, Chemin As String) As String
'EnregistrerUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir _
la boîte de dialogue d'enregistrement d'un fichier.
'Explication des paramètres
'Handle = le handle de la fenêtre (Me.Hwnd)
'Titre = Titre de la boîte de dialogue
'NomFichier = Nom par défaut du fichier à enregistrer
'Chemin = Chemin par défaut du fichier à enregistrer
Dim structSave As OPENFILENAME
With structSave
.lStructSize = Len(structSave)
.hWndOwner = Handle
.nMaxFile = 255
.lpstrFile = NomFichier & String$(255 - Len(NomFichier), 0)
.lpstrInitialDir = Chemin
.lpstrFilter = "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0) 'Définition du filtre (aucun)
.Flags = &H4 'Option de la boite de dialogue
End With
If (GetSaveFileName(structSave)) Then
EnregistrerUnFichier = Mid$(structSave.lpstrFile, 1, InStr(1, structSave.lpstrFile, vbNullChar) - 1)
End If
End Function
Public Function GetFolder(sTitle As String, Optional strDossier As String, Optional vFlags As Variant) As String
On Error GoTo GetFolder_Erreur
Dim lpIDList As Long
Dim sBuffer As String
Dim BInfo As BROWSEINFO
'If IsMissing(vFlags) Then vFlags = BIF_RETURNONLYFSDIRS + _
' BIF_DONTGOBELOWDOMAIN + BIF_EDITBOX + BIF_USENEWUI
vFlags = BIF_EDITBOX + BIF_USENEWUI
'Initialize Drag & Drop capabilities in the dialog.
Call OleInitialize(ByVal 0&)
If IsMissing(sTitle) Then sTitle = "Selectionner un répertoire" ' the dialog title
With BInfo
.hWndOwner = Access.hWndAccessApp
.pIDLRoot = 0&
.lpszTitle = lstrcat(sTitle, "")
.ulFlags = vFlags
End With
lpIDList = SHBrowseForFolder(BInfo)
If (lpIDList) Then
sBuffer = Space(MAX_PATH)
SHGetPathFromIDList lpIDList, sBuffer
sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
If sBuffer "" Then GetFolder = sBuffer
Else
GetFolder = strDossier
End If
GetFolder_Exit:
Call OleUninitialize
Exit Function
GetFolder_Erreur:
JournalErreurs "cal_Config", "GetFolder"
Resume GetFolder_Exit:
End Function
Dans le code MonBouton_Click() tu mets:
- pour sélectionner un répertoire:
Me!mypath = GetFolder("Choisissez un répertoire", Nz(mypath, ""))
- pour ouvrir ou choisir un fichier:
Me!mypath = OuvrirUnFichier(Me.hWnd, "Sélectionnez un fichier", 1)