FAQ MS-Access

FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
Sommaire→Fichiers et répertoires→Recherches et Localisation- Comment afficher la boîte de dialogue Ouvrir afin de récupérer le nom et le chemin du fichier sélectionné ?
- Comment afficher la boîte de dialogue Enregistrer afin de récupérer le nom et le chemin du fichier sélectionné ?
- Comment récupérer le répertoire d'un fichier à partir de son chemin complet ?
- Comment obtenir le contenu d'un répertoire ?
- Y a-t-il plusieurs façons de parcourir mon disque dur pour récupérer le chemin du fichier sélectionné ?
- Comment chercher dans un disque rigide un fichier dont le nom est donné ? Comment obtenir son répertoire ?
- Comment utiliser le contrôle Common Dialog pour récupérer le chemin d'un fichier ?
- Comment obtenir les chemins complets des répertoires spéciaux ?
- Comment connaître le chemin vers les répertoires spéciaux ?
- Comment récupérer les chemins complets des répertoires Windows, System, et Windows\Temp ?
- Comment récupérer le répertoire courant (où se trouve la base de données) ?
- Comment ouvrir une fenêtre de sélection de répertoire ?
- Comment isoler le répertoire dans lequel se trouve un fichier lorsque l'on a son chemin complet ?
Cette fonction propose plusieurs arguments utiles pour personnaliser votre boîte de dialogue, ils sont expliqués dans le code.
Code à placer dans un module :
' 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
' 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
' Constantes
Private Const OFN_READONLY = &H1
Private Const OFN_OVERWRITEPROMPT = &H2
Private Const OFN_HIDEREADONLY = &H4
Private Const OFN_NOCHANGEDIR = &H8
Private Const OFN_SHOWHELP = &H10
Private Const OFN_ENABLEHOOK = &H20
Private Const OFN_ENABLETEMPLATE = &H40
Private Const OFN_ENABLETEMPLATEHANDLE = &H80
Private Const OFN_NOVALIDATE = &H100
Private Const OFN_ALLOWMULTISELECT = &H200
Private Const OFN_EXTENSIONDIFFERENT = &H400
Private Const OFN_PATHMUSTEXIST = &H800
Private Const OFN_FILEMUSTEXIST = &H1000
Private Const OFN_CREATEPROMPT = &H2000
Private Const OFN_SHAREAWARE = &H4000
Private Const OFN_NOREADONLYRETURN = &H8000
Private Const OFN_NOTESTFILECREATE = &H10000
Private Const OFN_SHAREFALLTHROUGH = 2
Private Const OFN_SHARENOWARN = 1
Private Const OFN_SHAREWARN = 0
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 à 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
' 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 défaut
' Exemple: C:\windows\system32
' Si vous laissez l'argument vide, par défaut 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 FunctionExemple pour appeler la fonction depuis le code d'un formulaire :
MsgBox OuvrirUnFichier(Application.hwndAccessApp, "Parcourir", 1, "Fichier Word", "doc")Lien : Comment afficher la boîte de dialogue Enregistrer afin de récupérer le nom et le chemin du fichier sélectionné ?
Lien : Comment utiliser le contrôle Common Dialog pour récupérer le chemin d'un fichier ?
Lien : Comment avec l'API GetOpenFileNameA ouvrir plusieurs fichiers à la fois ?
Note : les arguments de cette fonction sont expliqués dans le code.
Code à placer dans un module :
' Déclaration de l'API
Private Declare Function GetSaveFileName Lib "comdlg32.dll" _
Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) _
As Long
' 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
Function EnregistrerUnFichier(Handle As Long, Titre As String, _
NomFichier As String, Chemin As String) As String
' EnregistrerUnFichier est la fonction à 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 FunctionExemple pour appeler la fonction depuis le code d'un formulaire :
MsgBox EnregistrerUnFichier(Me.hwnd, "Enregistrer sous", "Test.doc", "C:\")Lien : Comment afficher la boîte de dialogue Ouvrir afin de récupérer le nom et le chemin du fichier sélectionné ?
Lien : Comment utiliser le contrôle Common Dialog pour récupérer le chemin d'un fichier ?
Cette fonction reçoit le chemin complet d'un fichier en paramètre et renvoie le chemin du répertoire :
Public Function ExtractFolder(ByVal sFullPath As String) As String
If Right(sFullPath, 1) = "\" Then
ExtractFolder = sFullPath
Else
ExtractFolder = Left(sFullPath, InStrRev(sFullPath, "\"))
End If
End FunctionLien : FAQ VB
Dim rep As String
' Obtient le premier fichier ou répertoire qui est dans "c:\"
rep = Dir("c:\*.*", vbDirectory)
' Boucle tant que le répertoire n'a pas été entièrement parcouru
Do While (rep <> "")
' Teste si c'est un fichier ou un répertoire
If (GetAttr("c:\" & rep) And vbDirectory) = vbDirectory Then
MsgBox "Répertoire " & rep
Else
MsgBox "Fichier " & rep
End If
' Passe à l'élément suivant
rep = Dir
LoopLien : FAQ VB
En utilisant :
- le contrôle ActiveX Microsoft Common Dialog Control ;
- l'objet FileDialog : il n'est supporté qu'à partir d'Access 2002, nous privilégierons donc d'autres solutions ;
- des API : Solution 1 Solution 2.
Ce sujet est abordé dans la rubrique code source (cf. liens ci-dessous).
Lien : Recherche de fichiers en spécifiant certaines extensions seulement.
Lien : Recherche récursive d'un fichier
Lien : Rechercher la première occurrence d'un fichier dans une arborescence
Ouvrir un module (page de code) :
- menu Tools (Outils) ;
- item References (Références) ;
- cochez la référence Microfoft Common Dialog Control.
Dans la barre d'outils, cliquez sur le dernier bouton More controls / Autres Contrôles. Dans la liste qui s'ouvre choisissez le contrôle Microsoft Common Dialog Control et placez-le sur le formulaire. Nous le nommerons Dlg.
Placez le code suivant dans un module (action clic du bouton Btn_Chercher) :
Private Sub Btn_Chercher_Click()
With dlg
.DialogTitle = "selectionner un fichier" 'titre de la boite
.FileName="*.txt" 'on recherche un fichier d'extension txt
.initDir="c:\" 'repertoire par defaut
.CancelError = false 'pour ne pas partir en erreur si on click sur annuler
.ShowOpen
End With
'txtPath est la zone de texte recevant le chemin du fichier
txtPath = dlg.FileName
End SubN.B. Il se peut que vous n'ayez pas la licence nécessaire à l'utilisation de ce contrôle. Dans ce cas, essayez les autres méthodes proposées dans la FAQ.
Lien : Comment afficher la boîte de dialogue Ouvrir afin de récupérer le nom et le chemin du fichier sélectionné ?
Lien : Comment afficher la boîte de dialogue Enregistrer afin de récupérer le nom et le chemin du fichier sélectionné ?
Pour récupérer les chemins complets des répertoires du Bureau, de Mes Documents, ou du menu Démarrer, vous pouvez utiliser la fonction SHGetSpecialFolderPath de l'API Windows :
Private Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias "SHGetSpecialFolderPathA" _
(ByVal hwndOwner As Long, ByVal lpszPath As String, _
ByVal nFolder As Long, ByVal fCreate As Long) As LongDescription des paramètres :
hwndOwner : handle de la fenêtre à utiliser si une boîte de dialogue doit être affichée ;
lpszPath : chaîne de caractères recevant le chemin complet du répertoire demandé ;
nFolder : nombre indiquant le répertoire demandé ;
fCreate : si la valeur passée à ce paramètre n'est pas nulle, le répertoire est créé, s'il n'existe pas déjà.
Sous Windows NT 4.0 et Windows 95, cette fonction n'est disponible que si Internet Explorer 4.0 ou supérieur est installé. Voyons comment l'utiliser :
Public Function GetSpecialFolderPath(dossier As Long, hwnd As Long)
Dim buffer As String
buffer = Space(256)
SHGetSpecialFolderPath hwnd, buffer, dossier, 0
GetSpecialFolderPath = Left(buffer, InStr(buffer, Chr(0)) - 1)
End FunctionPour tester cette fonction, placez par exemple ces trois lignes dans une procédure du module d'un formulaire :
MsgBox GetSpecialFolderPath(0, Me.hwnd) ' Répertoire du Bureau
MsgBox GetSpecialFolderPath(5, Me.hwnd) ' Répertoire Mes Documents
MsgBox GetSpecialFolderPath(11, Me.hwnd) ' Répertoire du menu DémarrerLes réfractaires aux API Windows préféreront utiliser le Windows Script Host Object Model en ajoutant wshom.ocx aux références du projet. Les chemins complets des répertoires spéciaux sont dans la collection SpecialFolders de l'objet WshShell.
Dim Wsh As WshShell
Set Wsh = New WshShell
MsgBox Wsh.SpecialFolders.Item("Desktop") ' Répertoire du Bureau
MsgBox Wsh.SpecialFolders.Item("MyDocuments") ' Répertoire Mes Documents
MsgBox Wsh.SpecialFolders.Item("StartMenu") ' Répertoire du menu Démarrer
Set WshShell = nothing
End SubAvec les anciennes versions de Wshom.ocx, la classe WshShell s'appelle IWshShell_Class.
Lien : FAQ VB
Lien : Comment ouvrir un fichier HTML, Word, PDF ou autre en utilisant l'exécutable associé ?
Lien : Que faire quand l'API ShellExecute ne fonctionne pas ?
La référence "Windows Script Host Object Model" (wshom.ocx) propose un objet permettant d'accéder aux répertoires spéciaux d'un ordinateur.
WshShell.SpecialFolders(repertoire)
Où repertoire, est une chaîne de caractères définissant quel répertoire atteindre.
Liste des types de répertoires
- AllUsersDesktop : D:\Documents and Settings\All Users\Bureau
- AllUsersStartMenu : D:\Documents and Settings\All Users\Menu Démarrer
- AllUsersPrograms : D:\Documents and Settings\All Users\Menu Démarrer\Programmes
- AllUsersStartup : D:\Documents and Settings\All Users\Menu Démarrer\Programmes\Démarrage
- Desktop : D:\Documents and Settings\Christophe\Bureau
- AppData : D:\Documents and Settings\Christophe\Application Data
- PrintHood : D:\Documents and Settings\Christophe\Voisinage d'impression
- Templates : D:\Documents and Settings\Christophe\Modèles
- Fonts : D:\WINDOWS\Fonts
- NetHood : D:\Documents and Settings\Christophe\Voisinage réseau
- StartMenu : D:\Documents and Settings\Christophe\Menu Démarrer
- SendTo : D:\Documents and Settings\Christophe\SendTo
- Recent : D:\Documents and Settings\Christophe\Recent
- Startup : D:\Documents and Settings\Christophe\Menu Démarrer\Programmes\Démarrage
- Favorites : D:\Documents and Settings\Christophe\Favoris
- MyDocuments : E:\
- Programs : D:\Documents and Settings\Christophe\Menu Démarrer\Programmes
Exemple :
Dim oWsh As New WshShell
MsgBox oWsh.SpecialFolders("Desktop")Lien : Comment créer un raccourci ?
Lien : Comment déclarer une référence dans MS Access ?
Voici deux solutions possibles. Tout d'abord, les fonctions de l'API Windows :
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As LongCes trois fonctions de l'API Win32 renvoient respectivement les chemins complets des répertoires Windows, System, et Windows\Temp. Elles s'utilisent toutes les trois de la même manière :
Function GetWindowsDir() As String
Dim buffer As String * 256
Dim Length As Long
Length = GetWindowsDirectory(buffer, Len(buffer))
GetWindowsDir = Left(buffer, Length)
End Function
Function GetSystemDir() As String
Dim buffer As String * 256
Dim Length As Long
Length = GetSystemDirectory(buffer, Len(buffer))
GetSystemDir = Left(buffer, Length)
End Function
Function GetTempDir() As String
Dim buffer As String * 256
Dim Length As Long
Length = GetTempPath(Len(buffer), buffer)
GetTempDir = Left(buffer, Length)
End FunctionUne autre manière de procéder est de faire appel au FileSystemObject :
Dim fso As FileSystemObject
Set fso = New FileSystemObject
MsgBox fso.GetSpecialFolder(0) 'répertoire windows
MsgBox fso.GetSpecialFolder(1) 'répertoire system
MsgBox fso.GetSpecialFolder(2) 'répertoire temp
Set fso = Nothing
End SubLien : FAQ VB
MsgBox ParentDir(Application.CurrentDB.Name)En fait, Application.CurrentDB.Name fournit le chemin complet avec le nom de la base. La fonction ParentDir() sert à soustraire le nom de la base du chemin d'accès.
Autre possibilité :
CurrentProject.PathLien : Comment isoler le répertoire dans lequel se trouve un fichier lorsque l'on a son chemin complet ?
Pour cela vous devez ajouter ces déclarations au début de votre module :
Private Const BIF_RETURNONLYFSDIRS = 1
Private Const BIF_DONTGOBELOWDOMAIN = 2
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 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 TypeLa fonction suivante ouvre la fenêtre de sélection de répertoire standard de Windows et renvoie le chemin du répertoire sélectionné. Les paramètres attendus sont le titre à afficher et l'identifiant de la fenêtre parente.
Public Function SelectFolder(Titre As String, Handle As Long) 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
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 FunctionCette ligne fait appel à la fonction écrite ci-dessus pour ouvrir la fenêtre de sélection de répertoire et afficher le répertoire sélectionné :
MsgBox SelectFolder("Sélectionnez un répertoire :", Me.hWnd)
Il est possible d'ajouter dans la boîte de dialogue un bouton permettant la création d'un nouveau dossier.
Il faut ajouter cette constante :
Private Const BIF_NEWDIALOGSTYLE As Long = &H40
Ensuite remplacer la ligne correspondante par ce code :
.ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN + BIF_NEWDIALOGSTYLELien : FAQ VB
On envoie en entrée de cette fonction le nom complet d'un fichier et la fonction renvoie le répertoire dans lequel se trouve le fichier.
Function ParentDir(ByVal str As String) As String
Dim i as Integer
' Repère le dernier "\"
If Right(str, 1) = "\" Then str = Left(str, Len(str) - 1)
' Maintenant regarde le précédent
For i = Len(str) To 1 Step -1
If Mid(str, i, 1) = "\" Then
Debug.Print "Fichier " & Right(str, Len(str) - i)
str = Left(str, i)
GoTo fin01
End If
Next i
fin01:
Debug.Print "Répertoire " & str
ParentDir = str
End FunctionSolution possible depuis MS Access 2000 :
Function Path(ByVal sFullPath As String) As String
If Right(sFullPath,1)="\" then
Path=sFullPath
Else
Path=Left(sFullPath, InStrRev(sFullPath,"\"))
End If
End Function


