IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

gestion des pages imprimées depuis onBeforePrint


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut gestion des pages imprimées depuis onBeforePrint
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Leg  As Worksheet: Set Leg = Sheets("Légende")
    Leg.Select False
    Le but est, que dans une impression recto-verso, la légende soit au verso de la dernière page

    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:
    1. 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
    2. 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":
    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
    Dans "Module1"
    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

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 239
    Points : 5 610
    Points
    5 610
    Par défaut
    Bonjour,

    Un début de réponse sur cette page Specifying a Paper Tray in a Macro

    Cordialement.

Discussions similaires

  1. Imprimer des pages Word depuis Excel
    Par touche_a_tout dans le forum VBA Word
    Réponses: 5
    Dernier message: 06/05/2019, 19h54
  2. [POO] MVC : Gestion des "pages"
    Par Dinan dans le forum Langage
    Réponses: 4
    Dernier message: 18/02/2007, 19h44
  3. Gestion des pages sous dreamweaver
    Par yerimacm dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 14/02/2007, 09h08
  4. [c#]Repeater et gestion des pages d'index
    Par pinocchio dans le forum ASP.NET
    Réponses: 3
    Dernier message: 17/10/2006, 16h35
  5. Gestion des Pages
    Par Pe04 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 17/02/2006, 10h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo