Excel: Imprimer une sélection d’onglets dans un fichier

Publié le 20 août 2013
par Sophie Marchand M.Sc., CPA, CGA, MVP

Excel: Imprimer une sélection d’onglets dans un fichier

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 l’ensemble ou une sélection d’onglets de votre fichier. 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.

.

Étapes à suivre pour créer l’interface d’impression

.

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.

.
VBA impression

.

4. Insérez la macro suivante pour l’impression:

 
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é!

 

CFO-Masque_Formations-en-ligne_FB Le CFO masqué offre un vaste choix de formations en informatique décisionnelle avec Excel et Power BI, via un portail en ligne et à distance en temps réel, selon un calendrier. Si vous désirez organiser des formations privées, faites nous simplement parvenir un courriel à info@lecfomasque.com . Des certificats convenant aux normes de formation continue des divers ordres professionnels du Québec sont offerts pour l'ensemble des formations.  

Découvrez quelles formations vous conviennent

 

46 réflexions sur “Excel: Imprimer une sélection d’onglets dans un fichier”

  1. Ping : Excel: Imprimer une sélection d’on...

  2. Ping : Excel: Imprimer une sélection d'onglets ...

    1. 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

        1. 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

        2. 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 !

  3. 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

  4. Francis Paquet, M.Sc., ing., EEE

    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

  5. 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

  6. 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…

  7. 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?

    1. Francis Paquet, M.Sc., ing., EEE

      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

  8. 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!

    1. Francis Paquet, M.Sc., ing., EEE

      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

  9. 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.

    1. Francis Paquet, M.Sc., ing., EEE

      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

  10. Tout fonctionne parfaitement, il ne faut surtout pas oublier de créer la liste des onglets avant d’éditer cette macro. Merci pour tout.

  11. 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 !)

  12. Francis Paquet, M.Sc., ing., EEE

    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

  13. 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

    1. Francis Paquet, M.Sc., ing., EEE

      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

  14. 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

  15. 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.

    1. Francis Paquet, M.Sc., ing., EEE

      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

  16. 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]

  17. 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?

  18. 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

  19. 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

  20. 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

    1. 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

  21. 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

  22. 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

  23. 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

  24. 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

  25. 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…

  26. 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

    1. Fred,
      Malheureusement, cela ne peut se faire. Excel va toujours imprimer les feuilles dans l’ordre où elles apparaissent dans le fichier.
      Francis

  27. 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,

    1. 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?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Scroll to Top