Comment imprimer la même page de plusieurs onglets [Résolu/Fermé]

Signaler
Messages postés
9
Date d'inscription
lundi 3 octobre 2016
Statut
Membre
Dernière intervention
10 octobre 2016
-
 Utilisateur anonyme -
Bonjour,
Malgré mes différentes tentatives, je ne parviens pas à imprimer la même page de plusieurs onglets d'un même fichier.
Mon fichier contient environ 45 onglets, chacun faisant 12 pages. Je souhaite par exemple imprimer la page 4 de chaque onglet. Je sélectionne les onglets, je fais imprimer, je sélectionne le numéro de page à imprimer, je coche feuilles sélectionnées et ça m'imprime toujours que la page du 1er onglet.
Je n'y connais rien en macro mais je suis ouverte à vos explication pour en créer une si je dois en passer par là.
Merci d'avance

1 réponse

Bonjour Flojo05,

Si chaque onglet fait toujours 12 pages, alors :
la page 4 de l'onglet n est la page n° :

12 * (n - 1) + 4

Exemple : pour la page 4 de l'onglet 5, il te faudra imprimer
la page n° 12 × (5 - 1) + 4 = (12 × 4) + 4 = 48 + 4 = 52.

Ce renseignement est à utiliser soit pour une impression
manuelle de la page concernée, soit pour une macro.

Voici une macro pour imprimer la page 4 de l'onglet 5,
avec n = 5, x = 4.


Option Explicit

Private Sub PrintPageX(n As Integer, x As Byte)
  Worksheets(12 * (n - 1) + x).Printout
End Sub

Sub Essai()
  PrintPageX 5, 4
End Sub


Voici une autre macro pour imprimer toutes les pages 4
de chaque onglet, avec x = 4 :


Option Explicit

Private Sub PrintAllPagesX(x As Byte)
  Dim n As Integer
  For n = x to Worksheets.Count Step x
    Worksheets(n).Printout
  Next n
End Sub

Sub Essai()
  PrintAllPagesX 4
End Sub


Dans les 2 macros, si tu es sûr(e) d'avoir moins de 256 onglets,
tu peux remplacer « n As Integer » par « n As Byte ».

Si ton problème est réglé, merci d'aller en haut de page
pour cliquer sur « Marquer comme résolu ».

Cordialement.  😊
 
Utilisateur anonyme >
Messages postés
9
Date d'inscription
lundi 3 octobre 2016
Statut
Membre
Dernière intervention
10 octobre 2016

 
Bonjour Flojo05,

Merci d'avoir passé le sujet en résolu ; cependant, j'ai mieux à te proposer !

Dans ton message #8, tu avais écris : « cela peut vraiment m'intéresser
de pouvoir imprimer une plage de pages (3 à 6 par exemple) ».

J'ai alors traité cette 2ème demande comme un 2ème exercice différent,
donc de façon indépendante, complètement séparée du 1er exercice.

Or c'est bien mieux de traiter les 2 exercices comme si c'en était un seul !
Mais pour faire cela, il faut dissocier la partie saisie (d'un ou deux n° page)
de la partie impression.

================================

Tu verras dans le code VBA ci-dessous une première sub PrintAllPagesAB()
qui est privée, car il y a devant le mot clé Private. Cela signifie qu'elle ne peut
pas être appelée directement par l'utilisateur, ni par un autre module VBA
(s'il y en avait d'autres). Elle sera appelée uniquement par les 2 sub qui
suivent (qui sont donc, dans le code VBA, juste en dessous).

C'est la sub PrintAllPagesAB() qui fait tout le travail d'impression, de pageDe
à pageA, comme tu l'as déjà vu précédemment ; seule petite différence, qui
est un plus ajouté : à la fin de l'impression, ça retourne sur la feuille départ :
celle qui était sélectionnée juste avant le lancement de la macro.

--------------------------------------------------------

La sub PrintPagesAB() te permet de saisir 2 n° de page : pageDe et pageA ;
puis cette sub appelle PrintAllPagesAB() en lui passant ces 2 n° de page ;
donc ça fera l'impression de pageDe à pageA, par exemple 3 à 6.

--------------------------------------------------------

La sub PrintPagesX() te permet de saisir 1 seul n° de page : pageX ; puis
cette sub appelle PrintAllPagesAB() en lui passant ce seul n° de page 2× ;
donc ça fera l'impression de pageX à pageX, par exemple 5 à 5.

--------------------------------------------------------

Donc si tu veux imprimer une seule page, lance la macro PrintPagesX() ;
si tu veux imprimer d'une page à une autre, lance PrintPagesAB().


Option Explicit


Private Sub PrintAllPagesAB(pageDe As Byte, pageA As Byte)
  Application.ScreenUpdating = False
  Dim FX As Worksheet, n As Byte: Set FX = ActiveSheet
  For n = 1 To Worksheets.Count
    With Worksheets(n)
      If .Visible Then .Select: .PrintOut pageDe, pageA, 1
    End With
  Next n
  FX.Select
End Sub


Sub PrintPagesAB()
  Dim pageDe As Byte, pageA As Byte, chn As String
  Do
    chn = InputBox("PageDe : "): pageDe = Val(chn)
  Loop Until pageDe > 0
  Do
    chn = InputBox("PageA : "): pageA = Val(chn)
  Loop Until pageA >= pageDe
  PrintAllPagesAB pageDe, pageA
End Sub


Sub PrintPagesX()
  Dim pageX As Byte, chn As String
  Do
    chn = InputBox("Page n° : "): pageX = Val(chn)
  Loop Until pageX > 0
  PrintAllPagesAB pageX, pageX
End Sub


C'est cela aussi, la programmation VBA : il ne faut pas hésiter à changer
son code VBA quand on pense pouvoir y apporter des améliorations !

Dis-moi ce que tu en penses, et si tu aimes mieux.  😉

Cordialement.  😊
Messages postés
9
Date d'inscription
lundi 3 octobre 2016
Statut
Membre
Dernière intervention
10 octobre 2016

Bonjour Albkan
Merci pour cette amélioration. Cependant en faisant mon teste je me suis rendue compte que si je lance la macro (peu importe laquelle) et que je rend compte que finalement je ne veux pas imprimer, je ne parviens pas à sortir de la macro.
Je m'explique, même en faisant 'echap' ou en cliquant sur la croix rouge ou même en mettant 0 dans les pages à imprimer, je n'y parviens pas. Pour m'en sortir j'ai dû obligatoirement lancer l'impression ! Heureusement c'est sur mon fichier de test qui ne contient que 2 onglets !
Utilisateur anonyme >
Messages postés
9
Date d'inscription
lundi 3 octobre 2016
Statut
Membre
Dernière intervention
10 octobre 2016

 
Rebonjour Flojo05,

Très bonnes remarques ! Je le savais, mais j'avais pensé que tu n'aurais
pas besoin d'abandonner la saisie d'un ou deux n° de page, ni le travail
d'impression.

Tu trouveras ci-dessous le code complet des 2 macros de saisie ;
laisse tel que tout le code VBA qui se trouve au-dessus, c-à-d :
Option Explicit et la sub privée PrintAllPagesAB().


Sub PrintPagesAB()
  Dim pageDe As Byte, pageA As Byte, chn As String
  Do
    chn = InputBox("PageDe :", "PrintPagesAB"): pageDe = Val(chn)
  Loop Until pageDe >= 0
  If pageDe = 0 Then Exit Sub
  Do
    chn = InputBox("PageDe : " & pageDe & " ; PageA :", "PrintPagesAB"): pageA = Val(chn)
  Loop Until pageA >= pageDe Or pageA = 0
  If pageA > 0 Then PrintAllPagesAB pageDe, pageA
End Sub


Sub PrintPagesX()
  Dim pageX As Byte, chn As String
  Do
    chn = InputBox("Page n° :", "PrintPagesX"): pageX = Val(chn)
  Loop Until pageX >= 0
  If pageX > 0 Then PrintAllPagesAB pageX, pageX
End Sub


Dis-moi si ça te convient ; sinon, n'hésites pas à demander toute
autre amélioration que tu jugeras utile ! À te lire.  😊
 
Messages postés
9
Date d'inscription
lundi 3 octobre 2016
Statut
Membre
Dernière intervention
10 octobre 2016

C'est parfait ! Tu es au top !
Merci
Utilisateur anonyme >
Messages postés
9
Date d'inscription
lundi 3 octobre 2016
Statut
Membre
Dernière intervention
10 octobre 2016

 
Bonsoir Flojo05,

Quand tu ne pouvais pas sortir de mon code VBA par Echap,
tu aurais pu utiliser cette combinaison de touches pour arrêter
le code VBA en cours : < Ctrl >< Pause > (ce qui équivaut à
< Ctrl >< Break >). C'est une solution de dépannage, qui ne
dispense absolument pas de corriger le programme VBA !
Mais c'est quand même mieux que d'être obligé de faire
une impression non voulue !  😉

Je n'ai pas pensé à te l'indiquer sur le moment, mais je préfère
le faire maintenant, car ça permet aussi de stopper un code
VBA qui est entré dans une boucle infinie (bug du code VBA).

Cordialement.  😊


PS : Je t'ai écris 3 MP (Messages Privés) que tu n'as pas dû voir :
il faut cliquer sur la petite enveloppe qui est en haut de ton écran,
à droite de ton pseudo (ou sur le chiffre à côté).