Impressions multiples en vba

Résolu
Bonjour
je ne connais pas beaucoup le vba, mais je crois que c'est la seule façon de réaliser ce que je veux faire; je m'explique:

Un classeur Excel de 50 feuilles chacune nommée et possédant 5 pages à imprimer.

Je désire par exemple:

A partir d'un bouton, imprimer que la page 1 de toutes les feuilles Excel du classeur.
A partir d'un bouton, imprimer que la page 2 de toutes les feuilles Excel du classeur.
A partir d'un bouton, imprimer que la page 3 de toutes les feuilles Excel du classeur.
A partir d'un bouton, imprimer que la page 4 de toutes les feuilles Excel du classeur.
A partir d'un bouton, imprimer que la page 5 de toutes les feuilles Excel du classeur.

en fait comment je peux écrire ces 5 macros ? En VBA sera le mieux je pense car trop de manip autrement. et là j'ai besoin d'aide.

merci pour votre aide
Cordialement

13 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    Bonsoir,

    Une proposition que je n'ai pu tester (essaie d'abord sur un classeur avec 2-3 onglet) :
    Sub Imprim()
        Dim ws As Worksheet, p As Long
        p = CInt(InputBox("Imprimer la page : ", "Imprimer toutes les feuilles du classeur"))
        If p <= 5 And p > 0 Then
            For Each ws In Worksheets
                ws.Activate
                ActiveWindow.SelectedSheets.PrintOut From:=p, To:=p, Copies:=1, Collate:=True
            Next ws
        End If
    End Sub
    

    eric
    1. Bonjour,

      Une macro enregistrée peu faire l'affaire sous condition que les feuilles ne changent pas nom.
      1. merci pour votre réponse, j'essaie l'impression au travail demain.
        En fait j'ai 10 pages par feuille, j'ai donc changé la formule comme ça:
        Sub Imprim()
        Dim ws As Worksheet, p As Long
        p = CInt(InputBox("Imprimer la page : ", "Imprimer toutes les feuilles du classeur"))
        If p <= 10 And p > 0 Then
        For Each ws In Worksheets
        ws.Activate
        ActiveWindow.SelectedSheets.PrintOut From:=p, To:=p, Copies:=1, Collate:=True
        Next ws
        End If
        End Sub

        Mais il me vient une idée:
        Garder votre macro d'impression avec choix des feuilles à imprimer et:
        faire 10 macros, une pour chaque feuille soit:
        Macro 1 imprime toutes les pages 1 de toutes les feuilles du classeur
        macro 2 imprime toutes les pages 2 de toutes les feuilles du classeur Ect....
        Ce qui permettrait à mes collègues d'imprimer facilement la feuille qu'il désire sans avoir à mémoriser la page du fait de la nomination du bouton de la macro.
        Comment écrire la macro1?
        ensuite je pourrais écrire les suivantes.......
        merci
        1. Contributeur
          Bonjour,

          Essaie comme ça :
          Sub Imprim1
          Imprim(1)
          end sub
          Sub Imprim2
          Imprim(2)
          end sub

          Sub Imprim(p)
          Dim ws As Worksheet
          application.screenupdating=false
          For Each ws In Worksheets
          ws.Activate
          ActiveWindow.SelectedSheets.PrintOut From:=p, To:=p, Copies:=1, Collate:=True
          Next ws
          worksheets("Feuil1").activate
          application.screenupdating=true
          End Sub

          Et pour faire plus propre je réactive à la fin la feuille où il y a les boutons, remplaceb Feuil1 par son vrai nom.

          eric
          1. Encore moi, je fais une erreur ou il y a quelque chose qui ne vas pas:

            Première macro pour imprimer la page 1 de toutes les feuilles:

            Sub Impression_Semestre_1()
            Dim ws As Worksheet
            Application.ScreenUpdating = False
            For Each ws In Worksheets
            ws.Activate
            ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate:=True
            Next ws
            Worksheets("IMPRESSIONS").Activate
            Application.ScreenUpdating = True
            End Sub

            2ème macro pour imprimer la page 2 de toutes les feuilles:
            :
            Sub Impression_Semestre_2()
            Dim ws As Worksheet
            Application.ScreenUpdating = False
            For Each ws In Worksheets
            ws.Activate
            ActiveWindow.SelectedSheets.PrintOut From:=2, To:=2, Copies:=1, Collate:=True
            Next ws
            Worksheets("IMPRESSIONS").Activate
            Application.ScreenUpdating = True
            End Sub

            Pour les deux cas : erreur d'exécution '1004' La zone soulignnée est fluotée en jaune lorsue je fais débogage
            Ou est le problème?
            Merci encore
            1. A moins que ce soit parce que je n'ai pas d'imprimante et ça je le verrais demain au boulot.......
              1. MERCI, MERCI, MERCI, ça marche super bien.......
                Cela imprime comme je le souhaitais.
                Merci surtout à ERIIC pour ces propositions.

                Juste une petite demande complémentaire afin de faire des économies de papier:

                Comment puis je ajuster le nombres de feuilles à imprimer
                pour l'instant ça imprime toutes les feuilles(51), comment faire pour choisir le nombre de feuilles (46 par exemple)

                je ne veux pas abuser mais........

                Le VBA me plait beaucoup, quel bouquin acheter, ou puis je apprendre le VBA, l'idée d'être autonome me plairait.....
                merci encore pour tout
                1. Contributeur
                  Bonsoir,

                  Merci pour le retour.
                  Comment puis je ajuster le nombres de feuilles à imprimer
                  Par feuilles il faut entendre onglets je suppose ?
                  Si oui il faut être plus précis.
                  Les 46 dernier ? 46 premiers ? 46 est à demander ?
                  Ou ceux dont le nom commence (ou non) par telle chaine ?
                  Ou bien les onglets sélectionnés ?
                  Ou .... ???

                  eric
              2. le classeur contient 51 onglets, comment imprimer les 46 premiers par exemple, j'aimerai pouvoir ajuster ce nombre d'onglet à imprimer.
                Ou apprendre le vba? ça m' interresse +++, Ecell, les formules je me débrouille bien, les possibilités qu'offre le vba me permettrait de faire encore plus d'outils......

                merci
                1. Contributeur
                  Un exemple :
                  Sub Imprim()
                      Dim i As Long
                      Application.ScreenUpdating = False
                      For i = 1 To InputBox("Nombre d'onglet à imprimer ?")
                          Worksheets(i).Activate
                      Next i
                      ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate:=True
                      Worksheets("Feuil1").Activate
                      Application.ScreenUpdating = True
                  End Sub
                  

                  Content que tu aies chopé le virus vba ;-)
                  Pour les livres le mieux est d'en feuilleter plusieurs pour faire ton choix.
                  Il faut éviter les pavés de 3 kg qu'on hésite à consulter...
                  Celui que j'utilisais est 'VBA pour excel 2003, le guide complet' chez micro application mais je ne sais pas s'il est toujours édité.
                  Actuellement tu trouveras plutôt des éditions pour excel 2007, tu peux prendre, il y aura tout 2003 plus les nouveautés.
                  Et quand tu débutes (et même ensuite) ce qui aide bien c'est l'enregistreur de macro. Pour trouver les fonctions, méthodes et propriétés c'est idéal.
                  Pour le code généré il y a beaucoup de trucs inutiles à enlever, donc pas forcément à prendre en exemple...

                  eric
                  1. Merci pour tous ces conseils et l'aide apportée.
                    j'ai donc réalisé 10 macros comme si-dessous:

                    Sub Impression_Semestre_1()
                    Dim ws As Worksheet
                    Application.ScreenUpdating = False
                    For Each ws In Worksheets
                    ws.Activate
                    ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate:=True
                    Next ws
                    Worksheets("IMPRESSIONS").Activate
                    Application.ScreenUpdating = True
                    End Sub

                    C'est dans ces macros que j'aimerai pouvoir choisir le nombre d'onglet.
                    Afin de rendre encore plus simple, j'aimerai paramétrer dans chaque macros le nombre d'onglet sans msgbox.
                    En fait chaque année le classeur sera différent, cette année seul 46 onglets sont utilisés. l'année prochaine peut être 50......
                    c'est un paramétrage par défaut afin de n'imprimer que ce qui est nécessaire, pour mes collègues, un clic sur la macro et c'est tout...

                    En résumé et en espérant être clair: comment ajouter à la formule ci-dessus l'impression des 46 premiers onglets.

                    Je vais aller acheter le livre, je ne comprend pas encore ce que signifie tous ces termes dans les formules.....

                    merci encore........

                    c'est
                    1. Contributeur
                      Je te ramène à mon post de 20:19 : soit plus précis.
                      Qu'est-ce qui distingue les onglets à imprimer des autres ? Excel n'a aucun don divinatoire...
                  2. Bonsoir
                    afin de préciser ce que je veux faire:
                    En fait j'aimerais ajouter à la formule suivante qui imprime toutes pages du classeur

                    Sub Impression_Semestre_1()
                    Dim ws As Worksheet
                    Application.ScreenUpdating = False
                    For Each ws In Worksheets
                    ws.Activate
                    ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate:=True
                    Next ws
                    Worksheets("IMPRESSIONS").Activate
                    Application.ScreenUpdating = True
                    End Sub

                    la possibilité d''imprimer un nombre d'onglets définis par moi même sans boite de dialogue, que ce soit un paramétrage par défaut soit les 46 premiers onglets sur les 51 présents pour cette année.
                    Ta dernière formule :
                    Dim i As Long
                    Application.ScreenUpdating = False
                    For i = 1 To InputBox("Nombre d'onglet à imprimer ?")
                    Worksheets(i).Activate
                    Next i
                    ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate:=True
                    Worksheets("Feuil1").Activate
                    Application.ScreenUpdating = True
                    End Sub

                    permet de le faire en le choisissant par l'intermédiaire d'une boite de dialogue.
                    j'aimerais paramétrer les macos moi même par défaut au nombre de pages que j'ai choisi en lien avec le nombre d'étudiants de la promotion sans boite de dialogue afin que mes collègues n'aient rien à faire lorsqu'elle veulent imprimer un semestre.

                    Mon application concerne la gestion de promotions d'étudiants qui sont sur 3 ans. Chaque nouvelle promotion concerne un nombre d'étudiants qui est variable. Je désirerais paramétrer ces macros au début de chaque promotion. Un classeur dure 3 ans. J'ai prévu ces classeurs avec un supplément d'onglets au cas ou les étudiants seraient plus important).

                    Donc avec la formule actuelle, cette dernière imprime aussi les onglets mis en attente au cas ou des promotions seraient plus importante en nombre d'étudiants.

                    pour résumer, je voudrais mixer tes deux formules mais je n'ai pas encore assez de connaissances......
                    en espérant avoir été plus clair, mais c'est pas toujours évident d'expliquer quand on est dans son application.
                    Merci pour ta patience et l'aide apportée

                    Jean-Yves
                    1. Contributeur
                      Bonsoir,

                      Je ne pensais pas que tu voulais que ce soit codé en dur...
                      Mais on aurait tout aussi bien pu prévoir que ne s'impriment que les feuilles qui commencent par 'E_'. Dans ce cas il suffit de renommer la feuille pour qu'elle soit prise en compte, même si tu es en congé 1 mois...

                      code du 1er bouton :
                      Sub Impression_Semestre_1()       
                        Imprim(1) ' 1 est passé en paramètre pour imprimer la page 1      
                      end sub


                      code du 2ème bouton :
                      Sub Impression_Semestre_2()       
                        Imprim(2) ' 2 est passé en paramètre pour imprimer la page 2      
                      end sub

                      .....
                      etc

                      code général appelé par les boutons :
                      (donc 1 seul code à modifier pour tous les boutons en cas d'évol)
                      Sub Imprim(p) 
                          Dim i As Long 
                          Application.ScreenUpdating = False 
                          ' imprimer de la feuille 1 à 46 
                          For i = 1 To 46 
                              ' activer la feuille 
                              Worksheets(i).Activate 
                              ' imprimer la page p 
                              ActiveWindow.SelectedSheets.PrintOut From:=p, To:=p, Copies:=1, Collate:=True 
                          Next i 
                          ' réactiver la feuille avec les boutons 
                          Worksheets("Feuil1").Activate 
                          Application.ScreenUpdating = True 
                      End Sub


                      eric
                      1. Merci à toi Eric pour l'aide apportée, j'espère d'ici quelques mois avoir fait des progrés
                        Merci pour l'écoute et la disponibilité dont tu as fait preuve.
                        MERCI, MERCI, MERCI
                    2. Je marque ce post résolu, J'ai encore une question concernant le VBA mais c'est un autre problème et j'ouvre donc un autre post.
                      Merci Eric,
                      Vraiment super ce site