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 :

  1. 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).
  2. A lancer la conversion PDF ensuite (par le DoCmd.OutputTo vu dans cet article).
  3. En général, on ferme l’état ensuite, c’est le résultat PDF qui nous intéresse.
Info
Si vous utilisez 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 :

La procédure VBA reçoit plusieurs paramètres, dont les 2 premiers sont obligatoires. Dans l’ordre :

  1. Le chemin complet du fichier PDF à créer.
  2. Le nom de l’état à convertir en PDF.
  3. Le filtre éventuel, si vous souhaitez n’imprimer qu’une partie des données.
  4. 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) :

Vous pouvez paramétrer le chemin du fichier PDF en fonction de l’utilisateur, à l’aide de la fonction Environ() :

Exemple 2

Pour imprimer seulement les clients dont le nom contient la lettre 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 :

Vous aimerez aussi...

15 réponses

  1. Fabrice Adjanor dit :

    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

  2. Pascal dit :

    Je me trop elle est de type texte

    • Hervé Inisan dit :

      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 :

  3. Pascal dit :

    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

  4. Hervé Inisan dit :

    jidrop > D’où vient cet id ?

    Ou plus généralement : quel est ton code exact ?

  5. jidrop dit :

    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

  6. Hervé Inisan dit :

    Tom Edgerry > Content que ça marche 🙂

    Et meilleurs voeux également !

  7. Tom Edgerry dit :

    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.

  8. Hervé Inisan dit :

    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.

  9. Tom Edgerry dit :

    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. 🙂

  10. Hervé Inisan dit :

    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 ?

  11. Tom Edgerry dit :

    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.
    🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *