Il y a quelques temps, nous avons publié sur ce blogue un code VBA permettant de dresser rapidement la liste de tous les onglets d’un fichier Excel (si vous souhaitez relire cet article, le revoici: Excel: Créer automatiquement la liste des noms d’onglets d’un fichier). Aujourd’hui, nous donnons suite à cet article en partageant avec vous un code VBA qui vous permettra d’imprimer une sélection d’onglets de votre fichier Excel. L’idée est de permettre au créateur du fichier Excel de créer rapidement une interface d’impression facile à utiliser et à personnaliser par l’usager du fichier Excel.
Créer une interface pour imprimer une sélection d’onglets d’un fichier Excel
1. Effectuez la mise en page de chacun des onglets.
2. Utilisez la macro décrite dans l’article Excel: Créer automatiquement la liste des noms d’onglets d’un fichier pour dresser la liste de vos onglets. Assurez-vous que cette liste commence dans la cellule B5.
3. Insérez une colonne de 1 et de 0 à partir de la cellule C5, i.e. à côté de chacun des noms d’onglets. Montrez clairement à l’utilistateur qu’il doit insérer un 1 à côté des onglets qu’il souhaite imprimer.
4. Insérez la macro suivante pour l’impression d’une sélection d’onglets d’un fichier Excel :
Sub Imprime_Feuilles() ' Macro Imprime_Feuilles> ' par Le CFO masqué Dim vararray() As String Dim csname as Integer, c as Integer Dim countarr as Integer, r as Integer Dim sname as Worksheet 'set up location and counter variables csname = Range("B5").Column c = Range("C5").Column Set sname = ActiveSheet r = Range("C5").Row countarr = 0 'loop in sheets list While sname.Cells(r, csname) <> "" 'add to array if flag is on If sname.Cells(r, c) = 1 Then ReDim Preserve vararray(countarr) vararray(countarr) = sname.Cells(r, csname).Value countarr = countarr + 1 End If r = r + 1 Wend Sheets(vararray).Select ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True sname.Activate End Sub
Et voilà, le tour est joué!
Ping : Excel: Imprimer une sélection d’on...
Ping : Excel: Imprimer une sélection d'onglets ...
Bonjour,
C’est la macro dont je rêvais !
Malheureusement, j’ai un bug au niveau de la ligne Sheets(vararray).Select, et je ne sais pas le résoudre.
Pouvez-vous m’aider ?
Merci d’avance.
Thierry
Thierry,
Quel est le message d’erreur? Êtes-vous sûr qu’il y a un 1 vis-à-vis au moins une des feuilles?
Francis
Bonjour,
Il y a une erreur d’exécution “1004” : La méthode de la classe Sheets a échoué.
En cliquant sur Débogage, je suis dirigé vers la commande “Sheets(vararray).Select” qui est surlignée en jaune.
A noter que j’ai correctement renseigné les cellules de la colonne C (à partir de C5) avec des 0 ou des 1 en vis-à-vis des feuilles à imprimer (ou pas).
Merci de votre réactivité.
Thierry
Re-bonjour,
Le problème venait du fait que mon classeur contenait un nombre important de feuilles masquées.
Une fois ces dernières affichées, tout fonctionne et plus de message d’erreur !
Merci !
Bonjour et très bonne année 2015 🙂
Je viens de tomber sur votre code VBA pour créer une interface d’impression qui correspond exactement à ce dont j’aurais besoin.
Débutant en vba je n’arrive pas à compléter la ligne : “While sname.Cells(r, csname) « »” pour que la macro fonctionne.
Merci de votre réponse.
Valéry
Bonjour Valéry,
Le problème que vous rencontrez en est un de traduction des signes entre l’éditeur du blogue et le fureteur Internet. La commande doit se lire:
While sname.Cells(r, csname) <> “”
Donc avec un double guillemet.
Bonne chance,
Francis
Valéry, il faut donc remplacer le “” par un double guillemet…
Francis
Merci beaucoup Francis, la marco fonctionne parfaitement, je vais de ce pas l’insérer dans mon fichier excel.
Sans abuser de votre temps est-il possible, avant de lancer l’impression, de choisir le numéro de page à imprimer ? – numéro de page identique pour tous les onglets –
En vous remerciant pour votre aide,
Valéry
Bonjour Francis, j’ai le même soucis que Valéry, mais je n’arrive pas à le résoudre… J’ai essayé différentes syntaxes et le problème persiste…
Bonjour,
Même si votre publication date je tente ma chance…
Lorsque j’exécute le code un message d’erreur 1004 la méthode Select de la classe Sheets a échouée
Malgré mes recherches je n’arrive pas à résoudre ce problème.
Pouvez vous m’expliquer comment y remédier?
Fanny,
Je vous invite à regarder le code VBA de nouveau, que je viens de modifier dans l’article. Si vous avez encore des difficultés, laissez-moi savoir.
Merci,
Francis
Bonjour,
merci pour ces super macros!
Est-ce que vous pourriez expliquer comment on peut modifier cette macro pour ne pas envoyer les feuilles directement à l’imprimante, mais pour s’arrêter aux options d’impression? En fait ce que je cherche à faire c’est de sélectionner certains onglets pour les convertir en pdf, avant de les imprimer.
Merci d’avance!
Anna,
Remplacez la commande ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True par ActiveWindow.SelectedSheets.PrintPreview
Cela va ouvrir l’aperçu avant impression et vous pourrez en faire ce que vous voulez à partir de ce point.
Il est également possible de sauvegarder le tout directement en PDF avec une commande du genre
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=”Votre Nom de fichier.pdf” _
, Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
:=False, OpenAfterPublish:=False
BOnne chance,
Francis
Bonjour,
Merci pour cette petite macro très efficace. Peut-on avoir avoir la même chose via une liste de sélection de type Userform?
Cordialement.
Benjamin,
Je ne suis moi-même pas un expert en UserFOrm, mais comme un tel formulaire est créé en VBA, j’imagine donc que vous pourriez effectivement géré le tout avec un UserForm afin de choisir les onglets à imprimer. Une des difficulté est que, dans l’exemple en Excel, on fait la liste des feuilles que nous désirons potentiellement imprimer. Certaines feuilles sont cachées ou on ne désire pas les imprimer et elles ne sont donc pas sur la liste. Ce choix, avec un UserForm, peut, selon moi, s’avérer difficile. À la fin de la journée, vous décidez de la manière que vous voulez développer votre solution.
FRancis
Tout fonctionne parfaitement, il ne faut surtout pas oublier de créer la liste des onglets avant d’éditer cette macro. Merci pour tout.
Bonjour,
J’ai appliqué tout ça avec la modification qui permet d’intercepter les feuilles pour changer la mise en page.
Ca marche très bien, mais (il y a toujours un “mais”), je ne peut plus faire de zone d’impression dans mes onglets. En effet, j’ai besoin d’imprimer mes multiples ongles, mais pas l’intégralité des tableaux à l’intérieur . En effet, je n’en suis qu’au début de mon projet et les tableaux ne sont pas remplis entièrement !
Comment résoudre ce problème ?
Par ailleurs, quand j’arrive dans la page “aperçu avant impression”, les modifications de mise en page ne s’applique qu’à la page en cours (sur les 17)…
Breffi breffouille, je débute avec les macros et je suis perdue! Pourriez vous m’aidez ?
(Merci pour vote site web !)
Alex,
Cette macro ne fait que choisir les feuilles à imprimer. Elle ne fait pas de mise en page pour impression, vous devez donc faire cela manuellement, et ce pour chaque feuille. Si la macro affiche l’aperçu avant impression, vous pourrez alors naviguer dans l’ensemble des pages imprimées et valider si votre mise en page est OK.
Il n’y a malheureusement pas de magie…
Francis
Merci Beaucoup ! C’est déjà très très magique comme ça !
Bonsoir,
Merci bcp pr ce tuto et ces macros très utiles
J’ai exécuté la macro snamelist et je retrouve bien ma liste d’onglets avec un début en cellule B5
J’ai placé un bouton exécutant la macro Imprime_Feuilles.
J’ai réglé mes paramètres d’impression sur une impression pdf via Nitro
Lorsque je lance mon impression en sélectionnant mes 2 premiers onglets et en donnant un nom à mon fichier j’obtiens bien un pdf de 2 feuilles : nickel. Si je sélectionne le 3ieme onglet et entre le nom, j’obtiens un document pdf des 2 premiers onglets et une fenêtre de popup s’ouvre me demandant un nom pour un nouveau document, qui génère alors un autre document pdf d’une seule page correspondant à ce 3ieme onglet. J’espère être clair dans mes explications.
Mon classeur comporte 12 onglets et j’ai le même problème avec le 7ieme onglet
Les noms de ces 2 onglets qui posent problème ne comportent ni accent, ni caractère spécial.
Une explication ?
Merci encore pr cette aide précieuse
Patrick
Patrick,
Vous tentez, je pense, d’appliquer une bonne médecine au mauvais problème. Je m’explique: Même si cette macro peut être utilisée afin d’imprimer sur une imprimante qui en fait est une application qui permet de sauvegarder en PDF, le mieux est de modifier cette macro afin de demander à l’usager le nom complet du fichier et d’exporter les feuilles actives en format PDF. Donc, le coeur de cette macro devrait être considérablement modifié à cette fin…
Francis
Francis,
Merci pour votre réponse rapide … que je ne comprends pas complètement :
Si je sélectionne une imprimante “classique” et que je demande une impression des 3 premiers onglets, cela fonctionne parfaitement.
En revanche lorsque je bascule sur une imprimante “pdf” j’ai toujours ce pb avec ces 2 même onglets (4 et 8 en fait).
Comment expliquez-vous cette différence ?
Est ce que l’envoi de mon fichier en MP pourrais vous éclairer dans votre analyse ?
Merci encore pr le temps consacré
Patrick
Impression classique des onglets 2, 3 & 4 pardon
Patrick,
Je vous invite à consulter le billet récent qui vous explique comment sauvegarder en PDF https://www.lecfomasque.com/excel-sauvegarder-des-onglets-excel-dans-un-fichier-pdf/
Francis
Cette nouvelle macro fonctionne parfaitement chez moi.
Merci beaucoup Francis !
Bonjour.
Peut-on imprimer plusieurs onglets, mais dans plusieurs fichiers pdf. Ex onglet 1 et 2 pour un fichier, onglet 3 sur un fichier différent, etc.
Merci.
M. Arsenault,
Pour sauvegarder en PDF, il est préférable (avec Excel 2007 et +) de lire mon billet https://www.lecfomasque.com/excel-sauvegarder-des-onglets-excel-dans-un-fichier-pdf/ . Si vous devez sauvegarder dans des fichiers différents,je vois 2 possibilités:
1- Vous faites rouler la procédure plusieurs fois en mettant 1 vis-à-vis les onglets requis à chaque fois (la première fois vis-à-vis les onglets 1 et 2, la deuxième fois vis-à-vis l’onglet 3, et ainsi de suite);
2- Vous modifiez la procédure afin de définir plusieurs sauvegardes dans la même opération. Pour ce faire, vous créez de nouvelles colonnes avec des 0 et des 1 et vous modifiez la macro VBA afin de boucler sur ces nouvelles colonnes. Donc, si vous définissez 4 colonnes (au lieu d’une dans notre exemple), la macro modifiée va créer 4 fichiers selon les choix inscrits dans chaque colonne. Évidemment, ce dernier choix suppose que vous pourrez faire les modifications requises à la macro VBA.
Francis
Bonjour,
Très bonne base de code. Voici une alternative sans passer par la sélection et avec un formatage automatique des cellules.
[code]
‘Par Le CFO Masqué
‘Modifié par Lyunxa
‘Ici on défini le nom de l’onglet d’impression
Const NomOnglet = “Onglet Impression”
‘Fonction d’actualisation des onglets à imprimer
Sub Snamelist()
Dim i As Integer ‘definition de la variable i comme entier
Application.ScreenUpdating = False ‘Désactive le rafraichissement de l’écran
Sheets(NomOnglet).Range(“B5:C100”).Clear ‘Supprime les colonnes B et C de l’onglet d’impression
For i = 1 To Sheets.Count
Sheets(NomOnglet).Range(“B” & 4 + i).Value = Sheets(i).Name ‘Liste les onglets colonne B
With Sheets(NomOnglet).Range(“B” & 4 + i & “:C” & 4 + i).Borders ‘Affecte le format aux colonnes B et C
.LineStyle = xlContinous
.Color = vbBlack
.Weight = xlThin
End With
Next i
Columns(“B:B”).EntireColumn.AutoFit ‘Règle la largeur de la colonne B
Application.ScreenUpdating = True ‘Réactive le rafraichissement d’affichage
End Sub
Sub Imprime_Feuilles()
‘initialisation des variables
Dim vararray() As String ‘chaine de carateres
Dim csname As Integer, c As Integer ‘entier
Dim countarr As Integer, r As Integer ‘entier
Dim sname As Worksheet ‘objet feuille=onglet
‘set up location and counter variables
Set sname = Sheets(NomOnglet)
csname = sname.Range(“B5”).Column
c = sname.Range(“C5”).Column
r = sname.Range(“C5”).Row
countarr = 0
‘loop in sheets list
While sname.Cells(r, csname) “”
‘add to array if flag is on ‘recupère les onglets à imprimer
If sname.Cells(r, c) = 1 Then
ReDim Preserve vararray(countarr)
vararray(countarr) = sname.Cells(r, csname).Value
countarr = countarr + 1
End If
r = r + 1
Wend
‘Imprime
Sheets(vararray).PrintOut Copies:=1, Collate:=True
sname.Activate
End Sub
[/code]
Bonjour,
je viens d’appliquer votre macro qui est parfaite.
cependant, lorsque j’imprime, l’impression e fait en recto/verso, et ce, même si j’ai changer les parametre d’impression de mon fichier.
Pouvez-vous m’aider?
Grégory,
L’impression recto/verso est une configuration de votre pilote d’imprimante et ne peut être géré par Excel. Je vous invite donc à examiner les paramètres de configuration de votre pilote d’imprimante.
Francis
Bonjour,
Je vous remercie pour cette macro.
En l’exécutant , j’obtiens une erreur d’exécution ’13’ : incompatibilité de type et ensuite cette partie en mise en surbrillance jaune : Sheets(vararray).Select
Pouvez vous m’aider svp?
Merci
Bonjour Muqtadir,
Si la macro ne fonctionne pas, il peut y avoir 2 raisons:
1- Vous n’avez pas sélectionné de feuilles à imprimer;
2- Une des feuilles est masquée. En effet, la macro va tout de même l’identifier, mais une feuille nasqueé ne peut être choisie pour l’impression.
Voilà,
Francis
Bonjour
Jai que question sur la macro permettant d’imprimer les onglets selon le code appliqué.
J’ai bien compris que la macro imprime uniquement les feuilles non masquées.
Peut on mettre un code complémentaires pour imprimer les feuilles masquées ?
ou faut-il faire autrement ?
Merci d’avance de votre aide
Redouane
bonjour,
merci ce code m’est très utile, cependant j’aimerai pourvoir imprimer 10 fois la page 1 10 fois la page 2 etc … j’ai changé nombre de copie mais toutes les pages s’impriment les unes après les autres or c’est pas ce que je veux et je suis un peu coincé si c’est possible pour vous de m’aider
Abby,
J’ai fait quelques tests et votre demande est loin d’être triviale! En effet, il s’agit sans doute de configurer une imprimante davantage que de programme du VBA sous Excel!
Donc, je ne crois pas que ce soit ni une tâche facile, ni une approche adéquate de faire une telle chose en VBA sous Excel, car chaque imprimante et pilote d’imprimante aura ses propres paramètres de configuration…
J’ai essayé et je ne suis même pas capable de faire directement ce que vous demandez, sans utiliser la macro!
Donc, cela sort du cadre de ce que nous voulions accomplir ici!
Désolé!
Francis
Bonjour
J ai testé votre macro
Sa fonctionne très bien
J ai juste une question
Comment faire de même en ayant par exemple les 15 premiers onglets invisible (2)
Dans mon cas le premier onglet est visible la ok sa fonctionne
Mon cond onglet invisible sa ne fonctionne plus
Je ne sais pas comment faire
Merci de votre aide
Bonjour,
Il n’y a malheureusement pas de miracles… Si les feuilles sont masquées, elles ne peuvent être imprimées…
Bonjour,
Je débute dans les macros, j’ai réussi à faire ma liste d’onglet (snamelist) sans difficultés, par contre sur la macro pour imprimer ma sélection d’onglet, j’ai un bug sur la ligne :
If sname.Cells(r, c) = 1 Then ==> (sname.Cells(r, c) erreur=2042)
Pouvez-vous me guider ??? D’avance un grand merci
Merci de votre retour
Bonjour,
Êtes-vous sûr que toutes vos feuilles sont visibles! Si une feuille choisie est masquée, l’impression ne peut se faire et la macro va envoyer ce genre de message d’erreurs…
Bonjour,
Votre macro fonctionne super bien et je vous en remercie.
Néanmoins, j’aimerais maintenant faire la même chose mais au lieu de mettre des 1 et 0 mais mettre l’ordre d’impression 1, 0 , 2, 4 , 5.
J’aimerais en fait trouver un moyen d’imprimer certaines feuilles mais dans un certain ordre.
Merci d’avance pour vos conseils
Fred,
Malheureusement, cela ne peut se faire. Excel va toujours imprimer les feuilles dans l’ordre où elles apparaissent dans le fichier.
Francis
Merci Francis pour la réponse rapide,
Je vais donc multiplier les feuilles et les faire sélectionner celles que je veux imprimer pour permettre un certain ordre… un peu du bricolage mais j’ai pas le choix…
Excellent week-end,
Bonjour Francis,
J’ai encore une question, peut-on imprimer le classeur en recto mais les feuilles en recto-verso ?
Merci d’avance,
Fred,
L’impression recto seulement ou recto/verso est un paramètre du pilote de l’imprimante. Il est excessivement laborieux de gérer ces paramètres (qui sont souvent différents d’un pilote à l’autre) à partir de VBA dans Excel!
Donc, la réponse courte est : Il est préférable de ne pas envisager cela!
La réponse longue : Moi-même, je ne saurais pas comment le faire, mais il est probable que cela peut se faire…
Également, je n’étais pas sûr de bien comprendre votre point: imprimer le classeur (qui est un ramassis de feuilles) en recto seulement, mais les feuilles en recto/verso? Que voulez-vous dire au juste?
Bonjour,
Macro fonctionnant parfaitement mais comment peut ton exporter les feuilles sélectionnés dans un PDF en sortie au lieu d’une impression standard ?
Merci !
Emmanuel
Re
J’ai trouvé pour imprimer en sortie avec Microsoft To PDF. C’est pas ce qu’il y a de mieux mais ça fonctionne.
Sheets(vararray).Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, ActivePrinter:=”Microsoft Print to PDF”
sname.Activate
Bonjour Emmanuel,
Nous avons un article qui démontre le tout ici: https://www.lecfomasque.com/excel-sauvegarder-des-onglets-excel-dans-un-fichier-pdf/
Bonne journée!
Kim
Bonjour KIM LEBLANC,
Merci pour le soutien que vous nous apportez. la macro fonctionne tres bien, seulement mon probleme est de pouvoir imprimer des nombres de feuiiles differentes du classeur saisies dans un tableau. Merci
Bonjour,
Je vous propose de poser votre question sur le Forum du CFO masqué. Un membre de la communauté pourra peut-être vous aider à résoudre votre problème.
Forums Archive – Le CFO masqué (lecfomasque.com)
Au plaisir,
Kim