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

Macros et VBA Excel Discussion :

Enregistrement corrompu PDF [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juin 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2017
    Messages : 7
    Points : 4
    Points
    4
    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
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 261
    Points
    34 261
    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
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    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
    6 132
    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 : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, à voir ( si curieux ) sans savoir si cela pourra aider : Excel 2007 Fusion Feuilles de Classeurs en PDFs

  4. #4
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juin 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2017
    Messages : 7
    Points : 4
    Points
    4
    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
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 261
    Points
    34 261
    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
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    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
    Technicien réseau
    Inscrit en
    Juin 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2017
    Messages : 7
    Points : 4
    Points
    4
    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
    5 073
    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 : 5 073
    Points : 9 853
    Points
    9 853
    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
    Technicien réseau
    Inscrit en
    Juin 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2017
    Messages : 7
    Points : 4
    Points
    4
    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
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 914
    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 : 2 914
    Points : 5 121
    Points
    5 121
    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
    --------------------------------------------------------------*****----------------------------------------------------------------------------
    Bonne Continuation & Plein Succès
    Notre seul pouvoir véritable consiste à aider autrui avec modestie
    ______________________________________________________
    Pour dire merci, cliquer sur et quand la discussion est résolue, penser à cliquer sur le bouton

  10. #10
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juin 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2017
    Messages : 7
    Points : 4
    Points
    4
    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. [FPDF] problème de titre avec fpdf et enregistrement du pdf créé
    Par tiger63 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 17/04/2007, 20h04
  4. [ezPDF] Enregistrer mon .pdf sur le server
    Par lagag dans le forum Bibliothèques et frameworks
    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