Imprimer des PDF depuis Excel sur une autre imprimante que celle par défaut

Bonjour, après plusieurs recherche je n'arrive pas a faire fonctionner correctement ma macro

Le but est d'imprimer des fichiers PDF depuis une imprimante autre que celle par défaut.

J'ai 2 problèmes, le premier est que pour chaque fichier à imprimer, j'ai une fenêtre qui s'ouvre me disant que le fichier peut être dangereux, etc..., malgrès le Application.DisplayAlerts = False. Est-il mal placé?

Le second est que j'ai bien une fenêtre qui me demande sur quelle fenêtre je souhaite imprimer mais l'impression se fait quand même sur l'imprimante par défaut et non sur celle choisi. Existe t-il une solution à ce problème?

Dans mon exemple il n'y qu'un fichier mais je peux fournir la macro complète si besoin

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String _
, ByVal lpParameters As String, ByVal lpDirectory As String _
, ByVal nShowCmd As Long) As Long

Sub PrintTest()

Application.DisplayAlerts = False

If MsgBox("Êtes-vous sûr de vouloir imprimer les notices de montage?", vbQuestion + vbYesNo, "Impression des notices de montage") = vbYes Then

    Dim ws As Worksheet
    Dim Chemin As String
    Dim NomFichier As String
    Dim Notice As String

    Set ws = Sheets("Notice de montage")
    Chemin = "\\SRV-SVL\Production\BE\Etude\Tunnel\Notice tunnel\"
    NomFichier = ws.Range("AE9") & ".pdf"
    Notice = Chemin & NomFichier

    Application.Dialogs(xlDialogPrinterSetup).Show

    ShellExecute FindWindow("XLMAIN", Application.Caption), "print", Notice, "", "", 1

Else
End If

Application.DisplayAlerts = True

End Sub

Je ne maîtrise pas du tout les macros mais j'ai déjà réussi à faire ça.

Merci d'avance pour votre aide

Bonjour Garenne,

Pour un export PDF, et si tu es bien en version 2007, je te propose plutôt que tu charges le complément de microsoft :

Tu gagneras en simplicité...

Bonjour,

merci pour votre réponse mais je ne cherche pas à exporter mon fichier en PFD mais à imprimer des fichiers PDF déjà présent sur le serveur grâce à une liste excel.

En gros j'ai sur une feuille excel une liste de nom (chaque nom correspond à un chapitre de notice de montage) qui se met à jour en fonction d'option choisi précédemment dans le tableau excel. une fois cette liste à jour, je souhaite imprimer la notice de montage complète (donc chacun des chapitre utile), en sachant quelle peut-être imprimer depuis plusieurs poste différent.

J'ai également trouvé la macro suivante mais je n'arrive pas a trouver la bonne codification pour 'définir l'imprimante voulu par défaut

 '--------------------------------------------------------------------------------
   'Trouver le nom de l'imprimante voulu en fonction du nom de l'ordinateur
   '--------------------------------------------------------------------------------
            Dim Nom_du_PC As String
            Nom_du_PC = Environ$("computername")
            Dim Imprimante_voulu As String
                  'Imprimante voulu associée à "COMPUTERNAME"
                    Select Case [Nom_du_PC]
                Case "PC-DAO"
                    Imprimante_voulu = "Copieur couleur"
                Case "ASSISTANTE-COMM"
                    Imprimante_voulu = "Copieur-Fax"
                End Select
'---------------------------------------------------------------------------------------
'  Basculer l'imprimante par défaut à l'imprimante voulu et retour après impression
'---------------------------------------------------------------------------------------

        Dim Imprimant_origine As String
        Imprimant_origine = Application.ActivePrinter 'Obtenir l'imprimante par défaut
        Set Application.Printer = "Imprimante_voulu"  'Définir l'imprimante voulu par défaut

Si quelqu'un a une solution ou une autre idée je suis preneur ^^'

Bonjour Garenne,

J'ai répondu un peu rapidement, en effet,...

Je regarde mieux et te donne des nouvelles ASAP.

il faut voir le nom de ton imprimente, par exemple si elle est locale:

 Set Application.ActivePrinter = "HP4650" 'Imprimente locale HP 4650

ou bien réseau

Set Application.ActivePrinter = "\\HP5000\10.21.13.44" 'imprimente réseau

Bonjour,

Le problème est que tu n'imprimes pas ton PDF à partir de l'application Excel mais à partir de l'application PDF(Adode Acrobat Reader ou autre) appelée par l'instruction :

ShellExecute FindWindow("XLMAIN", Application.Caption), "print", Notice, "", "", 1

Tout paramétrage de l'imprimante Excel ne servira donc strictement à rien.

Une solution simple pourrait être d'ouvrir le PDF via l'application Word et d'y paramétrer l'imprimante.

Une autre solution est d'utiliser le contrôle ActiveX Adobe Reader : "AcroPDF" sous réserve d'être en Excel 32 bits.

Bonjour Garenne,

J'ai répondu un peu rapidement, en effet,...

Je regarde mieux et te donne des nouvelles ASAP.

Pas de soucis

il faut voir le nom de ton imprimente, par exemple si elle est locale:

 Set Application.ActivePrinter = "HP4650" 'Imprimente locale HP 4650

ou bien réseau

Set Application.ActivePrinter = "\\HP5000\10.21.13.44" 'imprimente réseau

J'ai essayé plus fois avec différente imprimante (réseau et local) avec différente façon de faire que j'ai pu voir sur la toile (avec Set et sans Set) mais j'ai toujours un message d'erreur qui s'affiche:

Avec Set :

Erreur de compilation: Utilisation incorrecte de la propriété (avec ".ActivePrinter =" de surligné en jaune)

Sans Set :

Erreur d'exécution '1004': La méthode 'ActivePrinter' de l'objet '_Application' a échoué

J'ai donc essayé avec Option Explicit mais du coup c'est FindWindow qui pose problème :/

Il d'oit y avoir une subtilité que je n'ai pas saisi

Bonjour,

Le problème est que tu n'imprimes pas ton PDF à partir de l'application Excel mais à partir de l'application PDF(Adode Acrobat Reader ou autre) appelée par l'instruction :

ShellExecute FindWindow("XLMAIN", Application.Caption), "print", Notice, "", "", 1

Tout paramétrage de l'imprimante Excel ne servira donc strictement à rien.

Une solution simple pourrait être d'ouvrir le PDF via l'application Word et d'y paramétrer l'imprimante.

Une autre solution est d'utiliser le contrôle ActiveX Adobe Reader : "AcroPDF" sous réserve d'être en Excel 32 bits.

Ça répond à la question que je viens juste de poser ^^' du coup je suis bien en 32 bits mais je ne connait pas du tout le contrôle ActiveX adobe Reader. Je regarde et si je ne trouve pas je te redemanderai.

Merci en tout cas.

Bonjour,

Si vous voulez utiliser l'ActiveX Adobe,: AcroPDF le plus simple est de le créer dans la feuille de votre choix.

Exemple de code à placer dans une feuille:

Sub créa_contrôle_PDF()
    'création du contrôle
    Set pdf = Me.OLEObjects.Add(ClassType:="AcroPDF.PDF.1", Link:=False, DisplayAsIcon:=True, Left:=40, Top:=40, Width:=40, Height:=40)
    'assignation du contrôle
    Set AcroPDF1 = pdf.Object
    'chargement du fichier associé au contrôle
    AcroPDF1.LoadFile (notice)
    'impression du fichier avec boîte de dialogue
    AcroPDF1.printWithDialog
End Sub

Nb: La dernière instruction d'impression avec boîte de dialogue ne fonctionne pas sur ma version 64 bits mais elle devrait fonctionner sur votre fonction 32 bits.

Merci pour ton tuyau parce que là j'ai strictement rien compris à ce que j'ai trouvé pour l'instant

J'ai intégré ton code mais ça me met une erreur sur le "Me" de "pdf = Me.OLEObjects.Add"

Ensuite, si j'ai bien interprété la fin du code, il faudra que je charge tout mes fichiers avec d'ouvrir la boite de dialogue sinon il faudra que je fasse intervenir la boite de dialogue pour chaque fichier, c'est bien ça?

J'ai intégré ton code mais ça me met une erreur sur le "Me" de "pdf = Me.OLEObjects.Add"

Me représente la feuille.

Si tu as une erreur, cela veut dire que tu n'as pas placé le code dans la feuille mais dans un module. Alors, il faut remplacer Me par Sheets(nom_feuille).

Ensuite, si j'ai bien interprété la fin du code, il faudra que je charge tout mes fichiers avec d'ouvrir la boite de dialogue sinon il faudra que je fasse intervenir la boite de dialogue pour chaque fichier, c'est bien ça?

Tu ne peux charger qu'un fichier à la fois. Maintenant il est possible que le changement d'imprimante ne doive être effectué qu'une seule fois.

Ca fait exactement ce que je souhaitai par contre ça n'as marché qu'une fois

A chaque fois que je lance la macro ça me créer un objet AcroPDF1 puis AcroPDF2 etc... j'ai réussi a les supprimer mais malgrès ça le fichier se charge mais la boite de dialogue ne s'ouvre pas.

Si je lance la macro et qu'ensuite j'active le mode création puis le désactive, la boite de dialogue s'affiche.

Par contre je ne sais plus si j'avais réussi avec le bonton activeX ou avec le bouton normal.

Sub PrintTest2()

If MsgBox("Êtes-vous sûr de vouloir imprimer les notices de montage?", vbQuestion + vbYesNo, "Impression des notices de montage") = vbYes Then

    Dim ws As Worksheet
    Dim Chemin As String
    Dim NomFichier As String
    Dim Notice As String

    Set ws = Sheets("Notice de montage")
    Chemin = "\\SRV-SVL\Production\BE\Etude\Tunnel\Notice tunnel\"
    NomFichier = ws.Range("AF10") & ".pdf"
    Notice = Chemin & NomFichier

    'création du contrôle
    Set pdf = Sheets("Notice de montage").OLEObjects.Add(ClassType:="AcroPDF.PDF.1", Link:=False, DisplayAsIcon:=True, Left:=40, Top:=40, Width:=40, Height:=40)
    'assignation du contrôle
    Set AcroPDF1 = pdf.Object
    'chargement du fichier associé au contrôle
    AcroPDF1.LoadFile (Notice)
    'impression du fichier avec boîte de dialogue
    AcroPDF1.printWithDialog

Else

End If

End Sub

C'est bon j'ai rajouté un changement de feuille puis une retour sur la feuille de lancement de macro et ça fonctionne

Le seul bémol c'est qu'il faut sélectionner l'imprimante pour chaque document mais ça reste acceptable pour ce qu'il y a à faire.

Je te remercie grandement car j'aurai jamais réussi à faire ça tout seul

Je partage le code complet si ça peut servir à quelqu'un

Encore merci et bonne continuation

'Début de la macro
Private Sub CommandButton1_Click()

'Message pour confirmer ou non la volonté d'imprimer la notice de montage
If MsgBox("Êtes-vous sûr de vouloir imprimer les notices de montage?", vbQuestion + vbYesNo, "Impression des notices de montage") = vbYes Then
'Si vous acceptez l'impression

    'Definition de la feuille avec les données à utiliser
    Dim ws As Worksheet
    Set ws = Sheets("Notice de montage")

    'Definition du chemin sur le serveur à utiliser
    Dim Chemin As String
    Chemin = "\\SRV-SVL\Production\BE\Etude\Tunnel\Notice tunnel\"

    'Definition du nom du premier fichier à utiliser
    Dim NomFichier1 As String
    NomFichier1 = ws.Range("AF10") & ".pdf"
    'Definition du nom complet du premier fichier à utiliser
    Dim Notice1 As String
    Notice1 = Chemin & NomFichier1

    'Definition du nom du second fichier à utiliser
    Dim NomFichier2 As String
    NomFichier2 = ws.Range("AF11") & ".pdf"
    'Definition du nom complet du second fichier à utiliser
    Dim Notice2 As String
    Notice2 = Chemin & NomFichier2

    'Création du contrôle
    Set pdf = Me.OLEObjects.Add(ClassType:="AcroPDF.PDF.1", Link:=False, DisplayAsIcon:=True, Left:=40, Top:=40, Width:=40, Height:=40)
    'assignation du contrôle
    Set AcroPDF1 = pdf.Object
    'chargement du premier fichier
    AcroPDF1.LoadFile (Notice1)
    'Ouverture de la boite de dialogue pour l'impression du premier fichier (en réaliter l'ouverture se fera après les changements de feuille mais je ne sais pas pourquoi)
    AcroPDF1.printWithDialog

    'Création du contrôle
    Set pdf = Me.OLEObjects.Add(ClassType:="AcroPDF.PDF.1", Link:=False, DisplayAsIcon:=True, Left:=40, Top:=40, Width:=40, Height:=40)
    'assignation du contrôle
    Set AcroPDF2 = pdf.Object
    'chargement du second fichier
    AcroPDF2.LoadFile (Notice2)
    'Ouverture de la boite de dialogue pour l'impression du second fichier (idem que pour le premier fichier)
    AcroPDF2.printWithDialog

    'Changement de feuille puis retour sur la feuille en cours pour provoquer l'ouverture de la boite de dialogue
    Sheets("Notice de montage").Select    'Peux importe la feuille tant que ce n'est pas celle sur laquelle vous avez lancé la macro
    Sheets("Fiche de renseignement").Select    'Feuille sur laquelle j'ai lancé la macro

'Fin de la fonction d'acceptation de l'impression
Else
'Si vous refusez l'impression

Super qu'au final tu aies réussi à faire bien fonctionner ce contrôle ActiveX.

Rechercher des sujets similaires à "imprimer pdf imprimante que celle defaut"