Macro enregistrement en PDF : ouverture dans Onedrive en ligne au lieu d'Ad

Bonjour,

J'utilise depuis des années une macro pour enregistrer un fichier Excel en PDF, macro qui permet de normaliser le nom du fichier PDF ainsi créé.

Malheureusement, depuis quelques temps, la macro ne donne plus le résultat escompté lorsque le fichier Excel est situé dans le dossier Onedrive du PC. (Aucun problème en revanche lorsqu'il est situé dans une zone à l'extérieur du dossier Onedrive).

Au lieu de s'ouvrir dans Adobe Reader, le fichier PDF essaie de s'ouvrir dans le navigateur en ligne dans Onedrive, ET affiche une erreur. Sur mon poste, le message d'erreur dit :

"Désolé... Nous avons rencontré un problème. Echec de l'affichage inconnu. Cet élément a peut-être été supprimé, il a expiré ou vous n'êtes pas autorisé à l'afficher. Pour plus d'informations, contactez son propriétaire"

... alors que c'est moi-même qui ai créé ce fichier et sa macro !!

Sur le poste d'un de mes collaborateurs, le message d'erreur dit :

"Réessayer plus tard. Nous ne sommes pas en mesure de vous connecter pour l'instant. Réessayez ultérieurement".

... alors qu'il est parfaitement connecté à Onedrive si on ouvre un autre onglet du navigateur.

Ma macro est la suivante :

Sub Enregistre_devis_pdf_dossier_local_v2()
Dim LePath As String
LePath = ThisWorkbook.Path & "\"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
LePath & Range("initiale_prenom").Value & "-" & Range("nom_minuscule").Value & "-devis-" & Range("intitule_devis").Value & "-nomentreprise-" & Range("numero_devis_abrege").Value, Quality:= _
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
OpenAfterPublish:=True
End Sub

Y aurait-il une ligne de code supplémentaire à ajouter pour que le fichier s'ouvre dans Adobe Reader (et non dans le navigateur internet).

Etant entendu qu'Adobe Reader est bien l'application par défaut pour les fichiers .pdf

Je n'arrive pas à déterminer si le problème vient de ma macro ou de Onedrive. J'essaie donc par ailleurs d'obtenir de l'aide chez Microsoft, mais j'ai besoin d'éliminer le lien de causalité avec le code ma macro. Et comme je ne suis pas très fortiche, je me suis tournée vers vous, les contributeur de ce forum, qui m'avez appris le peu que je sais en la matière.

Merci d'avance pour votre aide.

Hello,

Essaie ça, ça force la non ouverture dans l'explorateur :

OpenAfterPublish:=False

et force l'ouverture dans acrobat reader via une ligne de commande :

 Shell "cmd /c start acrord32 """ & CheminComplet & """", vbHide
Sub Enregistre_devis_pdf_dossier_local_v2()
    Dim LePath As String
    Dim NomFichier As String
    Dim CheminComplet As String

    LePath = ThisWorkbook.Path & "\"
    NomFichier = Range("initiale_prenom").Value & "-" & Range("nom_minuscule").Value & "-devis-" & _
                 Range("intitule_devis").Value & "-nomentreprise-" & Range("numero_devis_abrege").Value & ".pdf"
    CheminComplet = LePath & NomFichier

    ' Exporter le PDF sans l’ouvrir
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=CheminComplet, Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False

    ' Attendre un court instant que le fichier soit bien créé
    Application.Wait Now + TimeValue("0:00:03")

    ' Lancer Adobe Reader pour ouvrir le PDF
    Shell "cmd /c start acrord32 """ & CheminComplet & """", vbHide
End Sub

Le timer sert pour la synchronisation OneDrive

@+

Bonjour @BAROUTE78, et merci pour ce code.

J'ai juste dû remplacer 'acrord32' par 'Acrobat' pour qu'elle fonctionne.

Enfin pas vraiment...

... car si ça m'ouvre bien Acrobat, j'ai en revanche une fenêtre d'erreur dans Acrobat qui dit :

"Une erreur est survenue lors de l'ouverture de ce document. La syntaxe du nom de fichier, de répertoire ou de volume est incorrecte".

Pourtant, quand je regarde dans le dossier de test où j'avais enregistré le tableur, je vois bien un fichier PDF, qui me semble tout-à-fait correctement nommé. Mais au droit de sa ligne, dans la colonne statut de mon explorateur, je vois aussi le petit nuage de Onedrive, indiquant que le fichier n'est présent qu'en ligne.

J'ai donc cliqué sur le nom du fichier pour l'ouvrir : le statut a changé pour passer à la coche verte, et le PDF (irréprochable) s'est ouvert.

Mais pourquoi mon système s'obstine-t-il ainsi à enregistrer le PDF en ligne plutôt que localement ? Là je me suis souvenue d'une case à cocher dans les options d'Excel (j'ai changé de PC il y a peu de temps), à la rubrique Enregistrement : toujours enregistrer sur l'ordinateur. Je l'ai cochée. Puis j'ai relancé Excel.

Mais rien à faire, rebelote avec l'erreur citée plus haut (à propos de la syntaxe), rebelote avec le (satané) nuage ...

Il y aurait donc un "truc" à modifier pour qu'Adobe ne refuse pas ainsi d'ouvrir le PDF généré (qui, je le répète, s'ouvre parfaitement bien si je l'ouvre manuellement). Je ne suis pas experte, mais je pense que ce qui fait planter l'ouverture dans Adobe, c'est que le fichier n'existe pas réellement sur mon PC tant que je ne clique pas dessus. Malgré l'option cochée dans les options d'enregistrement...

Une autre idée ?

PS: question subsidiaire, pour ma culture personnelle: les triples puis quadruples guillemets dans la dernière ligne de code, j'imagine que c'est voulu ?

Hello,

Essaie d’allonger le timer et de le passer à 10 secondes peut être sinon je ne saurai dire pourquoi ça veut pas. Je sais que one drive pose pas mal de soucis la dessus.

Pour les guillemets c’est simple :

Pour te donner un exemple simplifié la commande à exécuter serait comme ça :

cmd /c start acrord32 "C:\Users\Nom\Documents\fichier.pdf"

Le point c’est que VBA pour l’interpréter doit mettre des guillemets après le Shell

Donc ça donnerait ça en rajoutant une guillemet au début et une à la fin :

Shell "cmd /c start acrord32 "C:\Users\Nom\Documents\fichier.pdf""

Sauf que pour interpréter correctement les cuillers étant donné que c’est l’opérateur pour une chaîne de texte tu peux insérer une guillemet en en mettant trois à la suite.

D’où la syntaxe correcte

Shell "cmd /c start acrord32 """C:\Users\Nom\Documents\fichier.pdf""""

Tu as la première guillemet avant le cmd pour ouvrir la chaîne à interpréter qui se referme avec la quatrième guillemet à la fin. Reste les 2 triples guillemets qui permettent juste d’avoir une guillemet interprétable.

J’espère que c’est clair

@+

Bonjour,

Alors, en rallongeant le timer à 10 secondes, ça ne change rien au schmilblick. Le fichier est généré, mais en ligne (nuage dans la colonne statut), comme la fois précédente. Adobe Reader s'ouvre, mais affiche toujours l'erreur :

Une erreur est survenue lors de l'ouverture de ce document. La syntaxe du nom de fichier, de répertoire ou de volume est incorrecte

Souviens-toi que dans ton code, j'ai remplacé acrord32 par Acrobat : est-ce que c'est ça qui pose problème ?
Si oui, puisque que acrord32 ne fonctionne pas non plus, par quoi devrais-je remplacer ce terme ? (j'ai un système 64 bits si ça change quelque chose).
Comment identifier le nom exact d'Acrobat Reader sur ma machine ? Dans mon gestionnaire de tâche, à l'onglet Processus, j'aperçois furtivement la ligne Acrobat.exe avant qu'elle soit remplacée par la formulation Adobe Acrobat.

J'ai aussi posé la question sur le forum Microsoft (puisqu'il n'y a pas moyen de solliciter le support technique, heureusement qu'on peut compter sur la communauté).

On m'y propose une modification de la macro pour forcer l'ouverture d'Acrobat Reader avec la ligne suivante :

Shell "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe """ & PDFFile & """", vbNormalFocus

J'ai tenté, sait-on jamais ! J'ai réussi à lancer la macro après avoir indiqué le chemin de mon Acrobat.exe*... et remplacé PDFFile par CheminComplet mais bien que le fichier PDF soit généré (toujours avec le statut nuage / en ligne), la macro échoue à l'ouverture du PDF la même erreur que dans ta formulation (syntaxe nom fichier, répertoire ou volume incorrecte).

*Mon chemin pour Acrobat serait le suivant :

"C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe"

Je préfère d'ailleurs (sans aucune considération de codage, je n'y comprends pas vraiment grand chose) ta formulation, car elle me parait pouvoir plus facilement être transposée sur tous les PC de mon équipe, quel que soit le dossier dans lequel Acrobat Reader est installé.

Bon enfin, tout ça ne change rien au refus du système d'utiliser le logiciel Adobe pour ouvrir les PDF, ni à la tyrannie de Onedrive qui s'obstine à enregistrer les fichiers en ligne au lieu de les enregistrer sur mon PC.

Il y avait autrefois une option, située dans les paramètres avancés de Onedrive, qu'il fallait désactiver pour empêcher ainsi Onedrive de prendre les manettes. C'était l'option "Utiliser les applications Office pour synchroniser les fichiers Office que j'ouvre".
Mais cette option a disparu (ou a si bien changé de place que je n'arrive pas à la retrouver).

Aurais-tu une idée de ce côté-là ? (bien qu'on s'éloigne d'Excel)

Merci encore pour ton aide.

--

PS: c'est quand même dingo. Quand je fais les choses "à la main", en enregistrant manuellement le ficher en PDF, il s'enregistre bien localement sur mon PC et s'ouvre sagement dans Acrobat. Il n'y a que lorsque je recours à une macro que l'enregistrement PDF se fait en ligne et me pose tous ces problèmes...

--

Je reproduis ici le début de la réponse sur la communauté Microsoft, ça te donnera peut-être des idées :

Voici pourquoi cela se produit :

Intégration de OneDrive avec les applications Office peut rediriger le fichier ouvert vers le navigateur, en particulier si le fichier est marqué comme synchronisé avec le cloud immédiatement après sa création.

La OpenAfterPublish:=True commande de votre macro s’appuie sur l’association de fichiers Windows par défaut. Si OneDrive intercepte le chemin d’accès au fichier, il peut l’écraser et tenter d’ouvrir le fichier en ligne.

Synchronisation de l’accès aux fichiers : OneDrive peut toujours synchroniser le fichier lorsque la macro tente de l’ouvrir, ce qui entraîne l’échec du navigateur avec l’autorisation ou des erreurs de disponibilité.

Hello,

On a déjà mis le paramètre à False lors de l’export.

C’est juste des dingueries OneDrive.

Peut être à tester avec un enregistrement en local de manière temporaire puis on copie le fichier sur le one drive comme ça, en théorie, pas de souci de fichier dans le nuage je ne sais où

À tester :

Sub EnregistrerDevisPDF_Stable_SansNettoyage()
    Dim NomFichier As String
    Dim CheminTempPDF As String
    Dim DossierTemp As String
    Dim CheminFinalPDF As String
    Dim CheminDossierFinal As String

    ' Construire le nom du fichier à partir des cellules
    NomFichier = Range("initiale_prenom").Value & "-" & _
                 Range("nom_minuscule").Value & "-devis-" & _
                 Range("intitule_devis").Value & "-nomentreprise-" & _
                 Range("numero_devis_abrege").Value & ".pdf"

    ' dossier temporaire en local
    DossierTemp = Environ("TEMP") & "\"
    CheminTempPDF = DossierTemp & NomFichier

    ' Exporter PDF dans dossier temp
    On Error GoTo ErreurExport
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=CheminTempPDF, Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False

    ' Attendre brièvement que le fichier soit bien enregistré
    Application.Wait Now + TimeValue("0:00:03")

    ' Ouvrir le PDF avec l'application par défaut (Adobe Reader si configuré)
    Shell "cmd /c start """" """ & CheminTempPDF & """", vbHide

    ' Dossier du fichier Excel
    CheminDossierFinal = ThisWorkbook.Path & "\"
    CheminFinalPDF = CheminDossierFinal & NomFichier

    ' Copie le PDF du dossier temp vers le dossier classeur
    FileCopy CheminTempPDF, CheminFinalPDF

    Exit Sub

ErreurExport:
    MsgBox "Une erreur est survenue lors de l'enregistrement du PDF." & vbCrLf & _
           "Erreur : " & Err.Description, vbCritical
End Sub

On y croit, en théorie ça ouvre le pdf avec l’appli par défaut

@+

Bonjour,

Alors, oui, bravo, ça ouvre bien le fichier PDF dans Adobe Acrobat
(le fichier situé dans le dossier C:\Users\moi\AppData\Local\Temp )

En revanche, ça ne copie pas le PDF dans le dossier où se trouve le fichier Excel.

Et bizarrement, ça m'affiche aussi une fenêtre d'erreur dans Excel :

Une erreur est survenue lors de l'enregistrement du PDF.

Erreur : Nom ou numéro du fichier incorrect.

Moi pas comprendre....

Merci encore pour ton aide.

Hello,

Est ce qu'il pourrait y avoir des caractères spéciaux dans le nom du fichier du style ":", "/" etc ?

Essaie ça et dis moi ce que tu as dans le message d'erreur au niveau du nom du fichier

Sub EnregistrerDevisPDF_Stable_Diagnostic()
    Dim NomFichier As String
    Dim CheminTempPDF As String
    Dim DossierTemp As String
    Dim CheminFinalPDF As String
    Dim CheminDossierFinal As String

    On Error GoTo ErreurGenerale

    ' Construire le nom du fichier à partir des cellules
    NomFichier = Range("initiale_prenom").Value & "-" & _
                 Range("nom_minuscule").Value & "-devis-" & _
                 Range("intitule_devis").Value & "-nomentreprise-" & _
                 Range("numero_devis_abrege").Value & ".pdf"

    ' Définir le dossier temporaire (local)
    DossierTemp = Environ("TEMP") & "\"
    CheminTempPDF = DossierTemp & NomFichier

    ' Exporter le PDF dans le dossier temporaire
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=CheminTempPDF, Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False

    ' Attendre brièvement que le fichier soit bien enregistré
    Application.Wait Now + TimeValue("0:00:03")

    ' Ouvrir le PDF avec l'application par défaut
    Shell "cmd /c start """" """ & CheminTempPDF & """", vbHide

    ' Définir le dossier final (même dossier que le classeur Excel)
    CheminDossierFinal = ThisWorkbook.Path & "\"
    CheminFinalPDF = CheminDossierFinal & NomFichier

    ' Afficher le chemin cible avant copie
    Debug.Print "Copie vers : " & CheminFinalPDF

    ' Copier le fichier dans le dossier du classeur
    FileCopy CheminTempPDF, CheminFinalPDF

    MsgBox "Le fichier PDF a été enregistré dans :" & vbCrLf & CheminFinalPDF, vbInformation
    Exit Sub

ErreurGenerale:
    MsgBox "Une erreur est survenue :" & vbCrLf & _
           "Description : " & Err.Description & vbCrLf & _
           "Nom du fichier : " & NomFichier, vbCritical
End Sub

@+

Rebonjour,

L'erreur dans Excel affiche :

Une erreur est survenue :

Description : Nom ou numéro de fichier incorrect

Nom du fichier :

j-dupont-devis-objet1-nomentreprise-12019.pdf

Cependant le PDF s'ouvre correctement.

Et je ne vois pas ce qui gêne dans le nom du fichier.

Aurais-je dû adapter quelque chose dans le code de la macro pour l'emplacement du dossier contenant le .xlsm ?

Hello,

Arffff.... Encore une subtilité je pense dans le nom du chemin onedrive

Essaie ça mais je commence à être à court d'idée là ... C'est une méthode de déplacement du fichier sans les particularités de la copie

Sub EnregistrerDevisPDF_DeplacementFiable()
    Dim NomFichier As String
    Dim CheminTempPDF As String
    Dim DossierTemp As String
    Dim CheminFinalPDF As String
    Dim CheminDossierFinal As String

    On Error GoTo ErreurGenerale

    ' Construire le nom du fichier à partir des cellules
    NomFichier = Range("initiale_prenom").Value & "-" & _
                 Range("nom_minuscule").Value & "-devis-" & _
                 Range("intitule_devis").Value & "-nomentreprise-" & _
                 Range("numero_devis_abrege").Value & ".pdf"

    ' Dossier temporaire (toujours local, hors OneDrive)
    DossierTemp = Environ("TEMP") & "\"
    CheminTempPDF = DossierTemp & NomFichier

    ' Créer le PDF dans le dossier temporaire
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=CheminTempPDF, Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False

    ' Attente de sécurité
    Application.Wait Now + TimeValue("0:00:03")

    ' Ouvrir le PDF dans l'application par défaut
    Shell "cmd /c start """" """ & CheminTempPDF & """", vbHide

    ' Définir le dossier de destination (même dossier que le classeur)
    CheminDossierFinal = ThisWorkbook.Path & "\"
    CheminFinalPDF = CheminDossierFinal & NomFichier

    ' Déplacer le fichier depuis TEMP vers le dossier Excel
    Name CheminTempPDF As CheminFinalPDF

    MsgBox "Le PDF a été enregistré ici :" & vbCrLf & CheminFinalPDF, vbInformation
    Exit Sub

ErreurGenerale:
    MsgBox "Une erreur est survenue :" & vbCrLf & _
           "Description : " & Err.Description & vbCrLf & _
           "Nom du fichier : " & NomFichier, vbCritical
End Sub

La ligne Name ... As ... déplace un fichier d’un chemin à un autre, comme si tu le faisais manuellement dans l’explorateur Windows

@+

Alors, voici ce que je m'apprêtais à te répondre :

Je suis vraiment désolée, mais le résultat est le même que ta précédente proposition :

  • le PDF s'ouvre bien dans Acrobat (depuis le dossier temp)
  • mais la copie de ne se fait pas dans le dossier où se trouve le fichier Excel
  • j'ai toujours le message d'erreur dans Excel (Fichier introuvable), malgré un nom de fichier irréprochable (aucune caractère spéciaux ni accent)

Pourtant le chemin du dossier Onedrive n'a rien de saugrenu (D:\OneDrive\Documents\PROSPECTS\Q-T\test).

Je ne veux pas abuser de ta patience, déjà mise à rude épreuve et je t'en remercie sincèrement.

J'en reviens à ma vieille version qui enregistre le fichier au bon endroit, mais qui oblige à aller dans l'explorateur pour cliquer sur le nom du fichier et ainsi provoquer son rapatriement "en dur" sur le PC et dans la foulée son ouverture (dans Acrobat).

Je te remercie encore vivement des trésors d'ingéniosité que tu as déployés, mais je crois que face à Onedrive, on sera toujours perdants.

...

et puis je me suis rappelée que j'avais aussi une conversation en cours sur le forum de la communauté Microsoft.

Là-bas, on m'a conseillé un truc que j'avais sans doute omis (suite à mon changement tout récent de PC) :

Configurez le dossier pour qu’il conserve toujours les fichiers localement

La solution de contournement la plus efficace consiste à s’assurer que le dossier OneDrive contenant votre fichier Excel est toujours disponible hors connexion. Cela permet à la macro d’ouvrir le PDF directement dans Adobe Reader sans délai.

Escalier:

Ouvrez l’Explorateur de fichiers et localisez le dossier OneDrive dans lequel votre fichier Excel est enregistré.

Faites un clic droit sur le dossier et sélectionnez « Toujours conserver sur cet appareil ».

📌 Résultat attendu : Cela garantit que tous les fichiers, y compris les PDF nouvellement créés, sont stockés localement et peuvent être ouverts immédiatement.

Alors, la synchronisation est encore en cours (j'ai des milliers de fichiers depuis 2008, et ils n'étaient plus conservés localement depuis ce changement de PC). A bien y réfléchir, j'aurais d'ailleurs pu conserver les vieilleries en ligne uniquement... je suis allée un peu vite en besogne, mais ce n'est pas grave.

Demain matin je refais un test sur ta macro (TES macros : peut-être que du coup les premières pourront fonctionner), et je reviens te faire le compte-rendu des opérations.

D'ici là, bonne soirée !

Rechercher des sujets similaires à "macro enregistrement pdf ouverture onedrive ligne lieu"