Afficher un pdf dans un userform vba (SW 2016)

Bonjour,

Pour afficher un PDF sur une userform, j'ai trouvé deux principales solutions sur internet : l'ajout d'un contrôleur "Adobe PDF Reader" ou l'ajout d'un contrôleur "WebBrowser".

J’ai choisi la solution de l'ajout d'un contrôleur "Adobe PDF Reader", mais je n'arrive pas à la faire fonctionner. Voici la procédure que j'ai suivie :

  1. Installation d’Acrobat Reader DC
  2. Dans le VBA editor, sur la "Toolbox"  => clic droit sur le fond de ce toolbox  => "Additional Controls..."  => cocher "Adobe PDF Reader"

    => Quand je veux mettre le contrôleur "Adobe PDF Reader" sur l'userform j'ai un message d'erreur : "Élément introuvable."

 

=> Si quelqu'un à la bonne procédure et le code pour utiliser ce contrôleur "Adobe PDF Reader", ça m'aiderait beaucoup.

 

Merci de votre aide.

Bonjour,

Je n'ai pas ce problème en ajoutant le contrôle Adobe PDF Reader. De base il m'affiche une case vide, pour afficher le pdf: pdf1.loadfile "c:\xxxx" chemin du fichier.

Est-ce qu'adobe reader est correctement installé? Peut-être également un problème de version.

Bonjour,

Il y a une méthode assez simple pour insérer une image dans un Userform. Il faut que tu mettes une zone d'image dans ton Userform et ensuite que tu ailles dans la partie code et que tu implémente ceci : 

Image1.Picture = LoadPicture("C:\Users\bem1.DIMECOALIPRESSE\Desktop\TinyStraightMaster\coucou.jpg")

avec le chemin de ton image en format jpg.

J'espère t'avoir aidé, bonne chance.

Dimitri. 

1 « J'aime »

Finalement, après avoir fait de nombreux test, j'ai l’essai tomber la solution de l'ajout d'un contrôleur "Adobe PDF Reader" pour afficher un pdf dans une userform.

Je suis donc passé sur l'autre solution possible : l'ajout d'un contrôleur "WebBrowser"

J'y suis arrivé avec le code suivant :

Private Sub UserForm_Initialize()

Me.WebBrowser1.Navigate "about:blank"
Me.WebBrowser1.Document.write "<HTML><Body><embed src=""C:\xxxx\xxxxx\xxxxx\test 1.pdf"" width=""100%"" height=""100%"" /></Body></HTML>"

End Sub

 

Cette méthode m'affiche le pdf avec Adobe Acrobat Reader DC dans la userform, mais le problème qu'il me reste c'est qu’Adobe Acrobat Reader DC m'affiche toutes ses barres d'outils.

Je n'arrive pas à afficher le pdf automatiquement en pleine fenêtre/écran (sans les barres d'outils).

Quelqu'un aurait une solution pour ça ?

 

Hello,

J'ai réussi à trouver une solution, il faut passer des paramètres au document.

A la place de la ligne de code suivante:

Me.WebBrowser1.Document.write "<HTML><Body><embed src=""C:\xxxx\xxxxx\xxxxx\test 1.pdf"" width=""100%"" height=""100%"" /></Body></HTML>"

Met:

Me.WebBrowser1.Navigate "C:\xxx\xxx.PDF#pagemode=none"

C'est le #pagemode=none qui fait qu'on a que le document sans l'interface.

 

Tu as la liste des paramètres disponible ici: http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf

5 « J'aime »

Merci KVuilleumier !

Le code que tu proposes fonctionne, a quelque chose près (pour mon cas), je m'explique :

1. Les pdf que j'affiche ont des liens hypertextes qui affichent d'autres pdf,

2. J'ai choisi d'utiliser un "WebBrowser" pour sa navigation (WebBrowser1.GoBack/GoForward) qui me permet d'afficher les pdf suivant et précédant.

Du coup, quand je sélectionne un lien hypertexte le pdf qui s'affiche n'est pas en FullScreen, si j'actualise chaque affichage en ajoutant "#pagemode=none" au chemin du pdf affiché, c'est la navigation (WebBrowser1.GoBack/GoForward) qui ne fonctionne plus.

Ce que tu me proposes KVuilleumier est déjà un bon pas en avant, mais si j'arrive a avoir le FullScreen et la navigation GoBack/GoForward ce serait top.

Aurait-il un moyen d'affecter ce <pagemode=none> à l'afficheur (WebBrowser1) plutôt qu'au pdf à afficher ? (je n’y suis pas parvenu pour le moment)

 

Bonjour,

Possibilité de mettre le code pour tester?

2 « J'aime »

Je ne connais pas ton niveau en VBA, mais tu as toujours la possibilité d'écrire toi même la fonction GoBack et GoForward en mémorisant les liens (Grâve au événement du WebBrowser). Comme ça quand tu cliques sur un lien tu as la possibilité de rafraichir en ajoutant le pagemode et ensuite pour revenir en retour tu utilises ta fonction.

1 « J'aime »

Salut,

Cyril.f, je vais mettre du code pour que tu puisses tester.

KVuilleumier, c'est ce que j'ai fait : j'ai écrit moi même les fonctions GoBack et GoForward.

Par contre j'ai encore un problème d'affichage pour les liens hypertextes. Voici mon code :

Private Sub UserForm_Initialize()

     'J-affiche le 1ere PDF'
     WebBrowser1.Navigate "C:\xxx\xxx\test.PDF#pagemode=none"

End Sub

'------------------------------------------------------------------------------------'

Private Sub WebBrowser1_TitleChange(ByVal Text As String)

    'Si l-URL ne contient pas "#pagemode=none", je l-ajout et recharge la page'
    If Right(WebBrowser1.LocationURL, 14) <> "#pagemode=none" Then
        WebBrowser1.Navigate2 (WebBrowser1.LocationURL & "#pagemode=none")
    End If

End Sub

 

Quand je sélectionne mon lien hypertexte, un nouveau pdf s'affiche, mais pas en pleine fenêtre/écran.

Par contre, si après avoir affiché le nouveau pdf je Click sur un CommandButton qui lance un Refresh, le pdf ce mette en pleine fenêtre/écran.

Private Sub CommandButton1_Click()

    WebBrowser1.Refresh

End Sub

Du coup j'ai essayé de glisser un peu partout  ce WebBrowser1.Refresh, pour avoir un affichage plein fenêtre/écran sans à avoir à Cliker sur un bouton. Mais pas moyen, j'y suis pas y arrivé. 

Peut-être que j'utilise le mauvais événement du WebBrowser, mais je pense avoir à peu près tout testé.

Quelqu'un a une solution ?

 

Événement étrange :

Par rapport au code précédemment présenté, si j'ajout un WebBrowser1.Refresh dans l'événement du WebBrowser (juste avant le End If) ça ne fonctionne pas, mais si j'ajout aussi une Msgbox "ok" (juste avant le WebBrowser1.Refresh) ça fonctionne après avoir fermé la MsgBox.

Le code :

Private Sub UserForm_Initialize()

     'J-affiche le 1ere PDF'
     WebBrowser1.Navigate "C:\xxx\xxx\test.PDF#pagemode=none"

End Sub

'------------------------------------------------------------------------------------'

Private Sub WebBrowser1_TitleChange(ByVal Text As String)

    'Si l-URL ne contient pas "#pagemode=none", je l-ajout et recharge la page'
    If Right(WebBrowser1.LocationURL, 14) <> "#pagemode=none" Then
        WebBrowser1.Navigate2 (WebBrowser1.LocationURL & "#pagemode=none")
        MsgBox "ok"
        WebBrowser1.Refresh    
    End If

End Sub

 Très étrange non ?

Bonjour,

Plutôt que d'afficher le pdf puis de vérifier si il est en plein écran pourquoi ne fais-tu pas ton test avant de l'afficher ?

Dim Adresse As String
    
Adresse = "C:\xxx\xxx\test.PDF"
    
If Right(Adresse, 14) <> "#pagemode=none" Then
   Adresse = (Adresse & "#pagemode=none")
End If
    
WebBrowser1.Navigate Adresse

Cordialement,

Salut,

d.roger, je suis d'accord avoir toi, ce serait top si j'arrivai à faire ça, mais dans mon cas, je n’y suis pas parvenue.

Rappelle de mon cas: j'affiche un 1ere PDF en plein écran (pas de problème pour l'instant). Ce PDF a des liens hypertextes qui affichent d'autres PDF(s), et c'est en Clickant sur ses liens hypertextes que je n'arrive pas à afficher les nouveaux PDF(s) en plein écran.

Dans ce que tu proposes (si j'ai bien compris), il faudrait que j'arrive à stopper la redirection du WebBrowser1.Navigate quand je click sur le lien hypertexte tout en récupérant le chemin que renvoi le lien hypertexte pour le modifier (lui ajouter "#pagemode=none") et relancer WebBrowser1.Navigate avec le nouveau chemin modifié.

Si tu sais faire ça, partage ton code STP.

 

Bonjour,

Je ne connais pas suffisament ce type de contrôle et n'ai malheureusement pas de code à te proposer, Il me faudrait le code de tes fonctions GoBack et GoForward pour voir ...

Par contre, pour ce qui est de ton " Événement étrange " il n'est pas si étrange que ça, tu cherche à raffraichir ta page avant la fin du chargement de celle-ci, ton Msgbox "ok" (juste avant le WebBrowser1.Refresh) sert de tempo, remplace le par :

While WebBrowser1.ReadyState <> READYSTATE_COMPLETE Or WebBrowser1.Busy = True
    DoEvents
Wend

Cela permet d'attende la fin du chargement de la page avant de raffraichir.

Cordialement,

3 « J'aime »

Merci d.roger,

C'est ce qu'il me manquait, sauf que dans mon code la boucle en While/Wend génère une erreur, alors j'ai utilisé une boucle en Do Until/Loop :

Do Until WebBrowser1.ReadyState = READYSTATE_COMPLETE Or WebBrowser1.Busy = False
   DoEvents
Loop

 

Bonjour,

Pour éviter l'erreur sur la boucle While, tu pouvais aussi mettre seulement :

While WebBrowser1.Busy = True
    DoEvents
Wend

pour l'ouverture des fichier PDF locaux et :

While WebBrowser1.ReadyState <> READYSTATE_COMPLETE
    DoEvents
Wend

pour l'affichage des pages internet si nécessaire, pages qu'il vaut mieux interdire dans ta macro sauf si toutes les sécurités liées à la navigation sur internet sont prises.

Pour test, Je te joins aussi un bout de macro qui te permet d'afficher un PDF dans un controle "Adobe PDF Reader" correspondant à ta demande initiale, il faut l'éditer et changer la ligne LoadPDF "C:\xxx\xxx.PDF#pagemode=none", 1 pour mettre le chemin de ton fichier PDF.

Cordialement,


macroadobepdfreader.swp