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 :

Impression pdf automatique - VBA


Sujet :

VBA Access

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut Impression pdf automatique - VBA
    Bonjour,

    j'ai écrit un programme qui me permet d'éditer l'ensemble des rapports pdf d'une application pour archivage à long terme
    globalement, le programme fonctionne mais pour une raison que je ne comprends, il "saute" certains rapports de la liste

    pour l'impression pdf j'utilise une fonction que j'ai légèrement adapté pour mes besoins
    en fait les pdf sont générés et enregistrés automatiquement UseAutosave=1.
    Pourtant, sur quelques pdf, la boite de dialogue demandant l'enregistrement s'ouvre malgré tout et je pense que c'est ce qui fait que certain pdf passent à la trappe

    je vois dans le code qu'il y a des périodes de temporisation, peut-être que c'est sur çà qu'il faut jouer
    ceci étant, j'ai plusieurs séries de près de 100000 pdf à créer donc je serais plutôt tenter de réduire les temps de temporisation car c'est extrêmement long...

    d'avance merci pour vos conseils...

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    Option Compare Database
    Option Explicit
     
    ' Ne pas oublier de cocher la bibliothèqe PDFCreator
    ' dans le menu Outils / Références de Visual Basic Editor
     
    ' API Windows pour faire une temporisation en millisecondes
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
     
    ' Constantes pour les temporisations
    Private Const maxTime = 10    ' en secondes
    Private Const sleepTime = 250 ' en millisecondes
     
    ' ---
    ' IMPRESSION D'UN ETAT EN PDF
    ' ---
    ' Entrée : strReportName <- Nom de l'état à imprimer en PDF
    '          strWhere      <- Clause WHERE filtrant l'état (facultatif)
    '          strPDFName    <- Nom du fichier PDF à générer (facultatif)
    '          strDirectory  <- Chemin de stockage du fichier PDF (facultatif) -> (J LE CARROU - 03/07/2019) nom du dms passé en 4ème argument
    '
    Public Sub SaveAsPDF( _
      ByVal strReportName As String, _
      Optional ByVal strWhere As String = "", _
      Optional ByVal strPDFName As String = "", _
      Optional ByVal strDirectory As String = "")
     
      ' Quelques variables...
      Dim pdfc As PDFCreator.clsPDFCreator
      Dim DefaultPrinter As String
      Dim c As Long
      Dim OutputFilename As String
      Dim dms As String
     
     
      ' Instancier un nouvel objet PDFCreator
      Set pdfc = New clsPDFCreator
     
     ' Paramétrer l'objet PDFCreator
      With pdfc
        .cStart "/NoProcessingAtStartup"
        .cOption("UseAutosave") = 1
        .cOption("UseAutosaveDirectory") = 1
     
        ' Chemin de destination
        ' Par défaut : dossier 'Mes documents' de l'utilisateur
        If strDirectory = "" Then
            strDirectory = Environ("USERPROFILE") & "\Mes documents"
        Else
            strDirectory = "C:\Documents and Settings\t2lecajer\Mes documents\exportPDF\" & strDirectory
            'Debug.Print "Nom du dossier : " & strDirectory
        End If
        .cOption("AutosaveDirectory") = strDirectory
     
        ' Nom du fichier PDF à générer
        .cOption("AutosaveFilename") = _
          IIf(strPDFName = "", strReportName, strPDFName)
            'Debug.Print "Nom du fichier à imprimer : " & strPDFName
     
        ' Format de sauvegarde (0 = PDF)
        .cOption("AutosaveFormat") = 0
     
        ' Mémoriser l'imprimante par défaut
        ' et définir PDFCreator à la place
        DefaultPrinter = .cDefaultPrinter
        .cDefaultPrinter = "PDFCreator"
        .cClearCache
     
        ' Imprimer l'état
        DoCmd.OpenReport strReportName, acViewNormal, , strWhere
        .cPrinterStop = False
      End With
     
      ' Temporisation
      c = 0
      Do While (pdfc.cOutputFilename = "") And (c < (maxTime * 1000 / sleepTime))
        c = c + 1
        Sleep 200
      Loop
     
      ' Nom du fichier PDF produit
      Debug.Print pdfc.cOutputFilename
      OutputFilename = pdfc.cOutputFilename
     
      ' Réinstaller l'imprimante d'origine
      With pdfc
        .cDefaultPrinter = DefaultPrinter
        Sleep 200
        .cClose
      End With
     
      ' Attendre jusqu'à ce que PDFCreator soit supprimé de la mémoire
      Sleep 2000
     
      ' Vérifier si le fichier a été créé
      'If OutputFilename = "" Then
      ' MsgBox "Création du fichier PDF." & vbCrLf & vbCrLf & _
      '    "Une erreur s'est produite : temps écoulé !", vbExclamation + vbSystemModal
      'End If
    End Sub

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    Bonjour,

    Avec quelle version travailles-tu ?

    Depuis Acc2007 tu peux directement produire ton etat en PDF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     DoCmd.OutputTo acOutputReport, sRpt.Name, acFormatPDF, sOutputFileName, False
    CDLT
    "Always look at the bright side of life." Monty Python.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    merci pour ton message
    je travaille avec Access 97...

  4. #4
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 670
    Points : 2 489
    Points
    2 489
    Par défaut
    Toutes les instructions de temporisation peuvent être remplacées par la commande Cette commande permet de marquer une pause le temps que le système termine les tâches précédentes.
    Je ne pense pas que vous ayez besoin d'ouvrir un rapport avant de l'imprimer; ça accroît inutilement le temps d'exécution; Cette ligne peut être mise en commentaire (à essayer):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenReport strReportName, acViewNormal, , strWhere

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    Bonjour
    merci Zekraoui_Jakani pour ta réponse

    j'ai donc remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    'c = 0
      'Do While (pdfc.cOutputFilename = "") And (c < (maxTime * 1000 / sleepTime))
      '  c = c + 1
      '  Sleep 200
      'Loop
    par
    et çà ne fonctionne pas car la fenêtre demandant l'enregistrement s'ouvre susyématiquement

    Par ailleurs, si je commente la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DoCmd.OpenReport strReportName, acViewNormal, , strWhere
    le pdf ne s'imprime pas

  6. #6
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    j'ai plusieurs séries de près de 100000 pdf à créer ...
    Ca vaudrait surement le coup d'essayer une version plus récente que ton ACC97. Au moins pour ton archivage ...
    Essaie Access2010 ou plus récent.

    CDLT
    "Always look at the bright side of life." Monty Python.

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonjour,

    Citation Envoyé par OZ1977
    je vois dans le code qu'il y a des périodes de temporisation, peut-être que c'est sur çà qu'il faut jouer
    ceci étant, j'ai plusieurs séries de près de 100000 pdf à créer donc je serais plutôt tenter de réduire les temps de temporisation car c'est extrêmement long...
    Citation Envoyé par Zekraoui_Jakani
    Toutes les instructions de temporisation peuvent être remplacées par la commande
    je ne suis pas du tout de l'avis de Zekraoui_Jakani, cette temporisation a été mise volontairement et il ne faut pas la modifier: un DoEvents ne sait pas temporiser pendant 2 secondes comme en lignes 96 et 97:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Attendre jusqu'à ce que PDFCreator soit supprimé de la mémoire
      Sleep 2000
    Je pense plutôt que cette procédure a ses limites car elle fonctionne de manière asynchrone (d'où les temporisations) et n'est certainement pas prévue pour imprimer 100 000 pdf (c'est quand même énorme ! ), même en plusieurs fois.

    A moins de "tailler" les séries d'édition en plus petites quantités, je ne vois pas comment résoudre le problème, sauf passer par une autre méthode, parce que quand même, 100 000, ce n'est pas rien: cela peut faire quand même plusieurs dizaines d'heures de traitement ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  8. #8
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    merci pour vos réponses
    quelle(s) autre(s) méthode(s) tu suggérerais ?

  9. #9
    Membre émérite Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 670
    Points : 2 489
    Points
    2 489
    Par défaut
    J'ai lu trop vite; Tee_Grandbois a raison! problème à méditer encore ....

  10. #10
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    quelle(s) autre(s) méthode(s) tu suggérerais ?
    je n'en ai pas à proposer, mais clairement ce code n'a pas été prévu pour des impressions de gros volume.
    Peut-être faut-il revoir la procédure de mise en archives, passer par un professionnel compétent (perle rare) ou prendre son mal en patience car de toute façon, au vu du volume, ce sera long...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  11. #11
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    je suis en stage mais je suis censé être le professionnel compétent (ou le devenir...) ; )

    si je reviens au problème initial (en dehors du temps mis) c'est le fait que certains fichiers ne sont ps imprimés car la boite de dialogue demandant l'enregistrement s'ouvre
    une idée pour régler ce problème ou du moins identifier la cause ?

  12. #12
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    dans ce cas, regarde si le nom du fichier à créer est conforme à la règle de nommage et qu'il ne contient pas les caractères non autorisés dans Windows:

    Nom : Win_caractères_interdits.JPG
Affichages : 691
Taille : 15,2 Ko
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  13. #13
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    je suis en stage mais je suis censé être le professionnel compétent (ou le devenir...)
    et, évidemment, tu n'est pas chapeauté par quelqu'un qui a plus d'expérience, histoire de vérifier que tu ne fais pas de bourdes ou simplement si le code est conforme ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  14. #14
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    disons que je suis parti sur cette stratégie et mon responsable semble penser qu'il n'y a pas beaucoup d'alternatives
    j'ai testé mon programme sur des 'lots' plus faibles et tout fonctionnait parfaitement

    ce n'est que quand j'ai lancé de gros volumes que j'ai levé ce bugg...

  15. #15
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    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 648
    Points : 14 626
    Points
    14 626
    Par défaut
    j'ai testé mon programme sur des 'lots' plus faibles et tout fonctionnait parfaitement

    ce n'est que quand j'ai lancé de gros volumes que j'ai levé ce bugg...
    qui confirme ce que je disais précédemment
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  16. #16
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    bonjour

    les noms de fichiers sont tous formatés de la même façon
    j'ai regardé les fichiers sur lesquels il y a eu un 'échappement' : il n'y a pas de caractère spécial et je ne vois rien de particulier

    comment est-ce que je peux capturer l'évènement 'ouverture' de la boite de dialogue lorsqu'elle se produit ?
    je me dis que je peux forcer la fermeture et ainsi 'perdre' moins d'impression
    en fin de traitement, je relancerai ceux qui me manque...

  17. #17
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    est-ce les fichiers qui ne sont pas produits en PDF ont des caractéristiques spéciales ?
    sont-ce des petits fichiers ? des très gros fichiers ?
    se trouvent-ils après un petit fichier ? après un gros fichier ?
    "Always look at the bright side of life." Monty Python.

  18. #18
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    je vais faire une analyse plus détaillée mais à première vue, les fichiers ont à peu près la même taille (12-24 Ko)

    EDIT

    j'ai refais des tests en relançant à partir du premier fichier qui a 'échappé'
    j'ai reproduis le bugg à plusieurs reprises en ne lançant que ce fichier
    le problème c'est que le bugg n'est pas reproductible à chaque fois

    j'ai déroulé la procédure SaveAsPDF pas à pas en comparant 2 fichiers (un qui produit (parfois) l'erreur et un autre qui ne produit pas l'erreur) mais je ne constate aucune différence
    j'ai donc simplifié au maximum la procédure SaveAsPDF en ne mettant que des paramètres obligatoires pour voir si lorsque je vais relancer sur de gros volumes je peux éviter cette erreur

    au passage, si je compare ces fichiers en termes de volume

    fichier qui bugg
    ------------------
    20176Ko
    20480Ko--espace sur le disque dur

    fichier qui ne bugg pas
    ------------------
    21024Ko
    24576Ko --espace sur le disque dur



    dans tous les cas ce n'est pas satisfaisant, il faut que j'identifie la source de l'erreur donc j'espère avoir d'autres conseils...

  19. #19
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    nouveau bugg à mon retour ce matin...
    bugg PDF Creator !

    j'ai relancé et çà visiblement çà fonctionne !

    Nom : erreur_PDFCreator.png
Affichages : 643
Taille : 13,7 Ko

Discussions similaires

  1. Impression pdf et VBA
    Par tom0ne dans le forum VBA Word
    Réponses: 39
    Dernier message: 07/01/2012, 23h04
  2. Impression PDF automatique
    Par tom0ne dans le forum VBA Word
    Réponses: 8
    Dernier message: 14/12/2011, 07h13
  3. [XL-2007] Impression pdf automatique
    Par essais dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/03/2011, 08h12
  4. Impression PDF en VBA
    Par divayg dans le forum Général VBA
    Réponses: 0
    Dernier message: 27/11/2009, 13h24
  5. impression PDF automatique
    Par dirtsa dans le forum VBA Word
    Réponses: 20
    Dernier message: 05/02/2008, 11h28

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