FAQ access 2007
FAQ access 2007Consultez toutes les FAQ
Nombre d'auteurs : 1, nombre de questions : 75, dernière mise à jour : 15 juin 2021
- Comment ajouter un fichier dans un champ de type pièce-jointe en VBA ?
- Comment créer un champ de type pièce-jointe en VBA ?
- Comment ouvrir une pièce-jointe en VBA ?
- Comment sauvegarder une pièce-jointe dans un fichier en VBA ?
- Comment savoir si mon champ est de type pièces-jointes ?
- Comment supprimer toutes les pièces-jointes d'un certain type ?
- 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'éleve 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 le 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'entê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 : 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'éleve 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èces-jointes, 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èces-Jointes"
End
If
En fait c'est trés simple, il suffit de rechercher les fichiers dont l'extension correspond à celle désirée puis 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
'parcours 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
Pour vider un champ de toute 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
'parcours tous les fichiers et les supprime
While
Not
.EOF
.Delete
.MoveNext
Wend
End
With
Lien : Comment supprimer toutes les pièces-jointes d'un certain type ?
Lien : Comment supprimer toutes les pièces-jointes d'un enregistrement en SQL
Lien : Comment supprimer une pièce-jointe en SQL