Imprimer sélectivement en PDF sous Access 2007
L’impression en PDF fait couler beaucoup d’encre (numérique, heureusement, ça ne pollue pas :-)) sur ce blog. Voir notamment les autres articles consacrés à ce thème. Une question revient souvent : comment, sur Access 2007, choisir les pages à imprimer avant la conversion en PDF ?
Le mauvais réflexe
Souvent, le réflexe est d’ouvrir l’état, puis de sélectionner les pages à imprimer, par leur numéro : « je veux la page 3, puis la 7, etc. ». Sauf cas particulier (bien sûr), ce n’est pas une bonne idée parce que la notion de page est « fluctuante ». Qu’est-ce qui certifie que la fiche du client Tartempion est bien – et sera toujours – sur la page 3 ?
Il vaut mieux raisonner sur les données elles-mêmes : « je veux les clients dont le nom commence par la lettre T », « je veux les clients de Paris », etc. Une fois l’état ouvert avec ces critères, l’impression n’est qu’une formalité !
La solution
Pour obtenir le résultat en PDF, la solution n’est pas très intuitive sur Access 2007, à mon avis… mais elle marche. Elle consiste :
- A ouvrir l’état en le filtrant (on fait donc appel au
DoCmd.OpenReport
classique).
Comme l’état n’est pas forcément utile directement ici, on l’ouvrira en mode masqué (acHidden
). - A lancer la conversion PDF ensuite (par le
DoCmd.OutputTo
vu dans cet article). - En général, on ferme l’état ensuite, c’est le résultat PDF qui nous intéresse.
DoCmd.OutputTo
directement (sans ouvrir l’état avant), vous n’avez pas la main sur le filtre. Ce sont donc tous les enregistrements qui s’impriment…Autant automatiser tout ça ! Recopiez le code ci-dessous dans un module standard de la base de données :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
' --- ' IMPRESSION D'UN ETAT EN PDF ' --- ' Entrée : strFilename <- Chemin complet du fichier PDF à créer. ' strReportName <- Nom de l'état à imprimer. ' strWhere <- Condition Where facultative. ' Sub PrintAsPDF( _ ByVal strFilename As String, _ ByVal strReportName As String, _ Optional ByVal strWhere As String = "", _ Optional ByVal blnOpenReader As Boolean = False) ' Ouvrir l'état en mode caché DoCmd.OpenReport strReportName, acViewPreview, , _ strWhere, acHidden ' Imprimer en PDF DoCmd.OutputTo acOutputReport, strReportName, acFormatPDF, _ strFilename, blnOpenReader ' Refermer l'état DoCmd.Close acReport, strReportName End Sub |
La procédure VBA reçoit plusieurs paramètres, dont les 2 premiers sont obligatoires. Dans l’ordre :
- Le chemin complet du fichier PDF à créer.
- Le nom de l’état à convertir en PDF.
- Le filtre éventuel, si vous souhaitez n’imprimer qu’une partie des données.
- Une valeur
True
si vous souhaitez ouvrir Acrobat Reader en fin de conversion,False
sinon.
Exemple 1
Pour convertir en PDF l’état rpt Etiquettes Clients
(tous les clients sont imprimés) :
1 2 |
PrintAsPDF "C:\Documents and Settings\Hervé\Documents\test.pdf", _ "rpt Etiquettes Clients" |
Vous pouvez paramétrer le chemin du fichier PDF en fonction de l’utilisateur, à l’aide de la fonction Environ() :
1 2 |
PrintAsPDF Environ("USERPROFILE") & "Documentstest.pdf", _ "rpt Etiquettes Clients" |
Exemple 2
Pour imprimer seulement les clients dont le nom contient la lettre I
:
1 2 3 |
PrintAsPDF Environ("USERPROFILE") & "Documentstest.pdf", _ "rpt Etiquettes Clients", _ "[Nom Client] LIKE '*i*'" |
N’importe quel type de condition (simple ou combinée) peut être appliquée : il s’agit de la partie WHERE
d’une instruction SQL.
Exemple 3
La même chose, mais en ouvrant Acrobat Reader à la fin :
1 2 3 4 |
PrintAsPDF Environ("USERPROFILE") & "Documentstest.pdf", _ "rpt Etiquettes Clients", _ "[Nom Client] LIKE '*i*'", _ True |
Bonjour et merci pour le tuto. Voici ce que j’ai mis comme code dans le module standard:
PrintAsPDF « C:\Users\Coami ADJANOR\Documents\FacturesMois.pdf », _
« Imprimer Une Facture »
DoCmd.OpenReport strReportName, acViewPreview, , _
strWhere, acHidden
DoCmd.OutputTo acOutputReport, strReportName, acFormatPDF, _
strFilename, blnOpenReader
DoCmd.Close acReport, strReportName
End Sub
Je pense qu’il est correct mais je n’arrête pas de recevoir un message d’erreur m’indiquant:
Compile Error:
Invalid outside procedure
Pourriez-vous m’aider svp.
Je vous en remercie d’avance
Merci de votre attention, je viens de trouver tout seul mon erreur. Bonne journée.
Je me trop elle est de type texte
Je devais être ailleurs en posant la question 🙂 : il y a bien une déclaration de String dans le code, et des traitements de chaîne plus loin.
Du coup, pour répondre à la question, l’instruction d’impression devrait sans doute être quelque chose comme :
Bonsoir,
Heureux d’avoir trouver PrintAsPDF
L’objectif de mon travail est de créer une attestation de paiement sous format PDF et l’envoyer par mail
Pour le mail ma procédure fonctionne.
Par contre le PrintAsPdf se plante avec l’erreur
« Le moteur de base de données MOA n’a pas pu trouver l’objet » dtnomstable1![LIDNUMMER] like xlLidnummer »
Voici ma routine pour aller vers PrintAsPdf
Private Sub PrepAttestaion_Click()
On Error GoTo Err_PrepAttestaion_Click
Dim XlReport As String
Dim dbbasedonnée As Database
Dim dtnomstable1 As Recordset
Dim xlfile As String
Dim xlLidNummer As String
Dim xltest As String
Set dbbasedonnée = DBEngine.Workspaces(0).Databases(0)
Set dtnomstable1 = dbbasedonnée.OpenRecordset(« Qvereniging leden 2002 »)
‘ Détermination du rapport de base
XlReport = « AttestationNL2014 »
‘ Détermination du la racine de l’attestation
xltest = « AttestationNL- »
‘ Position au début du Query
dtnomstable1.MoveFirst
Do Until dtnomstable1.EOF
xlLidNummer = Left(dtnomstable1![LIDNUMMER], 3) ‘Début du Numéro de membre partie numérique
Me.BxCompteurMail = xlLidNummer ‘visualisation de XlLidNummer
Me.Refresh
‘Création du Nom du fichier attestation pdf
xlfile = xltest & xlLidNummer & « .pdf »
PrintAsPDF Environ(« USERPROFILE ») & « \Documents\ » & xlfile, _
« AttestationNL2014 », _
« dtnomstable1![LIDNUMMER] Like xlLidNummer' », _
True
dtnomstable1.MoveNext
Loop
Exit_PrepAttestaion_Click:
Exit Sub
Err_PrepAttestaion_Click:
MsgBox Err.Description
Resume Exit_PrepAttestaion_Click
End Sub
LIDNUMMER est de quel type ? Numérique ou Texte ?
LIDNUMMER est de type numérique (999 /AAA) dont le 999 est unique donc je prend le teste sur « 999 » (XlLidNummer)
jidrop > D’où vient cet
id
?Ou plus généralement : quel est ton code exact ?
Bonjour,
j’ai essayé mais rien ne fonctionne chez moi
quand j’exécute une boite de dialogue me demande « id » et ensuite il me dit l’action outputTo a été annulé erreur 2501
ensuite je n’ai aucun champs qui s »affiche dans le semblant de Pdf
Mon souci j’ai un état avec 158 pages et je veux faire un pdf par page qui pourrait m’aider SVP
PS je suis nul en programmation
Tom Edgerry > Content que ça marche 🙂
Et meilleurs voeux également !
Désolé pour ce message très tardif, mais je vous remercie pour votre aide.
Grâce à vous, j’ai pu réaliser ce que je voulais.
Je vous souhaite également une merveilleuse année 2010.
Tom Edgerry > Le plus pratique, j’imagine, serait que l’impression soit lancée du formulaire Clients ; on suppose que l’utilisateur est positionné sur le client concerné. On peut alors écrire quelque chose comme :
J’ai supposé que [NumClient] était de type Numérique.
Merci pour votre réponse, parce que là je sèche. Je n’ai jamais bien compris le traitement des états via pdf.
Effectivement, l’Etat est basé sur une requête qui contient le champ [NumClient] qui me permet d’imprimer l’état par client.
Je souhaiterai donc pouvoir l’enregistrer automatiquement, sous le numéro client.
Merci encore pour votre aide. 🙂
Tom Edgerry > Le problème est qu’au moment d’appeler
PrintAsPDF
, l’état n’est pas encore ouvert (fatalement :-)). Donc les informations qu’il contient ne sont pas disponibles.Par contre, j’imagine que le champ
[NumClient]
peut être lu ailleurs ? Sur un formulaire ouvert par exemple, ou dans une table ?Bonjour,
Avant tout, merci pour cette explication, cela me rend un grand service.
Par contre, pouvez-vous expliquer comment on pourrait changer le nom du ficher pdf, en fonction d’une valeur affiché dans l’état sélectionné.
Ex.: PrintAsPDF Environ(« USERPROFILE »)& « Documents » & [MonEtat].[NumClient] & ».pdf », « MonEtat », , True
Je souhaite que le nom du fichier pdf change, afin de ne pas écraser le précédent.
Merci d’avance pour votre aide.
🙂