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 !
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 :
Onglet
nbre de copie
SF2
1
SF3
0
NO
2
G
0
P
1
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
Impression, choix de feuilles et nombre de copie.xlsm
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.")
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
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
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
Impression choix de feuilles et nombre de copies.xlsm
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".Regarde la pièce jointe 1217137
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).
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
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
Impression choix de feuilles et nombre de copies 3.xlsm
- 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