Discussion: Enregistrement corrompu PDF [XL-2016]

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : juin 2017
    Messages : 5
    Points : 3
    Points
    3

    Par défaut Enregistrement corrompu PDF

    Bonjour,

    J'ai écrit une macro Excel il y a un petit moment déjà permettant d'enregistrer certains onglets d'un fichier Excel (choisi via une condition ) en PDF.
    Pour se faire, je passe par un xls temporaire.
    Cette macro fonctionnait jusqu'à vendredi.

    En effet, depuis cet instant, un pop-up s'ouvre et me dit que le xls temporaire, est ouvert et verrouillé.
    Si je continue, l'enregistrement PDF ne fonctionne plus, le fichier fait 2ko, et Foxit me dit que le fichier est corrompue

    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
     
    Application.DisplayAlerts = False
    Chemin = ActiveWorkbook.Path
    temp_wbk = "Liste.xls"
    Mois = Format(Sheets(1).Range("B8"), "mm")
    Annee = Year(Sheets(1).Range("B8"))
    Annee_Mois = Mois & "_" & Annee
     
            ' Definition du chemin du fichier xls temporaire
     
            dest = Chemin & "\Format\" & temp_wbk
            doc_pdf = Chemin & "\Format\Format_Papier_" & Annee_Mois & ".pdf"
     
     
            'Selection des feuilles a copier
     
            'On créer l'objet Excel
            Set xlApp = CreateObject("Excel.Application")
            'On défini le nombre d'onglets (ici 5)
            xlApp.SheetsInNewWorkbook = 5
            'On ajoute un classeur
            Set xlBook = xlApp.Workbooks.Add
            'On donne un nom au classeur
            xlBook.SaveAs (dest)
            'On rend le classeur visible
            xlApp.Visible = True
            'On créer l'objet onglet dans le nouveau classeur créé
            Set xlSheet = xlBook.Worksheets(1)
     
     
            Workbooks.Open (dest)
     
            ' Workbooks.Open Filename:= _
             '               dest, _
             '               ReadOnly:=True, _
             '               IgnoreReadOnlyRecommended:=True
     
            For c = 1 To nbFeuilles
                Specifique1 = Workbooks(Second_wbk).Worksheets(1).Cells(c + 1, 2).Value
                If Specifique1 = 1 Or Specifique1 = 0 Then
                    Workbooks(wbase).Worksheets(c).Copy Before:=Workbooks(temp_wbk).Worksheets(1)
                End If
            Next c
     
     
            'Sauvegarde en PDF
     
            Workbooks(temp_wbk).ExportAsFixedFormat Type:=xlTypePDF, _
                Filename:=doc_pdf, _
                Quality:=xlQualityStandard, _
                IncludeDocProperties:=True, _
                IgnorePrintAreas:=False, _
                OpenAfterPublish:=True
     
     
            'Fermeture et suppresion du XLS temporaire
     
            Application.DisplayAlerts = False
            xlBook.Close False
     
            Kill (dest)
            Workbooks(Second_wbk).Close False
    J'ai tout de même essayé de remplacer l'ouverture par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Workbooks.Open Filename:= _
                          dest, _
                          ReadOnly:=True, _
                          IgnoreReadOnlyRecommended:=True
    mais le pdf est toujours corrompu.

    Merci d'avance,
    Robin

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Inscrit en
    juillet 2007
    Messages
    12 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 12 301
    Points : 27 157
    Points
    27 157

    Par défaut

    Salut,

    en lisant ton code, voila ce que je constate.

    la tu enregistres ton classeur (sans le fermer ensuite), avec une extension xls au lieu de xlsx qui est l'extension standard

    et la tu essaies de reouvrir le meme classeur (toujours ouvert) => conflit fatal selon moi.



    donc solution a priori :
    - changer l'extension d'enregistrement
    - fermer le classeur une fois enregistre
    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    juin 2006
    Messages
    5 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : juin 2006
    Messages : 5 423
    Points : 14 001
    Points
    14 001

    Par défaut

    Salut, à voir ( si curieux ) sans savoir si cela pourra aider : Excel 2007 Fusion Feuilles de Classeurs en PDFs
    Pensez à Voter, d'avance merci. @+ Philippe
    Balisez votre code après l'avoir indenté sous Excel (< 2013) via Smart Indenter
    Autres utilitaires : MZ Tools 8.0 VBA , 7Zip et Antidote

    Liste des Contributions : Manipulations des PDF via Excel / Acrobat / PDFCreator / xPDF

  4. #4
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : juin 2017
    Messages : 5
    Points : 3
    Points
    3

    Par défaut

    Tout d'abord, merci à vous deux !

    Citation Envoyé par Jean-Philippe André Voir le message
    Salut,

    en lisant ton code, voila ce que je constate.

    la tu enregistres ton classeur (sans le fermer ensuite), avec une extension xls au lieu de xlsx qui est l'extension standard

    J'ai changé temp_wbk = "Liste.xls" par temp_wbk = "Liste.xlsx", je ne savais pas que cela avec un impact. ^^
    Pour la fermeture, là j'ai un gros doute, j'ai testé, x1Book.Close False et Workbooks(dest).Close False et aucun des deux ne me ferme le document, j'ai une erreur d’exécution :o



    et la tu essaies de reouvrir le meme classeur (toujours ouvert) => conflit fatal selon moi.

    J'ai essayé tout à l'heure de ne rien fermer et donc de ne pas ré-ouvrir mais ça ne fonctionne pas non plus.

    donc solution a priori :
    - changer l'extension d'enregistrement
    - fermer le classeur une fois enregistre

  5. #5
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Inscrit en
    juillet 2007
    Messages
    12 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Developpeur VBA migrant tranquillement vers C# et VB.Net =]
    Secteur : Finance

    Informations forums :
    Inscription : juillet 2007
    Messages : 12 301
    Points : 27 157
    Points
    27 157

    Par défaut

    POurquoi passer par une autre applicaiton Excel ?

    A quoi te sert ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set xlApp = CreateObject("Excel.Application")
            'On défini le nombre d'onglets (ici 5)
            xlApp.SheetsInNewWorkbook = 5
    Pas de question technique par MP, je ne réponds pas

    Apprendre à programmer avec Access 2016

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  6. #6
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : juin 2017
    Messages : 5
    Points : 3
    Points
    3

    Par défaut

    Citation Envoyé par Jean-Philippe André Voir le message
    POurquoi passer par une autre applicaiton Excel ?

    A quoi te sert ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set xlApp = CreateObject("Excel.Application")
            'On défini le nombre d'onglets (ici 5)
            xlApp.SheetsInNewWorkbook = 5

    J'ai fait ceci afin de créer le document xlsx temporaire. ( je me suis basé sur une explication de technet )
    Ceci dit, peut être qu'il y a d'autres manières de faire

    PS : J'ai pu aussi me fourvoyer sur l'utilité de cette manip'.

  7. #7
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    juillet 2012
    Messages
    4 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : juillet 2012
    Messages : 4 397
    Points : 8 404
    Points
    8 404
    Billets dans le blog
    5

    Par défaut

    Bonjour,

    nul besoin de créer un classeur temporaire, la méthode ExportAsFixedFormat étant capable de travailler sur une feuille directement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    For c = 1 To nbFeuilles
        Specifique1 = Workbooks(Second_wbk).Worksheets(1).Cells(c + 1, 2).Value
        If Specifique1 = 1 Or Specifique1 = 0 Then
            Workbooks(wbase).Worksheets(c).ExportAsFixedFormat Type:=xlTypePDF, _
                                                               Filename:=doc_pdf, _
                                                               Quality:=xlQualityStandard, _
                                                               IncludeDocProperties:=True, _
                                                               IgnorePrintAreas:=False, _
                                                               OpenAfterPublish:=True
        End If
    Next c
    Bien sûr, adapter le chemin d'enregistrement si besoin, et tout le reste

  8. #8
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : juin 2017
    Messages : 5
    Points : 3
    Points
    3

    Par défaut

    Citation Envoyé par joe.levrai Voir le message
    Bonjour,

    nul besoin de créer un classeur temporaire, la méthode ExportAsFixedFormat étant capable de travailler sur une feuille directement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    For c = 1 To nbFeuilles
        Specifique1 = Workbooks(Second_wbk).Worksheets(1).Cells(c + 1, 2).Value
        If Specifique1 = 1 Or Specifique1 = 0 Then
            Workbooks(wbase).Worksheets(c).ExportAsFixedFormat Type:=xlTypePDF, _
                                                               Filename:=doc_pdf, _
                                                               Quality:=xlQualityStandard, _
                                                               IncludeDocProperties:=True, _
                                                               IgnorePrintAreas:=False, _
                                                               OpenAfterPublish:=True
        End If
    Next c
    Bien sûr, adapter le chemin d'enregistrement si besoin, et tout le reste
    De cette manière, il va y avoir un pdf par onglet non ?

  9. #9
    Membre éclairé
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    décembre 2013
    Messages
    544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : décembre 2013
    Messages : 544
    Points : 737
    Points
    737

    Par défaut

    Bonjour
    ce que j'utilise pour enregistrer format PDF
    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
     
    sub enrPDF
    Dim Ar(8) As String
     
        Ar(0) = Feuil5.Name
        Ar(1) = Feuil3.Name
        Ar(2) = Feuil4.Name
        Ar(3) = Feuil7.Name
        Ar(4) = Feuil11.Name
        Ar(5) = Feuil8.Name
        Ar(6) = Feuil9.Name
        Ar(7) = Feuil10.Name
        Ar(8) = Feuil12.Name
     
     
        Application.ScreenUpdating = False
        Sheets(Ar).Select
     
        ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\" & "Rapport Mensuel avec résultat " & M _
            , Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
            :=False, OpenAfterPublish:=False
        Application.ScreenUpdating = True
     
    End Sub
    Bonne continuation
    n'est pas d'où vous venez qui compte, mais où vous allez.

  10. #10
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : juin 2017
    Messages : 5
    Points : 3
    Points
    3

    Par défaut

    Merci à tous !

    Après avoir eu une brève illumination, je me suis aperçu que parfois, le pdf généré peut être vide car le XLSX temporaire ne contient aucun onglet ( dû à la condition ).

    Le problème vient donc du fait qu'il essai quand même de l'enregistrer même si il n'y a rien > "Pdf Corrupted"

    Il faut donc que je trouve comment gérer ce cas de figure, et en option, trouver comment faire en sorte qu'Excel ne me demande pas si je veux ouvrir une copie en lecture seule ou notifier.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PHPExcel enregistrement fichier corrompu pdf xlsx
    Par bjo393 dans le forum Langage
    Réponses: 1
    Dernier message: 06/05/2013, 10h25
  2. Ouvrir, concaténer et enregistrer des pdf
    Par giaco dans le forum C++Builder
    Réponses: 11
    Dernier message: 03/05/2007, 12h07
  3. Réponses: 1
    Dernier message: 17/04/2007, 20h04
  4. [EZPDF] enregistrer mon .pdf sur le server
    Par lagag dans le forum EZPDF
    Réponses: 1
    Dernier message: 04/10/2006, 10h41
  5. [SGBD] FPDF+enregistrer le pdf généré dans BDD MySQL
    Par Flushovsky dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 29/11/2005, 16h22

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