Imprimer Sélection sur plusieurs feuilles.

Résolu/Fermé
Nai Messages postés 707 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 11 octobre 2024 - 20 mars 2015 à 10:48
Nai Messages postés 707 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 11 octobre 2024 - 12 mai 2015 à 13:27
Bonjour :)
Je souhaite pouvoir imprimer la sélectionner de chacune des feuilles sélectionnées.
Je m'explique :
Sub Test_Imprime_P1()
Sheets(10).Select
Range("A34:K91").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWindow.Selection.PrintPreview
End Sub

Ce code me sélectionne la feuille numéro 10 (je ne peux pas nommer la feuille puisqu'elle est amené à changer de nom). Il me sélectionne la zone A34:K91 de la feuille sélectionnée, puis me propose l'aperçu avant impression.

Je souhaite effectuer la même chose, mais sur 30 feuilles. J'ai pensé à :
Sub Test_Imprime_P1()
Worksheets(Array((10), (11), (12), (13))).Select 'le mieux serait de pouvoir indiquer de 2 à 16 ET de 27 à 41
Range("A34:K91").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWindow.Selection.PrintPreview
End Sub

Mais ça ne marche pas :/

Aussi, plutôt que le PrintPreview, j'aurais préféré que la macro me renvoi vers l'onglet Imprimer du menu d'Excel. Ca permettra à l'utilisateur non seulement de prévisualiser son impression, mais aussi de modifier ses préférences d'impression.

Merci d'avance de votre aide ! :)



A voir également:

7 réponses

cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
22 mars 2015 à 16:25
Voir ceci pour imprimer directement sans prévisualisation:

https://silkyroad.developpez.com/VBA/FeuilleDeCalcul/#LII-A-19
1
Nai Messages postés 707 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 11 octobre 2024 55
22 mars 2015 à 20:09
Très intéressante cette liste :)
Mais ce n'est pas ce que je cherche ^^
Je suis parvenu à ceci :
Sub macro()
Dim Feuille
For Each Feuille In ActiveWorkbook.Sheets
 If Feuille.Index > 1 And Feuille.Index < 16 Then
 Feuille.Select
  Range("A34:K91").Select
  End If
Next
Sheets(Array((2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16))).PrintOut Copies:=1, _
Collate:=True
End Sub

L'argument Collate me faisait défaut. Là, tout fonctionne, à une exception : Pas d'aperçu :/ Le document est assemblé et imprimé sans aperçu et sans pouvoir sélectionner l'imprimante à utiliser.
A ce propos, j'aurais pu utiliser l'argument ActivePrinter, mais cela ne fait que choisir l'imprimante, toujours sans afficher l'aperçu :/
J'ai besoin que l'utilisateur puisse avoir un aperçu avant impression. Problème, quand je tente :
Sub macro()
Dim Feuille
For Each Feuille In ActiveWorkbook.Sheets
 If Feuille.Index > 1 And Feuille.Index < 16 Then
 Feuille.Select
  Range("A34:K91").Select
  End If
Next
Sheets(Array((2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16))).PrintPreview Collate:=True
End Sub
ou
Sub macro()
Dim Feuille
For Each Feuille In ActiveWorkbook.Sheets
 If Feuille.Index > 1 And Feuille.Index < 16 Then
 Feuille.Select
  Range("A34:K91").Select
  End If
Next
Sheets(Array((2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16))).PrintPreview Copies:=1, _
Collate:=True
End Sub

Ca ne marche pas :/

On est pas loin du bout ! :)
Encore merci !
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
23 mars 2015 à 08:09
Si la 1ère macro fonctionne, pourquoi ne pas mettre cela au début de la macro avant la boucle. Elle ne s'affichera qu'une fois seulement et l'utilisateur pourra faire son choix:

 Sheets("nom de la 1ère feuille").Range("A34:K91").Select
Application.Dialogs(xlDialogPrint).Show
ActiveWindow.Selection.PrintPreview 

1
Nai Messages postés 707 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 11 octobre 2024 55
24 avril 2015 à 19:34
Merci et désolé pour le temps de réaction ^^

La macro donne donc ceci :
Sub print_p1()

Sheets("Accueil").Range("A34:K91").Select
Application.Dialogs(xlDialogPrint).Show
ActiveWindow.Selection.PrintPreview

Dim Feuille
For Each Feuille In ActiveWorkbook.Sheets
 If Feuille.Index > 1 And Feuille.Index < 16 Then
 Feuille.Select
  Range("A34:K91").Select
  End If
Next
Sheets(Array((2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16))).PrintOut Copies:=1, _
ActivePrinter:="", _
Collate:=True
End Sub

Ça fonctionne relativement bien ! :D
Les seuls hics, mais je chipote un soupçon :
- La macro a pour effet de lancer deux impressions distinctes (mais qu'importe).
- Par contre, je n'ai l'aperçu que de la première feuille (finalement, ça importe moins que je ne le pensais)
- Plus important, est-ce qu'il est possible de ne pas nommer la feuille par son nom mais par son chiffre (en l'occurrence, "Feuil2" et non "Machin") ?
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
2 mai 2015 à 15:41
Oui l'on peut nommer son nom par son chiffre, c'est le CodeName. Voir ceci:

'http://silkyroad.developpez.com/VBA/FeuilleDeCalcul/
Dim Ws As Worksheet
'Boucle sur toutes les feuille de calcul du classeur. Les onglets graphiques ne sont pas pris
'en compte.
'ThisWorkbook correspond à l'objet classeur contenant la macro
For Each Ws In ThisWorkbook.Worksheets
    'Renvoie le CodeName de chaque feuille
    MsgBox Ws.CodeName
Next Ws


Je pense que vu tes connaissances tu pourras l'adapter à tes besoins
1
Nai Messages postés 707 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 11 octobre 2024 55
4 mai 2015 à 20:46
Merci pour cette réponse :)
J'ai résolu le problème avec :
Sub print_p1()
Application.ScreenUpdating = False
Dim Feuille
For Each Feuille In ActiveWorkbook.Sheets
 If Feuille.Index > 1 And Feuille.Index < 31 Then
 Feuille.Select
 Range("A34:K91").Select
  End If
Next
Application.Dialogs(xlDialogPrint).Show
Sheets(Array((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))).PrintOut Copies:=1, _
ActivePrinter:="", _
Collate:=True
Call Impression.selectionner
Application.ScreenUpdating = True
End Sub

Mais je ne comprend pas, j'ai plusieurs impression (dont certaines non demandées). Si j'ai bien compris, le Sheets array demande le numéro de la feuille dans l'ordre d'affichage. Ce sont donc les 30 premières feuilles à partir de la deuxième. Mais je n'indique donc pas le numéro spécifique de la feuille (Feuil1, Feuil2, etc...)
Qu'est-ce que ça imprime de votre côté ? https://www.cjoint.com/c/EEeuZs4bfbT
0
Nai Messages postés 707 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 11 octobre 2024 55
4 mai 2015 à 20:48
J'ai également deux fois la feuille de l'atelier 14 (Feuil40)...
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
9 mai 2015 à 08:48
si tu m'avais dit cela dès le départ, on aurait perdu moins de temps!!

Ça t'imprime les ateliers Machin à Plantes et 1 à 15 ?


Le problème vient de la sélection des feuilles. Je ne peux pas deviner les feuilles à copier quand tu mets:

Sheets(Array((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))).PrintOut Copies:=1, _
ActivePrinter:="", _
Collate:=True


pour moi ceux sont les feuilles de 2 à 31!

voici donc le code qui fonctionne pour imprimer les feuilles Machin à Plantes et les feuilles de 1 à 15:

Sub print_p1()
Application.ScreenUpdating = False
Dim Feuille
For Each Feuille In ActiveWorkbook.Sheets
 If Feuille.Index > 1 And Feuille.Index < 17 Then 'Feuilles Machin à Plantes
 Feuille.Select
 Range("A34:K91").Select
 Worksheets(Feuille.Name).PrintOut Copies:=1, _
ActivePrinter:="", _
Collate:=True
Call Impression.selectionner
End If
Next
For Each Feuille In ActiveWorkbook.Sheets
 If Feuille.Name >= 1 And Feuille.Name <= 15 Then 'Feuille' de 1 à 15
Feuille.Select
 Range("A34:K91").Select
 Worksheets(Feuille.Name).PrintOut Copies:=1, _
ActivePrinter:="", _
Collate:=True
Call Impression.selectionner
End If
Next
Application.ScreenUpdating = True
End Sub


a adapter pour les autres impressions.

1
Nai Messages postés 707 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 11 octobre 2024 55
12 mai 2015 à 11:38
Désolé. Je tâcherais d'être plus précis à l'avenir ;)

Effectivement, ça fonctionne beaucoup mieux ^^
Aussi, peut-on faire apparaître la boite de dialogue de l'imprimante (une seule fois) ? Mon impression (recto verso) place la reliure sur le haut, je voudrais pouvoir la placer à gauche.

Merci infiniment ! :)
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
12 mai 2015 à 12:00
C'est simple, comme ceci:

Sub print_p1()
Application.ScreenUpdating = False
Dim Feuille
Application.Dialogs(xlDialogPrint).Show 'affiche la boite de dialogue
For Each Feuille In ActiveWorkbook.Sheets
 If Feuille.Index > 1 And Feuille.Index < 17 Then 'Feuilles Machin à Plantes
 Feuille.Select
 Range("A34:K91").Select
 Worksheets(Feuille.Name).PrintOut Copies:=1, _
ActivePrinter:="", _
Collate:=True
Call Impression.selectionner
End If
Next
For Each Feuille In ActiveWorkbook.Sheets
 If Feuille.Name >= 1 And Feuille.Name <= 15 Then 'Feuilles de 1 à 15
Feuille.Select
 Range("A34:K91").Select
 Worksheets(Feuille.Name).PrintOut Copies:=1, _
ActivePrinter:="", _
Collate:=True
Call Impression.selectionner
End If
Next
Application.ScreenUpdating = True
End Sub
0
Nai Messages postés 707 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 11 octobre 2024 55
12 mai 2015 à 13:27
Parfait !
Si seulement j'avais été clair plus tôt ;)

Merci !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
20 mars 2015 à 12:07
Bonjour,

Peut-être cela:

Application.Dialogs(xlDialogPrint).Show


0
Nai Messages postés 707 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 11 octobre 2024 55
20 mars 2015 à 14:13
Bonjour Le Pivert et merci :)
Je suppose à la place de :
ActiveWindow.Selection.PrintPreview

Si oui, ça fonctionne presque. La boite de dialogue de l'imprimante s'ouvre en effet mais c'est la feuille active qui est cochée pour l'impression et non la sélection.
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
20 mars 2015 à 17:47
Essaie ceci:

Sub parcourir()
Dim feuille
For Each feuille In ActiveWorkbook.Sheets
 If feuille.Index > 1 And feuille.Index < 16 Then
 feuille.Select
  Range("A1:K91").Select
Range(Selection, Selection.End(xlDown)).Select
'ActiveWindow.Selection.PrintPreview ' au choix
Application.Dialogs(xlDialogPrint).Show ' au choix
End If
 Next
End Sub


0
Nai Messages postés 707 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 11 octobre 2024 55
22 mars 2015 à 15:16
Merci pour cette réponse ! C'est super, ça fonctionne ^^
Cependant, je dois accepter l'impression de chacune des feuilles. N'est-il pas possible d'afficher toutes les sélections pour une seule impression ?
J'ai choisi :
ActiveWindow.Selection.PrintPreview ' au choix

Lorsque je lance la macro, j'ai l'aperçu de la sélection de la première feuille. J'imprime, et je passe à l'aperçu de la deuxième feuille, j'imprime, etc... pour les 16 feuilles.

En tout cas, encore merci !
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
5 mai 2015 à 11:01
Essaie ceci:

Sub print_p1()
Application.ScreenUpdating = False
Dim Feuille
For Each Feuille In ActiveWorkbook.Sheets
 If Feuille.Name > 1 And Feuille.Name < 31 Then
 Feuille.Select
 Range("A34:K91").Select
 Worksheets(Feuille.Name).PrintOut Copies:=1, _
ActivePrinter:="", _
Collate:=True
Call Impression.selectionner
End If
Next
Application.ScreenUpdating = True
End Sub


a adapter pour les autres impressions
0
Nai Messages postés 707 Date d'inscription vendredi 29 avril 2005 Statut Membre Dernière intervention 11 octobre 2024 55
8 mai 2015 à 23:31
Ça fonctionne correctement chez toi ?
Ça t'imprime les ateliers Machin à Plantes et 1 à 15 ?

Cette fois, je n'ai que les ateliers 2 à 15 :O
J'ai tenté sans le :
Call Impression.selectionner

Des fois que ce soit ça qui gêne, mais non...

En tout cas, merci pour ta patience :)
0