FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- 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
Function
Exemple 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
Function
Exemple 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
Function
Lien : 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
Loop
Lien : 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
Sub
N.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
Long
Description 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
Function
Pour 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émarrer
Les 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
Sub
Avec 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
Long
Ces 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
Function
Une 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
Sub
Lien : 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.Path
Lien : 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
Type
La 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
Function
Cette 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_NEWDIALOGSTYLE
Lien : 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
Function
Solution 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