IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Créer plusieurs PDF à partir d’un état


Sujet :

VBA Access

  1. #1
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 126
    Points : 49
    Points
    49
    Par défaut Créer plusieurs PDF à partir d’un état
    Bonjour à tous,

    J'ai une BDD Access qui me permettait de sortir des attestations fiscales chaque année pour des clients en partant d'un état que j'imprimais dans la foulée ce qui ne me posait aucun problème puisque je les envoyais par courrier.
    Aujourd'hui, je voudrais pouvoir créer plusieurs PDF à partir d’un état pour les envoyer par mail.

    J'ai donc trouver ce bout de code sur internet en me disant "C'est juste ce qu'il me faut..." (ci-dessous l'original) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
    ' ---
    ' CREATION DE FICHES PDF
    ' ---
    '
    Sub CreerFichesInterlocuteurs()
        Dim strFichier As String
        Dim strFichierPDF As String
        Dim strEtat As String
        Dim strFiltre As String
        Dim rst As dao.Recordset
     
        ' Nom de l'état à imprimer
        strEtat = "rpt Personnes"
     
        ' Nom de base du fichier PDF à créer
        strFichier = DossierSpecial(Bureau) & "TestInterlocuteur {0} - {1} {2}.pdf"
     
        ' Ouvrir la liste des personnes
        Set rst = CurrentDb.OpenRecordset("tbl Destinataires", dbOpenSnapshot)
     
        ' Parcourir toute la liste
        While Not rst.EOF
            ' Le nom du fichier varie en fonction de la personne
            strFichierPDF = StringFormat(strFichier, _
                Format(rst("id"), "000"), _
                rst("Nom"), _
                rst("Prénom"))
     
            ' Construire le filtre
            strFiltre = "[id] = " & rst("id")
     
            ' Imprimer l'état en le filtrant sur la personne concernée
            PrintAsPDF strFichierPDF, strEtat, strFiltre
     
            ' Personne suivante
            rst.MoveNext
        Wend
     
        ' Terminé !
        rst.Close
        Set rst = Nothing
        MsgBox "Opération terminée !", vbInformation
    End Sub
    que j'ai tenté d'adapter à ma base (modifié ci-dessous) mais j'ai un message d'erreur...

    Erreur de compilation :
    Sub ou fonction non définie

    Nom : message erreur.PNG
Affichages : 1661
Taille : 32,6 Ko

    Auriez-vous une idée ?

    D'avance merci

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    bonjour,
    je pense que StringFormat n'est pas une fonction intégrée dans Access mais une fonction créée par un utilisateur.
    Sur le site de Developpez, on en parle ici

  3. #3
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 126
    Points : 49
    Points
    49
    Par défaut
    Bonjour tee_grandbois,

    N'ayant pas de grandes connaissances dans les codes, je t'avoue que tu m'as perdu. J'ai bien lu ce que tu m'indiques mais je n'ai pas trouvé ce que je cherchais.
    Aurais-tu une solution ?

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    bonjour,
    N'ayant pas de grandes connaissances dans les codes, je t'avoue que tu m'as perdu
    tu as pourtant bien réussi à copier la première procédure CreerFichesInterlocuteurs ?
    Cela ne me semblait pourtant pas compliqué: il fallait ajouter la procédure ci-dessous dans un module standard car elle est manquante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function StringFormat( _
      ByVal strChaine As String, _
      ParamArray varValeurs() As Variant) As String
     
      Dim intI As Integer
      For intI = LBound(varValeurs) To UBound(varValeurs)
        strChaine = Replace(strChaine, "{" & intI & "}", Nz(varValeurs(intI)))
      Next
     
      StringFormat = strChaine
    End Function

  5. #5
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 126
    Points : 49
    Points
    49
    Par défaut
    Bonsoir tee_grandbois,

    Vous allez sûrement me prendre pour une bille mais maintenant j'ai un autre message me demandant de créer une macro.

    Que dois-je mettre dedans ?

    Nom : message erreur 2.PNG
Affichages : 1576
Taille : 75,5 Ko

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    bonsoir,
    Vous allez sûrement me prendre pour une bille
    pas du tout
    mais maintenant j'ai un autre message me demandant de créer une macro
    (re) pas du tout d'ailleurs, le bouton "Créer" est seul bouton inactif.
    Tu as du appuyer sur la flèche verte pour exécuter une procédure tout en étant hors d'une procédure. C'est pour cela que VBA t'ouvre la fenêtre des procédures existantes: soit tu choisis la procédure à exécuter et tu cliques sur le bouton "Exécuter" si tu veux le faire, soit tu appuies sur "Annuler".
    Mais en général, on utilise l'évènement "Sur clic" d'un bouton de formulaire pour exécuter une procédure.
    Et n'oublie pas d'ajouter la procédure manquante StringFormat().

  7. #7
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 126
    Points : 49
    Points
    49
    Par défaut
    Bonsoir,

    Pour ce qui est de la procédure StringFormat(), j'ai fait comme tu m'as dit.
    Par contre rebelote, un nouveau message...

    Nom : message erreur 3.PNG
Affichages : 1574
Taille : 56,4 Ko

  8. #8
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    ajoute cette (dernière) procédure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub PrintAsPDF( _
      ByVal strFichierPDF As String, _
      ByVal strEtat As String, _
      Optional ByVal strWhere As String = "", _
      Optional ByVal blnOpenReader As Boolean = False)
     
      ' Ouvrir l'état en mode caché
      DoCmd.OpenReport strEtat, acViewPreview, strFiltre, _
        strWhere, acHidden
     
      ' Imprimer en PDF
        DoCmd.OutputTo acOutputReport, strEtat, acFormatPDF, strFichierPDF, blnOpenReader
     
      ' Refermer l'état
      DoCmd.Close acReport, strEtat
    End Sub

  9. #9
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 126
    Points : 49
    Points
    49
    Par défaut
    Merci tee_grandbois de répondre à mes questions...

    J'ai encore un message qui j'espère sera le dernier puisqu'on arrive au bout du code et qui m'amène à te poser d'autres questions :
    - Quand tu me dis de rajouter du code, c'est bien en dehors du code principal ?
    - Quel nom dois-je donner à ces bouts de codes ?

    Comment as-tu appris tout ça ? Aurais-tu des lectures à me conseiller pour apprendre ?

    Merci d'avance

    Nom : message erreur 4.PNG
Affichages : 1513
Taille : 55,6 Ko

  10. #10
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    bonjour,
    CreerFichesInterlocuteurs() est une Sub, pas une fonction, donc il faut la terminer avec l'instruction End Sub et pas End Function

  11. #11
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    - Quand tu me dis de rajouter du code, c'est bien en dehors du code principal ?
    non, tu peux mettre tout le code dans un seul module:

    Nom : _0.JPG
Affichages : 1574
Taille : 96,4 Ko
    - Quel nom dois-je donner à ces bouts de codes ?
    ils ont déjà un nom
    Comment as-tu appris tout ça ?
    j'ai été développeur pendant 30 ans
    Aurais-tu des lectures à me conseiller pour apprendre ?
    commence déjà par les tutoriels du forum, dont les bases du VBA

  12. #12
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 126
    Points : 49
    Points
    49
    Par défaut
    Bonjour tee_grandbois,

    Nous y sommes presque...
    Il ne me reste plus qu'à cibler la bonne requête...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rst = CurrentDb.OpenRecordset("tbl Destinataires", dbOpenSnapshot)
    Dans ce code, il fait appel à une table or moi, je veux qu'il sélectionne une requête "ATTESTATION FISCALE ANNUELLE".
    J'ai essayé requete, requête, req, rq mais rien n'y fait.
    Et une dernière question, si je voulais faire évoluer mon état avec une page supplémentaire, quel paramètre dois-je modifier pour créer le fichier PDf à 2 pages.

    Je vais suivre tes conseils sur les différents tutos,
    en tout cas merci pour ta précieuse aide qui sans toi je n'aurais pas abouti.

    J'espère un jour vous être d'une utilité.
    Bonne journée

  13. #13
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    bonjour,
    J'ai essayé requete, requête, req, rq mais rien n'y fait.
    où donc ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rst = CurrentDb.OpenRecordset("ATTESTATION FISCALE ANNUELLE", dbOpenSnapshot)
    Et une dernière question, si je voulais faire évoluer mon état avec une page supplémentaire, quel paramètre dois-je modifier pour créer le fichier PDf à 2 pages.
    (Joker )

  14. #14
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 126
    Points : 49
    Points
    49
    Par défaut
    Ca ne fonctionne pas...
    J'ai un message d'erreur : "trop peu de paramètres. 1 attendu"

    Nom : message.PNG
Affichages : 1593
Taille : 51,2 Ko


    Par contre,j'ai testé sur une table et ça fonctionne...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rst = CurrentDb.OpenRecordset("table IDENTITES", dbOpenSnapshot)

  15. #15
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 817
    Points : 14 911
    Points
    14 911
    Par défaut
    Par contre,j'ai testé sur une table et ça fonctionne...
    la syntaxe n'est pas en cause, c'est le contenu de la requête qui ne va pas: il contient un paramètre, comme l'indique le message d'erreur 3061.
    Il faudrait poster la requête.

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Merci pour le code et les explications
    Au final j'ai adapté à mes besoins et mon code est le suivant.
    Comme j'ai galéré pour comprendre ce que j'ai fait, j'imagine que ça peut être utile à d'autres personnes d'avoir une autre code avec un autre exemple ( c'est ce qui m'aide moi)
    Un grand grand merci a garavous et tee_grandbois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    '------------------------------------------------------------------
    Sub PrintAsPDF(ByVal strFichierPDF As String, ByVal strEtat As String, Optional ByVal strWhere As String = "", Optional ByVal blnOpenReader As Boolean = False)
     
      ' Ouvrir l'état en mode caché
      DoCmd.OpenReport strEtat, acViewPreview, strFiltre, strWhere, acHidden
     
      ' Imprimer en PDF
        DoCmd.OutputTo acOutputReport, strEtat, acFormatPDF, strFichierPDF, blnOpenReader
     
      ' Refermer l'état
      DoCmd.Close acReport, strEtat
    End Sub
    '------------------------------------------------------------------
    Function StringFormat(ByVal strChaine As String, ParamArray varValeurs() As Variant) As String
     'Permet de définir la forme du nom de fichier pour le publipostage
      Dim intI As Integer
      For intI = LBound(varValeurs) To UBound(varValeurs)
        strChaine = Replace(strChaine, "{" & intI & "}", Nz(varValeurs(intI)))
      Next
     
      StringFormat = strChaine
    End Function
     
     '------------------------------------------------------------------
    ' ---
    ' CREATION DE FICHES PDF
    ' ---
    '
    Sub CreerFichesExpoPersonnelPDF()
        Dim strFichier As String
        Dim strFichierPDF As String
        Dim strEtat As String
        Dim strFiltre As String
        Dim rst As dao.Recordset
     
        ' Nom de l'état à imprimer
        strEtat = "E-FicheExpoProdChimPourPersonnelPublipostageMail"
     
        ' Nom de base du fichier PDF à créer
        strFichier = "\\SocieteMAchine\09-Risque chimique\01- Fiches d'exposition\Fiches exposition 2021\" & "Fiche Expo 2021 - {0} - {1} {2}.pdf"
     
     
        ' Ouvrir la liste des personnes
        Set rst = CurrentDb.OpenRecordset("R-ListeDestinatairesPourPublipostageMail", dbOpenSnapshot)
     
        ' Parcourir toute la liste
        While Not rst.EOF
            ' Le nom du fichier varie en fonction de la personne
            strFichierPDF = StringFormat(strFichier, Format(rst("Matricule num"), "000"), rst("nom"), rst("Prenom"))
     
            ' Construire le filtre
            strFiltre = "[Matricule num] = " & rst("Matricule num")
     
            ' Imprimer l'état en le filtrant sur la personne concernée
            PrintAsPDF strFichierPDF, strEtat, strFiltre
     
            ' Personne suivante
            rst.MoveNext
        Wend
     
        ' Terminé !
        rst.Close
        Set rst = Nothing
        MsgBox "Opération terminée !", vbInformation
    End Sub

Discussions similaires

  1. Créer un PDF à partir de plusieurs fichiers
    Par Oscar02 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 15/04/2019, 14h55
  2. [AC-2016] Créer plusieurs PDF à partir d’un état Access
    Par Emi1988 dans le forum Access
    Réponses: 4
    Dernier message: 04/07/2018, 15h17
  3. [Imagick] Créer un pdf à partir de plusieurs images de dimensions différentes
    Par Garra dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 12/10/2011, 19h31
  4. Créer plusieurs colonnes à partir d’une seule
    Par jeje22 dans le forum Access
    Réponses: 5
    Dernier message: 12/09/2006, 16h31
  5. créer un pdf à partir d'un formulaire
    Par PrinceMaster77 dans le forum ASP
    Réponses: 4
    Dernier message: 04/05/2006, 22h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo