FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- [Access 2007] Comment ajouter un fichier dans un champ de type Pièce jointe en VBA ?
- [Access 2007] Comment créer un champ de type Pièce jointe en VBA ?
- [Access 2007] Comment ouvrir une pièce jointe en VBA ?
- [Access 2007] Comment sauvegarder une pièce jointe dans un fichier en VBA ?
- [Access 2007] Comment savoir si mon champ est de type Pièce jointe ?
- [Access 2007] Comment supprimer toutes les pièces jointes d'un certain type ?
- [Access 2007] Comment vider un champ de type Pièce jointe en VBA ?
Pour ajouter un fichier, il faut utiliser la méthode LoadFromFile des objets Field2 de DAO. Cette méthode est applicable au champ FileData d'une pièce jointe.
Exemple :
Function
AjouterFichier
(
strchemin As
String
, inteleve As
Integer
) As
Boolean
On
Error
GoTo
err
Dim
oRst As
DAO.Recordset
' Ouvre un Recordset sur les fichiers de l'élève passé en paramètre
Set
oRst =
CurrentDb.OpenRecordset
(
"SELECT Fichiers FROM tbl_eleve WHERE [N°]="
&
inteleve)
With
oRst.Fields
(
0
).Value
' Ajoute la pièce jointe
.AddNew
' Lit le fichier
.Fields
(
"FileData"
).LoadFromFile
strchemin
.Update
End
With
AjouterFichier =
True
fin
:
Set
oRst =
Nothing
Exit
Function
err
:
' Gestion d'erreur
Select
Case
err
.Number
Case
3024
:
MsgBox
"Fichier inexistant"
, vbCritical
Case
3820
:
MsgBox
"Une autre pièce jointe de ce nom existe déjà"
, vbCritical
Case
Else
:
MsgBox
"Erreur inconnue"
, vbCritical
End
Select
Resume
fin
End
Function
Pour créer un champ pièce jointe dans une table en VBA, vous pouvez utiliser DAO et la méthode CreateField. Dans ce cas, le type du champ sera : dbAttachment.
Sub
creerChampPieceJointe
(
)
Dim
oDb As
DAO.Database
Dim
oTbl As
DAO.TableDef
Set
oDb =
CurrentDb
Set
oTbl =
oDb.TableDefs
(
"TableClient"
)
With
oTbl
.Fields.Append
.CreateField
(
"PhotoClient"
, dbAttachment)
End
With
End
Sub
Pour ouvrir une pièce jointe, il faut procéder en deux étapes :
- enregistrer la pièce jointe dans un fichier temporaire ;
- ouvrir ce fichier.
Pour l'enregistrement, je vous renvoie vers la question : "Comment sauvegarder une pièce jointe dans un fichier en VBA ?".
Pour l'ouverture, vous pouvez utiliser l'API ShellExecute.
Dans l'en-tête d'un module :
Public
Declare
Function
ShellExecute Lib
"shell32.dll"
Alias "ShellExecuteA"
_
(
ByVal
hwnd As
Long
, ByVal
lpOperation As
String
, ByVal
lpFile As
String
, _
ByVal
lpParameters As
String
, ByVal
lpDirectory As
String
, ByVal
nShowCmd As
Long
) As
Long
Puis dans votre code (après l'enregistrement du fichier) :
ShellExecute Me.hwnd
, "open"
, strchemin, ""
, CurrentProject.Path
, 1
Où strChemin est le nom du fichier.
Lien : [Access 2007] Comment sauvegarder une pièce jointe dans un fichier en VBA ?
La méthode SaveToFile des objets Field2 de DAO permet d'enregistrer une pièce jointe dans un fichier dont le nom est passé en paramètre. Il suffit de l'appliquer sur le champ FileData issu du champ pièce jointe.
Dans l'exemple ci-dessous, le champ Fichier est un champ de type pièce jointe.
Function
EnregistrerFichier
(
strNomFichier As
String
, inteleve As
Integer
, strNomDestination) As
Boolean
On
Error
GoTo
err
Dim
oRst As
DAO.Recordset
' Ouvre un Recordset sur les fichiers de l'élève passé en paramètre
Set
oRst =
CurrentDb.OpenRecordset
(
"SELECT Fichiers.FileData FROM tbl_eleve WHERE [N°]="
&
_
inteleve &
" AND Fichiers.FileName="
&
Chr
(
34
) &
strNomFichier &
Chr
(
34
))
If
Not
oRst.EOF
Then
oRst.Fields
(
0
).SaveToFile
strNomDestination
EnregistrerFichier =
True
End
If
fin
:
Set
oRst =
Nothing
Exit
Function
err
:
Select
Case
err
.Number
Case
3839
:
MsgBox
"Impossible d'écraser le fichier"
, vbCritical
Case
Else
MsgBox
"Erreur inconnue"
, vbCritical
End
Select
Resume
fin
End
Function
Utilisation
La ligne suivante sauvegarde la pièce jointe photo.jpg de l'élève n° 2 dans le fichier c:\essai.jpg.
EnregistrerFichier "photo.jpg"
, 2
, "c:\essai.jpg"
Lorsqu'un champ est de type Pièce jointe, la valeur de sa propriété Type avec DAO est égale à dbAttachment (101).
Dim
odb As
DAO.Database
Dim
otbl As
DAO.TableDef
' Instancie la base de données
Set
odb =
CurrentDb
' Accède à la table
Set
otbl =
odb.TableDefs
(
"Table1"
)
' Teste la propriété type du champ
If
otbl.Fields
(
0
).Type
=
dbAttachment Then
MsgBox
"Champ de type Pièce jointe"
End
If
C'est très simple : il suffit de rechercher les fichiers dont l'extension correspond à celle désirée, puis de supprimer les éléments trouvés.
Exemple :
Dim
oRst As
DAO.Recordset
' Accède aux données du client numéro 1
Set
oRst =
CurrentDb.OpenRecordset
(
"SELECT * FROM tblClient WHERE Num=1"
)
' Accède à son jeu de pièces jointes
With
oRst.Fields
(
"Photo"
).Value
' Parcourt tous les fichiers texte en faisant une recherche
.FindFirst
"FileType='txt'"
While
Not
.NoMatch
' Supprime et passe au suivant
.Delete
.FindNext
"FileType='txt'"
Wend
End
With
Lien : [Access 2007] Comment lister les extensions des fichiers en SQL ?
Pour vider un champ de toutes ses pièces jointes, il faut utiliser la méthode Delete du Recordset correspondant au champ.
Exemple :
Dim
oRst As
DAO.Recordset
' Accède aux données du client numéro 1
Set
oRst =
CurrentDb.OpenRecordset
(
"SELECT * FROM tblClient WHERE Num=1"
)
' Accède à son jeu de pièces jointes
With
oRst.Fields
(
"Photo"
).Value
' Parcourt tous les fichiers et les supprime
While
Not
.EOF
.Delete
.MoveNext
Wend
End
With
Lien : [Access 2007] Comment supprimer toutes les pièces jointes d'un certain type ?
Lien : [Access 2007] Comment supprimer toutes les pièces jointes d'un enregistrement en SQL ?
Lien : [Access 2007] Comment supprimer une pièce jointe en SQL ?