Comment imprimer des feuilles masquées dans le classeur ?

Résolu
Bonjour,

J'ai dans mon classeur 60 feuilles de même format mais masquées (1 feuille correspond à 1 page) et je peux afficher chacune de ces feuilles à partir de plusieurs boutons insérés dans 1 feuille précise du classeur, exemple, la feuille "WS". Pour le moment, si je veux imprimer 1 de ces feuilles masquées , la feuil "A" par exemple, je clic sur un bouton correspondant de feuil "WS" pour afficher cette feuil "A" avant de l'imprimer.
Sur chaque page à imprimer il y a un bouton "Retour" pour la fermer après impression et retourner à la feuille "WS" de départ où se trouvent les boutons sur lesquels je clic pour ouvrir ces feuilles masquées.
Je me suis rendu compte que cette façon de faire est fastidieuse pour imprimer les 60 pages.

Alors je demande s'il y a une solution pour imprimer en boucle une partie ou toutes ces 60 pages de feuilles masquées à partir d'un seul bouton inséré quelque part dans le classeur ou dans la feuille "WS".
Merci d'avance à toute la communauté de CCM.

5 réponses

Résumé de la discussion

Cette discussion porte sur l'impression en boucle de feuilles masquées dans Excel à partir d'un seul bouton, afin d'éviter d'ouvrir chaque feuille manuellement avant impression. Une solution répandue consiste à parcourir ActiveWorkbook.Sheets, afficher temporairement les feuilles dont le nom contient NevalA, imprimer, puis les masquer à nouveau, avec éventuel contrôle via InStr et PrintOut. Des difficultés surviennent, notamment l'erreur 1004 lors du passage de Visible, amenant certains auteurs à envisager des approches sans affichage préalable ou des conditions sur des valeurs comme C20. Certaines propositions avancent d'imprimer uniquement les feuilles NevalA dont C20>0, via une condition dans la boucle et une boîte de dialogue de confirmation, apportant une solution plus économe en papier et en encre.

Bobot (l’IA à votre service)
  1. Contributeur
    Bonjour,

    Il faut effectivement faire une boucle sur les feuilles, les afficher puis imprimer et les masquer comme ceci :
    Public Sub imprime()
    Dim feu As Worksheet
    For Each feu In ActiveWorkbook.Sheets
        If feu.Name <> "WS" Then
            feu.Visible = xlSheetVisible
            feu.PrintOut
            feu.Visible = xlSheetHidden
        End If
    Next feu
    End Sub
    
    0
    1. Bonjour,
      Vous m'excusez pour le retard par rapport à ma réaction.
      J'ai essayé votre solution mais toutes toutes les feuilles et toutes les pages du classeur ont été imprimées avec 1 bug n° 1004 : la méthode "visible" de l'objet "worksheet" a échoué
      Je précise :
      - les feuil à imprimer (60 au total) se nomment "NevalA1" jusqu' à "NevalA60";
      - j'ai affecté à chacune de ces 60 feuil 2 macros (écrites automatiquement par la machine après lancement de création de macros) : Pour la feuil "NevalA59", la macro A qui permet de l'afficher à partir de la feuil "SevalA" est écrite comme suit:
      Sub macroA
      Sheets("Neval59").Visible = True
      Sheets("NevalA59).Select
      Range("E6").Select
      End Sub.
      Pour revenir à "SevalA", il y a la macro B que la machine a écrite comme suit :
      Sub macroB
      Sheets("Neval59").Select
      ActiveWindow.SelectedSheets.Visible = False
      Sheets("NevalA").Selec
      Range("A1").Select
      End Sub.

      Cordialement
      0
  2. Bonjour,
    Vous m'excusez pour le retard par rapport à ma réaction.
    J'ai essayé votre solution mais toutes toutes les feuilles et toutes les pages du classeur ont été imprimées avec 1 bug n° 1004 : la méthode "visible" de l'objet "worksheet" a échoué
    Je précise :
    - les feuil à imprimer (60 au total) se nomment "NevalA1" jusqu' à "NevalA60";
    - j'ai affecté à chacune de ces 60 feuil 2 macros (écrites automatiquement par la machine après lancement de création de macros) : Pour la feuil "NevalA59", la macro A qui permet de l'afficher à partir de la feuil "SevalA" est écrite comme suit:
    Sub macroA
    Sheets("Neval59").Visible = True
    Sheets("NevalA59).Select
    Range("E6").Select
    End Sub.
    Pour revenir à "SevalA", il y a la macro B que la machine a écrite comme suit :
    Sub macroB
    Sheets("Neval59").Select
    ActiveWindow.SelectedSheets.Visible = False
    Sheets("NevalA").Selec
    Range("A1").Select
    End Sub.

    S'il est possible d'imprimer ces feuill masquées sans même les afficher, c'est bon, je peux m'en contenter car je pourrais au besoin afficher une feuille donnée à partir des macros que j'ai déjà insérées.

    Merci
    Cordialement
    0
    1. Contributeur
      Bonjour,
      j'ai testé mon code qui fonctionne chez moi : la feuille qui est affichée s'appelle bien "WS" ?
      Sinon il faut remplacer par le nom réel de la feuille.
      0
    2. @gbinformeBonsoir,
      Alors, le problème est, sans doute, mon niveau avec ma compréhension ou la clarté de mon exposé ;
      En fait, dans la solution que vous me proposez, je crois comprendre que c'est pour afficher et imprimer seulement la feuille"ws" alors que moi je souhaite afficher et imprimer plusieurs feuilles (60 au total) nommées réellement "NevalA1" à "NevalA60".
      Ce sont peut être les autres macros écrites qui empêchent la réussite de la solution à mon niveau ;
      Donc est-ce qu'il peut y avoir 1 autre option, celle qui consisterait à imprimer en boucle (sans les afficher) toutes ces 60 feuilles "NevalA1" à "NevalA60". Il y a dans le classeur d'autres feuilles non cachées et imprimables en dehors du groupes des 60.
      0
    3. Contributeur
      Bonsoir,

      Essaie avec ceci :
      Public Sub imprime()
      Dim feu As Worksheet
      For Each feu In ActiveWorkbook.Sheets
          If InStr(1, feu.Name, "NevalA") Then
              feu.Visible = xlSheetVisible
              feu.PrintOut
              feu.Visible = xlSheetHidden
          End If
      Next feu
      End Sub
      
      0
    4. @gbinformeBonsoir,
      Très bien, ça marche mais, si c'est pas un souhait de plus ; est-ce que je ne pourrait pas avoir une autre macro inverse (je la lierai à 1 autre bouton à côté du bouton imprimer) pour fermer toutes les feuilles après l'impression) car toutes affichées ont été alors qu'elles étaient cachées auparavant.

      Merci d'avance, vous avez été génial.

      Cordialement
      0
    5. Contributeur
      Bonsoir,

      Sans doute que l'impression trop lente a bloqué le masquage.
      Pour cacher toutes ces feuilles :
      Public Sub cache_NevalA()
      Dim feu As Worksheet
      For Each feu In ActiveWorkbook.Sheets
          If InStr(1, feu.Name, "NevalA") Then
              feu.Visible = False
          End If
      Next feu
      End Sub
      0
  3. Contributeur
    Bonjour,
    Cela devrait le faire ainsi :
    Public Sub cache_NevalA()
    Dim feu As Worksheet
    If MsgBox("Voulez-vous imprimer toutes les feuilles ?", vbYesNo, "Impression") = vbNo Then Exit Sub
    For Each feu In ActiveWorkbook.Sheets
        If InStr(1, feu.Name, "NevalA") Then
            feu.[A1].Activate
            feu.Visible = False
       End If
    Next feu
    End Sub
    
    0
    1. Contributeur Ambassadeur
      bonjour, il ne manque pas l'impression?
      0
    2. @yg_beBonjour,
      Je suis perdu dans les liens me conduisant correctement au forum, c'est l'une des causes des doublons : Tous mes messages me reviennent, que faire ?
      .
      Merci à tous pour l'aide concernant le code d'impression, j'ai jubilé après avoir eu la solution mais un autre souci s'est présenté :
      Je voudrais insérer dans le code d'impression une condition pour que la machine n'imprime (toujours en boucle) seulement les feuilles dont la valeur en C20 est supérieure à 0, je cherche par procédé à économiser l'encre et les feuilles car j'ai pas besoin de pages dont la valeur en C20 est égale à 0.
      Je rappelle que toutes les feuilles ont la même disposition et 1 feuille compte 1 page.
      Merci d'avance
      0
  4. Bonjour,
    Vous avez raison, c'est désagréable d'avoir des discussion en doublon, mais je compte sur la compréhension de tous car je suis limité en informatique et la lenteur associée à l'instabilité de la connexion ne me facilite pas la tâche.
    Merci pour l'aide , j'ai jubilé après avoir eu la solution mais un autre souci s'est présenté :
    Je voudrais insérer dans le code d'impression une condition pour que la machine n'imprime (toujours en boucle) seulement les feuilles dont la valeur en C20 est supérieure à 0, je cherche par procédé à économiser l'encre et les feuilles car j'ai pas besoin de pages dont la valeur en C20 est égale à 0.
    Je rappelle que toutes les feuilles ont la même disposition et 1 feuille compte 1 page.
    Merci d'avance
    0
    1. Contributeur Ambassadeur
      bonjour, si tu as utilisé le code proposé qui contient
      If InStr(1, feu.Name, "NevalA") Then
      , il te suffit de changer cela en:
      If InStr(1, feu.Name, "NevalA") and feu.Cells(3,20) > 0 Then
      0
    2. @yg_beBonjour,
      Je n'ai aucune réaction après le lancement de l'impression. J'espère que cela n'est pas lié au verrouillage des feuilles à imprimer mais avant la condition sur la valeur de C20 le code avait marché.
      Le nouveau code est le suivant, sauf erreur de ma part.

      Sub imprime()
      Dim feu As Worksheet
      If MsgBox("ATTENTION, Etes-vous sur de vouloir imprimer TOUS les relevés ?", vbYesNo + vbCritical + vbDefaultButton2, "Impression") = vbNo Then Exit Sub
      For Each feu In ActiveWorkbook.Sheets
      If InStr(1, feu.Name, "NevalA") And feu.Cells(3, 20) > 0 Then
      feu.Visible = xlSheetVisible
      feu.PrintOut
      feu.Visible = xlSheetHidden
      End If
      Next feu
      End Sub

      Merci beaucoup
      0
    3. Contributeur Ambassadeur
      Que contient C20, peux-tu donner des exemples?
      0
    4. @yg_beC20 contient le total des points obtenus : "0,05", "11", "192, 5", etc. C'est une formule qui a renvoyé ces valeur dans C20.

      Merci à vous
      0
    5. Contributeur Ambassadeur
      il faut Cells(20,3), pas (3,20)!
      If InStr(1, feu.Name, "NevalA") And feu.Cells(20, 3) > 0 Then
      0