Bonjour,
je vous soumets un problème sur lequel je me casse les dents depuis bien plus longtemps que le délai avec lequel je résouds d'habitude mes problèmes de VBA Excel.
Je veux gérer "finement" l'impression d'une feuille/un classeur MS-EXCEL (version office 365).
Précisément, j'ai un classeur avec plusieurs feuilles (entre 3 et 5) dont deux dont je désire contrôler l'impression; l'une des deux s'appelle "Légende" ; le nom de l'autre feuille peut varier, mais c'est celle qui est sélectionnée lorsque l'on lance l'impression.
Via "Workbook_BeforePrint" je lance un sous-programme qui:
- affiche un "msgBox" offrant plusieurs choix
- Selon le choix fait, imprime ou non la feuille "Légende" et ceci sur une page séparée ou à la fin des pages de la feuille principale
Pour imprimer la feuille "Légende" à la fin des pages de la feuille "principale" (celle sélectionnée lors de l'impression), j'ajoute le feuille légende à la liste des feuilles sélectionnées via
Le but est, que dans une impression recto-verso, la légende soit au verso de la dernière page
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim Leg As Worksheet: Set Leg = Sheets("Légende") Leg.Select False
Pour imprimer la feuille "Légende" sur une feuille séparée, je n'ajoute pas le feuille légende à la liste des feuilles sélectionnées, mais j'appelle Leg.PrintOut
Tout cela marche très bien.
Nous en arrivons à mon problème.
Je voudrais, en fait, imprimer les deux premières pages de la feuille "principale" sur du papier à en-tête en recto-verso (d'où chargeur de document ou bac spécial de l'imprimante) et le reste de la feuille principale (et potentiellement la feuille "Légende") sur du papier normal (bac par défaut).
Et c'est là que j'échoue depuis deux jours.
Comme on ne peut pas choisir le bac papier depuis le VBA, le mode opératoire est le suivant:
- Je choisis les paramètres d'impression ("Propriétés de l'imprimante") depuis le menu d'impression pour choisir le bac externe ou bac à papier à en-tête
- Je lance l'impression
Si je choisis d'imprimer la feuille "Légende" sur une feuille de papier séparée via ma msgBox, il s'avère que .PrintOut utilise la configuration par défaut de l'imprimante et la légende s'imprime bien sur une feuille standard à part.
Mais tout le reste (toutes les pages de ma feuille principale et éventuellement la légende si je n'ai pas demandé à ce qu'elle s'imprime sur une feuille séparée) s'imprime sur du papier à en-tête...
Or je voudrais que seules les deux premières pages (recto-verso de la 1ère feuille de papier) s'impriment sur du papier à en-tête, et le reste sur du papier normal...
Je voudrais donc lancer un .printOut sur les pages 3 à la dernière page à imprimer (ça je sais faire), qui imprimerait ces pages avec la configuration par défaut de l'imprimante (=> papier normal) et retirer ces pages de l'impression en cours pour qu'elles ne soient pas imprimées une seconde fois sur du papier à en-tête!
Et c'est là où ça coince: j'ai cherché, cherché et cherché encore, mais je n'ai trouvé aucun moyen de retirer ces pages de l'impression en cours...
Quelqu'un peut-il m'aider?
Je vous mets mon code actuel ci-dessous.
Quelques explications/justifications:
- le classeur MS-EXCEL sert de modèle à des documents utilisés par de nombreuses personnes, donc une solution spécifique à mon ordinateur, telle que de créer des copies de l'imprimante avec diverses configuration de bac papier et choisir l'imprimante, etc. n'est pas applicable
- utiliser .printout pour tout et annuler l'impression en cours (Cancel = True dans Workbook_BeforePrint) n'est pas la solution car .printout utilise la configuration par défaut de l'imprimante et donc tout serait sur du papier normal (pas de papier à en-tête)
Voici mon code actuel, qui fonctionne bien, mais ne gère pas ce "détail" de bac papier différent pour les 2 premières pages et les autres.
Un grand merci d'avanced si vous avez une idée permettant de résoudre mon problème
Dom
Dans "ThisWorkbook":
Dans "Module1"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Private Sub Workbook_BeforePrint(Cancel As Boolean) ' Dim Leg As Worksheet: Set Leg = Sheets("Légende") ' Dim Pres As Worksheet: Set Pres = ActiveSheet ' Leg.Visible = True Call MyOwnPrint ' Leg.Select (False) ' Application.OnTime Now, "AfterPrint" ' Cancel = True End If End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 Private Sub AfterPrint() Dim Leg As Worksheet: Set Leg = Sheets("Légende") Dim Pres As Worksheet: Set Pres = ActiveSheet Pres.Select True ' pour désélectionner la feuille "Légende" Leg.Visible = xlVeryHidden ' pour cacher la feuille "Légende" End Sub Public Sub MyOwnPrint() Dim Leg As Worksheet: Set Leg = Sheets("Légende") Dim Pres As Worksheet: Set Pres = ActiveSheet Dim answer Leg.Visible = True If (ActiveSheet.Name <> "Légende") Then ' Pour ne pas repasser par ici lors de l'appel à Workbook_BeforePrint généré par Leg.PrintOut If (ActiveSheet.PageSetup.Pages.Count And 1) Then ' nombre impair de pages à imprimer answer = MsgBox("Voulez-vous imprimer la légende sur une feuille séparée?" & Chr(10) & _ "'Oui' pour légende sur sa propre feuille" & Chr(10) & _ "'Non' pour légende au dos de la dernière page" & Chr(10) & _ "'Annuler' pour pas de légende du tout." _ , vbYesNoCancel + vbQuestion, "Impression") If answer = vbYes Then Leg.PrintOut ElseIf answer = vbNo Then Leg.Select False ' ajoute la légende à la liste des feuilles sélectionnées et donc à la liste des pages à imprimer MsgBox "Légende imprimée au verso de la dernière page!" Else MsgBox "Nous n'imprimons donc pas de légende!" End If Else ' Nombre de pages pair de pages à imprimer answer = MsgBox("Voulez-vous imprimer la légende (sur une feuille séparée)?" & Chr(10) & _ "'Oui' pour légende sur sa propre feuille" & Chr(10) & _ "'Non' pour pas de légende du tout" _ , vbYesNo + vbQuestion, "Impression") If answer = vbYes Then Leg.Select False ' ajoute la légende à la liste des feuilles sélectionnées et donc à imprimer; comme le document principal a un nombre pair de pages, la légende sera imprimée sur sa propre feuille MsgBox "Presence Sheet printed with legend!" Else MsgBox "Nous n'imprimons donc pas de légende!" End If End If ' Ici je voudrais rajouter un .printOut sur les pages 3 à finale des feuilles sélectionnées ' et "réinitialiser" les pages à imprimer aux pages 1 et 2 afin qu'en sortie de Workbook_BeforePrint seules ces deux pages soient imprimées (et donc sur papier à en-tête) End If Application.OnTime Now, "AfterPrint" ' pour "nettoyer", c'est à dire désélectionner la feuille "Légende" (si elle a été sélectionnée) et la cacher End Sub
Partager