Impression papier d'une liste de fichier (pdf) avec choix imprimante

Bonjour,

VB me permettant d'imprimer une liste de fichier pdf.

Je bloque sur le choix de l'imprimante et le retour à l'imprimante par défaut.

Voici le code:

Sub imprimer()

Dim FichierAImprimer As Variant
Dim Imprimante As String
Dim ImprimanteInitiale As String
Dim i As Integer

ImprimanteInitiale = "\\10.156.20.138\Konica Minolta Secure"
Imprimante = Cells(2, 5)

CreateObject("WScript.Network").SetDefaultPrinter Imprimante

For i = 5 To Range("H4")

    FichierAImprimer = Cells(i, 5)

    CreateObject("Shell.Application").Namespace(0).ParseName(FichierAImprimer).InvokeVerb ("Print")

Next i

CreateObject("WScript.Network").SetDefaultPrinter ImprimanteInitiale

MsgBox ("IMPRESSION TERMINE")

End Sub

Merci de votre aide

En fait j'arrive à modifier l'imprimante windows par defaut mais je n'arrive pas remettre l'imprimante d'origine ensuite

Bonjour,

Essayez ceci, à adapter

Sub Impression()
    ImprimanteParDefaut = ActivePrinter 'on enregistre le nom de l'imprimante d'origine
    Application.ActivePrinter =  '**** METTRE ICI LA NOUVELLE IMPRIMANTE ****

    ' ****** CODE POUR IMPRIMER *****************

    Application.ActivePrinter = ImprimanteParDefaut
End Sub

ACDlt

Bonjour,

Merci de votre réponse. Mais ça ne résout pas mon pb.

Je ne veux pas "imprimer une feuille excel en modifier l'imprimante par defaut d'excel" mais je veux "imprimer en papier à partir d'excel, une liste de fichier .pdf présent dans un répertoire Windows sur imprimante de mon choix, puis revenir à l'imprimante initiale".

je n'ai fait que répondre à votre dernier message:

"En fait j'arrive à modifier l'imprimante windows par defaut mais je n'arrive pas remettre l'imprimante d'origine ensuite."

C'est bien ce que j'ai proposé, non!

Bonjour,

Je me suis mal exprimé. Je parle de modifier l'imprimante par défaut de Windows pas celle d'Excel.

La fonction "Application.ActivePrinter" modifie uniquement celle d'Excel pour l'impression de feuille Excel.

Je souhaite imprimer un fichier fichier en papier depuis Excel.

La fonction "CreateObject("WScript.Network").SetDefaultPrinter <NOMDELIMPRIMANTE>" permet de modifier l'imprimante par défaut de Windows.

Mais je ne sais pas comment:

- Récupérer le nom de l'imprimante initiale pour la remettre en fin programme.

Bonjour à tous,

Voici un essai d'adaptation du code de départ qui me semble correct d'après ce que j'ai compris de la méthode. Le seul problème est éventuellement le fait de saisir le chemin au lieu du nom :

Sub imprimer()

dim t, prNorm$, prTemp$, i&

prNorm$ = "Konica Minolta Secure"
prTemp$ = Cells(2, 5)

with CreateObject("WScript.Network")
    .SetDefaultPrinter prTemp
    with CreateObject("Shell.Application")
        For i = 5 To Range("H4")
            .Namespace(0).ParseName(Cells(i, 5)).InvokeVerb ("Print")
        Next i
    end with
    .SetDefaultPrinter prNorm
end with

MsgBox ("IMPRESSION TERMINE")

End Sub

Cdlt,

Par ailleurs, voici une petite fonction (en ajoutant la référence) pour définir une imprimante en fonction d'un mot clé :

Function Definir(MotCle$)
'https://answers.microsoft.com/fr-fr/msoffice/forum/msoffice_excel-mso_winother-mso_archive/scriptnetwork/d422ec50-57e7-41ce-9187-b752ce51c8c1
'référence "Windows Script Host Object Model (ou Control)"
Dim oNetwork As IWshRuntimeLibrary.WshNetwork
Set oNetwork = New IWshRuntimeLibrary.WshNetwork
For Each pconn In oNetwork.EnumPrinterConnections
    If pconn Like "*" & MotCle & "*" Then oNetwork.SetDefaultPrinter pconn: exit function
Next pconn
End Function

Cdlt,

Bonjour 3GB,

J'ai adapté le code pour tester vite fait avec 2 fichiers pdf sur c:/ (pdf1.pdf et pdf2.pdf)
nb: Vous avez dim t mais je ne vois pas à quoi il sert?

Sub imprimer2()

Dim t, prNorm$, prTemp$, i&

prNorm$ = Cells(3, 3) 'Canon MG5300 series Printer WS
prTemp$ = Cells(2, 2) 'Microsoft Print to PDF

With CreateObject("WScript.Network")
    .SetDefaultPrinter prTemp
    With CreateObject("Shell.Application")
        For i = 1 To 2
            .Namespace(0).ParseName(Cells(i, 1)).InvokeVerb ("Print")
        Next i
    End With
    .SetDefaultPrinter prNorm
End With

MsgBox ("IMPRESSION TERMINE")

End Sub

J'ai testé. Ca plante:

Erreur d'exécution '91':

Variable objet ou variable de bloc With non définie.

Re,

De mon côté, j'ai testé le changement d'imprimante par défaut et ça semble fonctionner. Peut-être est-ce l'imbrication des with qui pose problème ?

Le t est un reliquat oublié (je comptais spliter le chemin de l'imprimante initiale pour ne garder que le nom puis je me suis ravisé en laissant le nom directement).

Voici un nouvel essai :

Sub imprimer2()
dim i&
DefinirImprimante "Print to PDF"
With CreateObject("Shell.Application")
    For i = 1 To 2
        .Namespace(0).ParseName(Cells(i, 1)).InvokeVerb ("Print")
    Next i
End With
DefinirImprimante "Canon MG5300"
MsgBox ("IMPRESSION TERMINE")
End Sub

Function DefinirImprimante(MotCle$) 'définit imprimante selon mot clé
With CreateObject("WScript.Network")
    For Each pconn In .EnumPrinterConnections
        If pconn Like "*" & MotCle & "*" Then .SetDefaultPrinter pconn: exit function
    Next pconn
end with
End Function

Edit : Au passage, car j'ai maintenant vu le nom de l'imprimante temporaire, pourquoi ne pas utiliser la méthode .exportasfixedformat ? Ce serait beaucoup plus simple, il n'y aurait pas besoin de changer l'imprimante par défaut.

Cdlt,

nb: pour le choix de l'imprimante temporaire, j'ai pris un exemple en mettant l'imprimante "printtopdf" car je ne suis pas au boulot (je n'ai qu'une imprimante sur ce poste et ca permet de tester sans gaspiller de papier )

En fait, je souhaite imprimer une liste de plans pdf sur une imprimante traceur grand format qui n'est pas mon imprimante Windows par défaut et revenir ensuite à mon imprimante par défaut.

Ca ne fonctionne tjs pas .

Tjs la même erreur "91" cité dans post précédent.

Je ne comprends pas à quoi sert la "Function DefinirImprimante" ?

nb: pour le choix de l'imprimante temporaire, j'ai pris un exemple en mettant l'imprimante "printtopdf" car je ne suis pas au boulot (je n'ai qu'une imprimante sur ce poste et ca permet de tester sans gaspiller de papier )

En fait, je souhaite imprimer une liste de plans pdf sur une imprimante traceur grand format qui n'est pas mon imprimante Windows par défaut et revenir ensuite à mon imprimante par défaut.

Sur quelle ligne porte l'erreur ?

De mon côté, la fonction marche parfaitement donc je ne sais pas quoi dire...

La fonction sert d'une part à éviter l'imbrication de with qui aurait pu, sait-on jamais, être la cause de l'erreur et également à avoir une petite fonction prête à l'emploi. Il suffit de saisir un mot de l'imprimante en argument pour qu'elle devienne imprimante par défaut.

Je pense qu'il faut regarder du côté de shell.application. Il existe une fonction ShellExecute facilement trouvable sur Internet qui permet d'imprimer sans problème.

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 Imprimer3()
Dim App As Long, i As Long
DefinirImprimante "Print to PDF"
App = FindWindow("XLMAIN", Application.Caption)
For i = 1 To 2
    ShellExecute App, "print", Cells(i, 1), "", "", 1
Next i
DefinirImprimante "MG5300"
End Sub

Function DefinirImprimante(MotCle$) 'définit imprimante selon mot clé
With CreateObject("WScript.Network")
    For Each pconn In .EnumPrinterConnections
        If pconn Like "*" & MotCle & "*" Then .SetDefaultPrinter pconn: exit function
    Next pconn
end with
End Function

Cdlt,

L'erreur porte sur cette ligne:

  .Namespace(0).ParseName(Cells(i, 1)).InvokeVerb ("Print")

Concernant l'autre solution (shellexecute): Erreur de compilation (32bit Vs 64bit)

C'est ce que je pensais, donc le changement d'imprimante est bien effectué.

Et vous ne rencontriez pas de problème avec :

For i = 1 To 2
    CreateObject("Shell.Application").Namespace(0).ParseName(Cells(i, 1)).InvokeVerb ("Print")
Next i

???

Pour le second problème, j'ai toujours été sous 32 bits donc je n'ai jamais rencontré ce problème et n'y connais rien mais pouvez-vous essayer de modifier les déclarations des 2 fonctions :

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

Private Declare PtrSafe 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

Cdlt,

For i = 1 To 2
    CreateObject("Shell.Application").Namespace(0).ParseName(Cells(i, 1)).InvokeVerb ("Print")
Next i

Ben non. Je comprends pas

Mais donc ça marche alors en laissant le tout sur une ligne ?

En fait je crois que c'est le nom du fichier qui ne lui plait pas dans la cellule car quand je remplace:

CreateObject("Shell.Application").Namespace(0).ParseName(cells(i, 1)).InvokeVerb ("Print")

Par

CreateObject("Shell.Application").Namespace(0).ParseName("C:\pdf1.pdf").InvokeVerb ("Print")

ca fonctionne mais ca n'incrémente plus ma liste de pdf (forcement)

Comprends pas.

J'ai mis C:\pdf1.pdf dans la cellule excel. Je vois pas ce qui lui plait pas?

Et en modifiant le chemin par cells(i, 1).value ?

Rechercher des sujets similaires à "impression papier liste fichier pdf choix imprimante"