Imprimer depuis un module VBA

Résolu/Fermé
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 - 28 févr. 2011 à 09:23
 Oz - 5 déc. 2013 à 15:15
Bonjour,
Bonjour à tous,
J'ai créé un classeur Excel dans lequel j'ai un module Vba pour l'impression. Ce classeur est à la disposition de plusieurs dizaines d'utilisateurs. Il fonctionne très bien et il est apprécié de tous. Cependant on me demande de l'améliorer en permettant de choisir l'imprimante (dans le cas ou plusieurs imprimantes sont reliées à l'ordinateur) ou de choisir la qualité d'impression. Pour cela je souhaiterais que dans ma macro impression ci-dessous faire appel et afficher la boîte de dialogue «Imprimer» mais je n'y parviens pas !

Sub ImpressionTableau()
    Dim p As Integer
    'Application.ScreenUpdating = False                  ' Bloque le rafraîchissement de l'écran.
    'Application.EnableEvents = False                    ' Arrêt de la scrutation.
    If Sheets("Bordereau").Range("A28").Value = "" Then             ' Test si la 1ere cellule utilisée, A28.
        MsgBox ("Le Tableau n'a pas été rempli !" & vbCrLf & " " & vbCrLf & "Il n'y a donc rien à imprimer."), vbCritical, "Fédération Trucmuche"
        Exit Sub
    End If
'Définit la zone complète
    Sheets("Tableau").PageSetup.PrintArea = "$A$1:$N$235"         ' Partie de la feuille utilisée.
    p = Nb_LigneBdx                                                   ' Saut à la fonction Nb_LigneBdx
    p = Nb_PagesBdx(p)                                              ' Saut à la fonction Nb_PagesBdxN2
    With Sheets("Tableau")
        .Visible = True
        .PrintOut from:=1, To:=p
        .Visible = False
    End With
     Application.ScreenUpdating = True           ' Rétablis le rafraîchissement de l'écran.
    Application.EnableEvents = True               ' Remise en service de la scrutation.
End Sub

' Calcule et renvois le N° de la dernière ligne non vide.
Function Nb_LigneBdx() As Integer
    Dim I As Integer
    For I = 28 To 235
        If Sheets("Tableau").Range("A" & I).Value = "" Then Exit For      ' Test la première cellule vide de la colonne A.
    Next I
    Nb_LigneBdx = I - 1
End Function

' Calcule et renvois le Nb de page.
Function Nb_PagesBdx(Lignes As Integer) As Integer
    Select Case Lignes
        Case 1 To 58: Nb_PagesBdx = 1
        Case 59 To 110: Nb_PagesBdx = 2
        Case 111 To 162: Nb_PagesBdx = 3
        Case 163 To 214: Nb_PagesBdx = 4
        Case Is > 214: Nb_PagesBdx = 5
    End Select
End Function

Indépendamment de cette modification le classeur et l'impression fonctionnent très bien.
Pouvez-vous m'aider ?
D'avance merci.
Mistral

37 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié par michel_m le 28/02/2011 à 10:41
Bonjour,

Pour choisir une imprimante
Application.Dialogs(xlDialogPrint).Show

et tu as normalement le bouton "propriétés de l'imprimante"

cette syntaxe ne marche peut-être pas en réseau (je suis en mono poste) dans ce cas il faudrait utiliser WMI... Tu dis.
Michel
0
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 4
28 févr. 2011 à 11:30
Bonjour Michel,

Merci pour ta réponse et pour ta rapidité.

J'ai fais un test sur un simple classeur et ça fonctionne correctement tout au moins pour les proprietés de l'imprimante. Il me reste à tester ça avec plusieurs imprimantes.
Par contre je n'arrive pas à intégrer cette ligne dans mon module tout en conservant le calcule du nombre de page à imprimer.
As-tu une idée
Cordialement
Mistral
0
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 4
28 févr. 2011 à 18:00
Re,

En fait j'ai beaucoup de difficullté pour comprendre tous les arguments (15 en tout) de l'instruction :

Application.Dialogs(xlDialogPrint).Show(, 2, [p], 7, , , , , , , , , , , 1)


J'arrive bien à valider le N° des pages à imprimer (de 2 à [p]) ainsi que le nombre d'exemplaire (7) mais je n'arrive pas à valider l'option "Pages(s)" et pourtant le mets bien le 15iem argument à 1.

Aurais-tu une idée ou une solution à me proposer.
Cordialement
Mistral
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
28 févr. 2011 à 18:39
Désolé, je ne vois pas du tout...
0
Le Pingou Messages postés 12225 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 6 décembre 2024 1 452
Modifié par Le Pingou le 28/02/2011 à 23:28
Bonjour,
Essayer avec ce code qui vous permet de choisir l'imprimante (clic OK pour valider le choix) :
Application.Dialogs(Excel.xlBuiltInDialog.xlDialogPrinterSetup).Show
Et dans votre code vous récupérez le nom de l'imprimante active que vous placez comme argument supplémentaire de
PrintOut .PrintOut from:=1, To:=p .....


Ou avec ceci:
Sub choix_imprimante 
imprimante = Application.Dialogs(xlDialogPrinterSetup).Show 
Application.ActivePrinter = imprimante 
End Sub
Salutations.
Le Pingou
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 4
1 mars 2011 à 07:50
Bonjour Le Pingou,
Tout d'abord merci te t'intéresser à mon problème.
J'ai voulu tester les deux solutions proposées mais je dois reconnaître que je m'y perds un peu.
Dans la première j'ai bien la fenêtre choix de l'imprimante qui s'ouvre, je peux effectivement la choisir et configurer l'impression avec la touche «Configurer» mais je ne vois pas comment récupérer le nom de l'imprimante ni comment l'insérer après.
Dans la seconde j'ai une erreur 1004 : La méthode ActivePrinter de l'objet Application a échoué.
Peux-tu m'aider Stp.
Cordialement
Mistral
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
Modifié par pijaku le 1/03/2011 à 08:37
Bonjour,
L'instruction donnée par Le Pingou :
imprimante = Application.Dialogs(xlDialogPrinterSetup).Show
renvoie "vrai" ou "faux". Vrai et faux n'étant pas des noms d'imprimante (;-)) je te recommande :
Sub choix_imprimante()  
Dim imprimante As String, ImprimanteInitiale As String  
ImprimanteInitiale = Application.ActivePrinter  
Application.Dialogs(xlDialogPrinterSetup).Show  
imprimante = Application.ActivePrinter  
MsgBox imprimante  
Application.ActivePrinter = ImprimanteInitiale 
End Sub


Réponse éditée pour l'ajout de ImprimanteInitiale permettant de rétablir les paramètres par défaut......
0
Le Pingou Messages postés 12225 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 6 décembre 2024 1 452
1 mars 2011 à 10:38
Bonjour pijaku,
Oui d'accord avec vous, par contre comme il veut utiliser la commande [PrintOut] j'ai bien précisé ceci :
Et dans votre code vous récupérez le nom de l'imprimante active que vous placez comme argument supplémentaire de PrintOut .PrintOut from:=1, To:=p , .....
Salutations.
Le Pingou
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
1 mars 2011 à 10:39
Salut Le Pingou,
Exact. Ma réponse n'était qu'un complément de la tienne.
Bonne journée à toi.
A bientôt.
0
Le Pingou Messages postés 12225 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 6 décembre 2024 1 452
1 mars 2011 à 11:31
Bonjour Mistral_13200,
Oui je peux vous aider, difficile de répondre sans voir le code que vous avez créé.. !

Note: concernant la première, je n'ai pas dit la touche [Configurer] mais : clic OK pour valider le choix, se qui est différent.

Salutations.
Le Pingou
0
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 4
1 mars 2011 à 13:03
Le Pingou,
Pijaku

Bonjour à vous deux,

Merci de consacrer de votre temps à régler mon problème.

La totalité du code de ma macro est dans mon tout premier message. Je rappellerais simplement que ce code fonctionne parfaitement tel qu'il est. Par contre certains utilisateurs me demande de le modifier pour avoir le choix de l'imprimante et de la qualité d'impression.
J'ai bien compris qu'il fallait valider le choix de l'imprimante avec OK, je voulais simplement dire que l'on pouvait également intervenir sur les paramètres de l'imprimante si on le souhaitait.
C'est bien dans l'intégration de l'imprimante par défaut dans ma macro que je bute et c'est précisément là que j'ai besoin de votre aide.
Maintenant si vous estimez que l'instruction
PrintOut
n'est pas adaptée je n'ai rien contre le fait de changer mais je ne sais pas par quoi.
J'ai bien essaye :

Application.Dialogs(xlDialogPrint).Show(, 2, [p], 7, , , , , , , , , , , 1)

Mais là je bute sur la manière de valider l'option page de la fenêtre «Imprimer». Je sais récupérer le Nb de page et Nb d'exemplaire et cela est indispensable pour n'imprimer que le Nb de page nécessaire.

En tout cas un grand merci à vous deux.
Cordialement
Mistral
0
Le Pingou Messages postés 12225 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 6 décembre 2024 1 452
1 mars 2011 à 13:39
Bonjour,
Oui mais se n'est pas le code avec la correction qui ne fonctionne pas.
Dans se cas, les lignes de code que vous devez avoir juste après la ligne :
 p = Nb_PagesBdx(p)
:
Application.Dialogs(Excel.XlBuiltInDialog.xlDialogPrinterSetup).Show
    Nom = ActivePrinter
    With Sheets("Tableau")
        .Visible = True
        .PrintOut from:=1, To:=p, ActivePrinter:=Nom
        .Visible = False
    End With

Remarque : dans la boite de dialogue vous choisissez l'imprimante et valider par OK.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
1 mars 2011 à 13:55
Bonjour à tous,

A tout Hasard
Je n"ai pas trouvé une aide sur tes 15 aguments (...?...)et je ne comprend pas ce 1.... quand tu parles de "pages", s'agit il bien de pages à l'intérieur d'une "feuille" excel ?

pour trouver le nombre de pages par feuvlle, j'ai trouvé cette instruction sur un autre site
ExecuteExcel4Macro("GET.DOCUMENT(50)")

et pour imprimer:
FeuilN.PrintOut From:=1 To:=ExecuteExcel4Macro("GET.DOCUMENT(50)"


mais....
0
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 4
1 mars 2011 à 16:58
Bonjour Michel,

L'instruction :

Application.Dialogs(xlDialogPrint).Show(, 1, [p], 7, , , , , , , , , , , 1)

a 15 arguments de configuration possible qui sont :

range_num, from, to, copies, draft, preview, print_what, color, feed, quality, y_resolution, selection, printer_text, print_to_file, collate

J'arrive a configurer sans problème les pages que je souhaite imprimer (de 1 à p) et le nombre d'exemplaire à imprimer (7) voir l'exemple ci-dessus mais je n'arrive pas à valider l'option pages dans la partie "Etendue" de la boîte dialogue Imprimer, je reste sur "Tout" en permanence. J'imprime donc toute la feuille feuille du classeur soit 25 pages.

Cordialement
Mistral
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
1 mars 2011 à 17:19
Petite question: pourquoi mettre p entre crochets ?

Quant au 1 de l'argument n)15 collate il n'est pas nécesssaire car collate:= true par défaut

avec l'enregistreur de macros étendue page 1 à 2
ActiveWindow.SelectedSheets.PrintOut From:=1, To:=2, Copies:=1
0
Le Pingou Messages postés 12225 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 6 décembre 2024 1 452
Modifié par Le Pingou le 1/03/2011 à 17:27
Bonjour Mistral_13200,
Une des solutions est ici : https://forums.commentcamarche.net/forum/affich-21020404-imprimer-depuis-un-module-vba#12
Je l'ai testé et elle fonctionne.
Est-il possible de savoir si chez vous c'est en ordre ?
Salutations.
Le Pingou
0
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 4
1 mars 2011 à 17:28
parce que "p" est une variable, elle est le résultat du calcule du nombre de page à imprimer.

Pour être plus précis, dans la partie Etendue de la fenêtre Imprimer il y a deux options : "Tout" et "Pages(s)" je voudrais basculer de "Tout" vers "Pages(s)" et je n'y arrive pas.
0
Le Pingou Messages postés 12225 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 6 décembre 2024 1 452
1 mars 2011 à 17:38
Bonjour Mistral_13200,
Alors avec ma proposition (pos 12) les valeurs de vos variables sont respecté.
Désolé si cela ne vous convient pas.
Salutations.
Le Pingou
0
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 4
1 mars 2011 à 17:54
Je suis un peu perdu au milieu de tous ces messages mais j'ai répondu à ta proposition, peut être pas dans le bon ordre et je te prie de bien vouloir m'excuser.

Je suis bien d'accord les variables sont respectées.
Il ne reste plus, visiblement plus facile à dire qu'à faire, a pouvoir modifier les paramètres d'impression tel que la qualité Normal/Brouillon ou encore N&B/Couleur.
0
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 4
1 mars 2011 à 17:45
Re Le Pingou,

Cela semble effectivement fonctionner l'imprimante par défaut est bien reconnue. C'est déjà une bonne chose!
Par contre si je change la qualité d'impression ou si je choisi d'imprimer en N&B ou en couleur en utilisant le bouton "Configurer" de la fenêtre de dialogue rien ne se passe et pourtant je valide bien par Ok.
Mieux je dirais même que je garde les parametres d'impression du dernier parametrage manuel.
Je n'y comprends plus ruen....
Cordialement
Mistral
0
Le Pingou Messages postés 12225 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 6 décembre 2024 1 452
1 mars 2011 à 18:45
Bonjour,
Eh oui, Il ne reste plus, visiblement plus facile à dire qu'à faire, a pouvoir modifier les paramètres d'impression tel que la qualité Normal/Brouillon ou encore N&B/Couleur et pour que cela fonctionne il faut passer les paramètres choisies à la procédure.
Pouvez-vous mentionner exactement les paramètres qui seront autorisés pour l'utilisateur ?
0
Le Pingou Messages postés 12225 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 6 décembre 2024 1 452
1 mars 2011 à 21:20
Bonjour Mistral_13200,
Je viens d'effectuer des tests, avec le code que je vous ai proposé, en changeant les diverses valeurs de configuration, noir/blanc, couleurs, orientation (Portrait/Paysage) etc. et tout fonctionne parfaitement avec le code tel quel.
0
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 4
2 mars 2011 à 08:57
Bonjour Le Pingou,

J'ai moi aussi fait d'autres essais hier au soir sur un autre ordi et une autre imprimante et là j'ai effectivement pu changer la qualité d'impression et la couleur. Malheureusement au club je n'ai pas d'imprimantes en réseau...
Je vais regarder pourquoi sur mon imprimante couleur je reste en N&B???

Quand j'aurais réglé mon problème et si tu le permets, je reviendrais vers toi si j'ai d'autres questions.
Encore un grand merci à vous trois pour votre aide.
Cordialement
Mistral

PS : Je serais absent jusqu'au 21/03
0
Le Pingou Messages postés 12225 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 6 décembre 2024 1 452
Modifié par Le Pingou le 2/03/2011 à 09:09
Bonjour,
Je vais regarder pourquoi sur mon imprimante couleur je reste en N&B???
Probablement réinstaller le logiciel de l'imprimant!
Bonnes vacances.
Salutations.
Le Pingou
0
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 4
2 mars 2011 à 09:19
Re,

C'est exactement ce que je viens de faire et le problème persiste.
Ci-dessous le code complet avec lequel je fais mes tests et pour lequl je ne pense pas avoir commis d'erreur.

Sub ImpressionTableau()

    Dim p As Integer

    Application.ScreenUpdating = False                              ' Bloque le rafraichissement de l'écran.
    Application.EnableEvents = False                                ' Arret de la scrutation.

    If Sheets("Tableau").Range("A28").Value = "" Then               ' Test si la 1ere cellule utilisée, A28.
        MsgBox ("Le Tableau n'a pas été saisi !" & vbCrLf & " " & vbCrLf & "Il n'y a donc rien à imprimer."), vbCritical, "Fédération Trucmuche"
        Exit Sub
    End If

'Définit la zone complète
    Sheets("Tableau").PageSetup.PrintArea = "$A$1:$N$235"           ' Partie de la feuille utilisée.
    p = Nb_LigneBdx                                                 ' Saut à la fonction Nb_LigneBdx
    p = Nb_PagesBdx(p)                                              ' Saut à la fonction Nb_PagesBdx
    'p = 9
    
    If Application.Dialogs(Excel.XlBuiltInDialog.xlDialogPrinterSetup).Show = False Then
    GoTo Line1
    Else

    Nom = ActivePrinter
    With Sheets("Tableau")
        .Visible = True
        .PrintOut from:=1, To:=p, ActivePrinter:=Nom
        '.Visible = False 'A remettre dans la version difinitive.
    End With
    End If
    
Line1:

    Application.ScreenUpdating = True                               ' Rétablis le rafraichissement de l'écran.
    Application.EnableEvents = True                                 ' Remise en service de la scrutation.

 End Sub

' Calcule et renvois le N° de la dernière ligne non vide.
Function Nb_LigneBdx() As Integer
    Dim I As Integer
    For I = 28 To 235
        If Sheets("Tableau").Range("B" & I).Value = "" Then Exit For      ' Test la première cellule vide de la colonne A.
    Next I
    Nb_LigneBdx = I - 1
End Function
' Calcule et renvois le Nb de page.
Function Nb_PagesBdx(Lignes As Integer) As Integer
    Select Case Lignes
        Case 1 To 58: Nb_PagesBdx = 1
        Case 59 To 110: Nb_PagesBdx = 2
        Case 111 To 162: Nb_PagesBdx = 3
        Case 163 To 214: Nb_PagesBdx = 4
        Case Is > 214: Nb_PagesBdx = 5
    End Select
End Function


Si tu vois une anomalie merci de ma le signaler.
Me vider la tête ne me fera pas de mal...
Cordialement
Mistral
0
Le Pingou Messages postés 12225 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 6 décembre 2024 1 452
2 mars 2011 à 09:37
Bonjour,
La partie qui touche l'imprimante est correcte.
Pour éviter le [GoTo Line1] j'écrirais de cette manière :
If Application.Dialogs(Excel.XlBuiltInDialog.xlDialogPrinterSetup).Show = True Then
    Nom = ActivePrinter
    With Sheets("Tableau")
        .Visible = True
        .PrintOut from:=1, To:=p, ActivePrinter:=Nom
        '.Visible = False 'A remettre dans la version difinitive.
    End With
End If

Note: pour votre imprimante, assurez-vous que la modification des paramètres soit prise en compte directement sans passé par la procédure VBA.
0
Mistral_13200 Messages postés 636 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 novembre 2024 4
31 mars 2011 à 10:16
Bonjour L e Pingou,

Je reviens à la charge car ça ne fonctionne toujours pas. J'ai réinstallé mon imprimante est elle fonctionne normalement. Si je fais des essais d'impression manuellement par Fichier/Imprimer j'imprime bien en N&B ou en couleur selon mes choix. Idem pour la qualité d'impression Normal/Brouillon.

Par contre quand je fais des tests en utilisant la macro j'ai deux problèmes (A ce moment là l'imprimante est configurée couleur/Normal) :
1er essais : Je lance l'impression avec le bouton et je valide le choix par OK sans rien changer. L'impression est en N&B alors que l'imprimante était en couleur et qu'elle y est restée ! Pourquoi ?
2iem essais : Je lance l'impression et je configure l'impression en N&B puis je valide par OK. L'impression se fait bien en N&B (l'imprimante est OK vérification par Fichier/Imprimer) mais apparaît le 2iem problème, a savoir j'ai deux trait pointillé qui apparaissent sur le bord droit des cellules des colonnes G et N. Pourquoi ?
3iem essais : Je lance l'impression et je configure l'impression en Couleur puis je valide par OK. L'impression se fait en N&B alors que l'imprimante est bien passée en couleur (l'imprimante OK vérification par Fichier/Imprimer) !!!
Tous ces essais ont été fait sur le classeur dont le lien est ci-dessous :

http://www.cijoint.fr/cjlink.php?file=cj201103/cij3nbfyED.xls

Pouvez-vous m'aider car je n'y comprends vraiment plus rien.
Merci d'avance.
Cordialement
Mistral
0
Le Pingou Messages postés 12225 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 6 décembre 2024 1 452
31 mars 2011 à 10:54
Bonjour,
Tout fonctionne correctement chez moi.
Avez-vous contrôlé votre macro pas à pas ?
Essayez aussi de désactiver l'événement : `EnableEvents' !
0