Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 Impression, choix de feuilles et nombre de copie

  • Initiateur de la discussion Initiateur de la discussion Tifvba
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Tifvba

XLDnaute Nouveau
Bonjour,
besoin d'aide pour définir un nombre de copie de différentes feuilles.
Sur ma feuille "Menu", je souhaite définir le nombre d'impression pour les feuilles, SF2-3-NO-G-P
donc j'ai créé un petit tableau comme suit pour mes choix :
Ongletnbre de copie
SF21
SF30
NO2
G0
P1
J'espère être suffisamment clair et que vous pourrez m'aider...
pour éclairer votre lanterne, voici une partie de mon code actuel :

VB:
Sub printsf2()

 'travail sur onglet SF2
Sheets("SERAC 2").Select
With Worksheets("SERAC 2").PageSetup

 'masque les colonne Q à S
Columns("Q:S").Select
Selection.EntireColumn.Hidden = True

 'sélection de la zone d'impression de H1 à la colonne T, jusqu'à cellule vide en J50
ActiveSheet.PageSetup.PrintArea = "h1:t" & Range("j50").End(xlUp).Row

'ajustement à une page
    .Zoom = False
    .FitToPagesTall = 1
    .FitToPagesWide = 1

    Selection.EntireColumn.Hidden = False
    Columns("O:T").Select
    Selection.EntireColumn.Hidden = False
    Columns("P:P").Select
    Selection.EntireColumn.Hidden = True

ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
    IgnorePrintAreas:=False
    Range("K1").Select

End With

  Sheets("SERAC 3").Select
     Columns("Q:S").Select
    Selection.EntireColumn.Hidden = True
    'Range("H1:T46").Select
    ActiveSheet.PageSetup.PrintArea = "h1:t" & Range("j50").End(xlUp).Row

With Worksheets("SERAC 3").PageSetup
    .Zoom = False

'ajustement à une page
    .FitToPagesTall = 1
    .FitToPagesWide = 1

    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
    IgnorePrintAreas:=False
    Selection.EntireColumn.Hidden = False
    Columns("O:T").Select
    Selection.EntireColumn.Hidden = False
    Columns("P:P").Select
    Selection.EntireColumn.Hidden = True

    Range("K1").Select

End With

Dans tous les cas, merci de m'avoir lu.
Et un grand merci à celle où celui qui saura m'aider.
 
Bonjour à toutes & à tous
Je pense que @fanfan38 veut dire qu'il a vu ta question sur un autre site or la charte de XLD dit :
"2.10 - Évitez de poser votre question sur plusieurs forums sur Internet, cette pratique s'appelle « cross posting" et elle peut être mal perçue par les membres répondant aux questions. Si vous avez déjà posté votre question ailleurs, que nous n'avez pas de réponse satisfaisante et que vous voulez la reposter sur XLD, il est possible de supprimer votre discussion sur l'autre forum.
Cela fonctionne aussi dans l'autre sens si vous souhaitez poser votre question ailleurs."

Je n'ai pas cherché sur d'autres sites où tu as déjà posté ta demande, alors je fais un effort, mais à l'avenir évite cette pratique s'il te plait.

Voilà, j'ai également créé un classeur exemple (C'est bien d'en fournir un avec la demande :
"2.5 – La possibilité de joindre des fichiers est donnée sur ce forum. Ne pas hésiter à utiliser cette fonction, tout en veillant à ce que les données soient fictives et donc qu’aucune donnée confidentielle, nominative ne soit dans le fichier.")

Un tableau dans une feuille "Tables" décrit les feuilles à imprimer :

Le code de la macro
VB:
Const C_Feuille = 1, C_Copies = 2, C_ZI = 3, C_Masquées = 4

Sub Sh_Print()
     Dim EtatAvant(1 To 13), Sh As Worksheet
     TabloSh = Sh_Tables.[TS_Print]
   
     For i = 1 To UBound(TabloSh)
          If TabloSh(i, C_Copies) > 0 Then
               Set Sh = ThisWorkbook.Worksheets(TabloSh(i, C_Feuille))
               With Sh.PageSetup
                    .PrintArea = TabloSh(i, C_ZI)
                    .FitToPagesTall = 1
                    .FitToPagesWide = 1
               End With
             
               With Sh
                    'Etat de visibilité des colonnes avant l'impression
                    j = 0
                    For Each Col In .Range(TabloSh(1, C_ZI)).EntireColumn
                         j = j + 1
                         EtatAvant(j) = Col.Hidden
                    Next
                    'Etat de visibilité des colonnes pour l'impression
                    .Range(TabloSh(1, C_ZI)).EntireColumn.Hidden = False
                    TH = Split(TabloSh(1, 4), ";")
                    For Each c In TH
                         .Columns(c).Hidden = True
                    Next
                    'impression
                    .PrintOut copies:=TabloSh(1, C_Copies), IgnorePrintAreas:=False
                    'Restitution de l'état de visibilité antérieur à l'impression
                    j = 0
                    For Each Col In .Range(TabloSh(1, C_ZI)).EntireColumn
                         j = j + 1
                         Col.Hidden = EtatAvant(j)
                    Next
                   
               End With
          End If
     Next
   
End Sub

voir la pièce jointe
Merci à l'avenir de tenir compte de la charte du site.
À bientôt
 

Pièces jointes


j'essaie d'inclure cette modif dans mon programme, pour le moment, je rame ^^
Merci beaucoup d'avoir pris le temps de gérer ma demande
 
ci-joint, un exemple de mon fichier...
je voudrais juste pouvoir mettre le nombre de copie désirée dans la feuille menu

il faut que je fasse au plus simple sans ajouter d'autre feuille pour ne pas contrarier les anciens qui n'aiment pas trop le changement ^^
et que je puisse comprendre pour faire vivre et évoluer le fichier (ce ne sera pas la chose la plus facile à faire ^^')
merci pour votre aide à tous
 

Pièces jointes

Re à tous,

bon, j'arrive à avancer à tatons ^^
j'ai modifié mon code en ajoutant après copie ce code :
Sheets("Menu").Range("E38")...

Enfin, pour chaque feuille, je vais chercher dans la cellule voulu...
peut-être pas très académique mais ça à l'air de fonctionner.

Je ne bloque que sur un dernier point, c'est si ma valeur est 0... ça me renvoie le message d'erreur, doit être compris entre 1 et ...

Je cherche comment passer à la suite si tel est le cas ^^
 
Bonsoir à toutes et à tous
bonsoir @Tifvba
pour ne pas contrarier les anciens qui n'aiment pas trop le changement
Il te suffit de masquer la feuille avec les descriptions (ma feuille "Tables")
Je ne bloque que sur un dernier point, c'est si ma valeur est 0..
Dans ma macro je fais le test si la valeur est égale à 0 je ne fais pas l'impression ...

Je n'avais pas vu que tu utilisais EXCEL2013.
Je regarde une solution "pas trop perturbante"

À bientôt
 
re,
Voici une version avec une feuilles "Tables" masquée (VeryHidden ne peut être réafficher que par sa fenêtre propriétés sous VBA)
Tout continue à se gérer à partir de ta feuille "Menu".

La feuille Tables contient un TS "TS_Print" (en rouge) lu par la macro,
Tes tables peuvent se placer dans cette feuille comme ici (en bleu).




La macro Sh_Print n'a pas changé :
VB:
Const C_Feuille = 1, C_Copies = 2, C_ZI = 3, C_Masquées = 4

Sub Sh_Print()
     Dim EtatAvant(1 To 13), Sh As Worksheet
     TabloSh = Sh_Tables.[TS_Print]
    
     For i = 1 To UBound(TabloSh)
          If TabloSh(i, C_Copies) > 0 Then
               Set Sh = ThisWorkbook.Worksheets(TabloSh(i, C_Feuille))
               With Sh.PageSetup
                    .PrintArea = TabloSh(i, C_ZI)
                    .FitToPagesTall = 1
                    .FitToPagesWide = 1
               End With
              
               With Sh
                    'Etat de visibilité des colonnes avant l'impression
                    j = 0
                    For Each Col In .Range(TabloSh(1, C_ZI)).EntireColumn
                         j = j + 1
                         EtatAvant(j) = Col.Hidden
                    Next
                    'Etat de visibilité des colonnes pour l'impression
                    .Range(TabloSh(1, C_ZI)).EntireColumn.Hidden = False
                    TH = Split(TabloSh(1, 4), ";")
                    For Each c In TH
                         .Columns(c).Hidden = True
                    Next
                    'impression
                    .PrintOut copies:=TabloSh(i, C_Copies), IgnorePrintAreas:=False
                    'Restitution de l'état de visibilité antérieur à l'impression
                    j = 0
                    For Each Col In .Range(TabloSh(i, C_ZI)).EntireColumn
                         j = j + 1
                         Col.Hidden = EtatAvant(j)
                    Next
                    
               End With
          End If
     Next
    
End Sub

Une difficulté potentielle : la détermination de la zone d'impression dans la feuille "Tables" : je suis avec une version 2021 et je me méfie des formules matricielle par défaut.

Et cette seconde macro pour aller sur tes feuilles en cliquant tes boutons de la feuille "Menu".
Une seule macro pour les 3 feuilles, évidemment tu peux ajouter d'autres boutons (la contrainte et que le texte du bouton corresponde exactement à un nom de feuille.

Code:
Sub Affiche_Feuille()

     Dim Shp As Shape
     On Error GoTo fin
     Nom_WSh = Menu.Shapes(Application.Caller).DrawingObject.Text
     Application.Goto ThisWorkbook.Worksheets(Nom_WSh).Range("I1")
     On Error GoTo 0
fin:
End Sub


Essaie cette version et tiens moi au courant.

À bientôt
 

Pièces jointes


Merci pour ton aide Alain.

très honnêtement, tout ça est très pointu pour moi ^^
beaucoup de mal à comprendre et à suivre pour faire évoluer ce que tu as envoyé.

Je vais prendre le temps de me poser et de comprendre comment le tout fonctionne et essayer de l'adapter à ce que j'ai...

Dans tous les cas, un grand merci pour l'aide que tu m'as apporté
 
Bonsoir à toute & à tous, bonsoir @Tifvba
beaucoup de mal à comprendre et à suivre
Bon alors avec des explications complémentaires peut-être ...


La feuille Tables

La définition de la zone d'impression :

Le code de la macro avec des commentaires :
VB:
'Constantes définissant le n° des colonnes dans le TS "TS_Print"
Const C_Feuille = 1, C_Copies = 2, C_ZI = 3, C_Masquées = 4


Sub Sh_Print()
     Dim EtatAvant(1 To 13), Sh As Worksheet
     'On stocke dans la tableau Vb TabloSh les valeurs du tableau structuré TS_Print
     TabloSh = Sh_Tables.[TS_Print]
    
     'On fait une boucle sur toutes les lignes de ce tableau (dans notre exemple 3 lignes)
     For i = 1 To UBound(TabloSh)
          
          If TabloSh(i, C_Copies) > 0 Then
          'si le nombre de copies demandées est supérieur à 0, alors on prépare l'impression
               'On définit la feuille à imprimer en lisant dans TabloSh la colonne contenant le nom de feuille (ici colonne C_feuille soit 1)
               Set Sh = ThisWorkbook.Worksheets(TabloSh(i, C_Feuille))
              
               With Sh.PageSetup
                    'On défini la zone d'impression en lisant dans le tableau la colonne contenant l'adresse de la zone d'impression (C_Zi =3)
                    .PrintArea = TabloSh(i, C_ZI)
                    .FitToPagesTall = 1
                    .FitToPagesWide = 1
               End With
              
               With Sh
                    'on mémorise l'état de visibilité des colonnes avant l'impression (pour pouvoir le réstituer après l'impression)
                    j = 0
                    For Each Col In .Range(TabloSh(1, C_ZI)).EntireColumn
                         j = j + 1
                         EtatAvant(j) = Col.Hidden
                    Next
                    'On rend visible toutes les colonnes de la zone d'impression
                    .Range(TabloSh(1, C_ZI)).EntireColumn.Hidden = False
                    'On lit dans TabloSh la colonne contenant les colonnes à masquer (C_Masquées =4)
                    'On découpe cette information suivant le caractère ;
                    TH = Split(TabloSh(1, 4), ";")
                    
                    'On définit l'état de visibilité des colonnes pour l'impression
                    For Each c In TH
                         .Columns(c).Hidden = True
                    Next
                    
                    'impression
                    .PrintOut copies:=TabloSh(i, C_Copies), IgnorePrintAreas:=False
                    
                    'Restitution de l'état de visibilité antérieur à l'impression
                    j = 0
                    For Each Col In .Range(TabloSh(i, C_ZI)).EntireColumn
                         j = j + 1
                         Col.Hidden = EtatAvant(j)
                    Next
                    
               End With
          End If
     Next
    
End Sub

Sub Affiche_Feuille()
     'Accède à la feuille dont le nom est contenu dans la forme que l'on a cliquer pour lancer la macro
     Dim Shp As Shape
     On Error GoTo fin
     Nom_WSh = Menu.Shapes(Application.Caller).DrawingObject.Text
     Application.GoTo ThisWorkbook.Worksheets(Nom_WSh).Range("I1")
     On Error GoTo 0
fin:
End Sub

J'ai rendu visible la feuille Tables, mais tu peux la re-masquer (soit dans EXCEl, soit dans l'éditeur VB en mettant sa propriété Visible à VeryHidden)
J'ai effacé tes tableaux pour les validations de données des feuille 'NO', 'A 2' et 'A 3' vu que je les ai placés dans la feuille 'Tables'.
Voir pièce jointe
À bientôt
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
230
Réponses
10
Affichages
603
Réponses
11
Affichages
797
Réponses
1
Affichages
837
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…