dimanche 18 décembre 2011

Afficher les feuilles masquées



Afficher une feuille masquée est facile : jusqu’à Excel 2003, on allait chercher dans
Format / Feuille / Afficher
ce qui ouvre la petite fenêtre ci-dessous, dans laquelle on sélectionne le nom de la bonne feuille, et hop ! Avec Excel 2007 le chemin est devenu
Accueil / Cellules / Format / Visibilité / Masquer & afficher / Afficher la feuille
ce qui est légèrement plus long (hum) mais on arrive sur la même petite fenêtre. Idem avec Excel 2010. Bien.


Là où ça se complique, c’est quand on veut afficher plusieurs feuilles masquées : il n’y a pas d’autre solution que de répéter plusieurs fois la manip ci-dessus ! Pour deux feuilles l’effort est anodin, mais pour 4 feuilles, ou 5, ou 10, ou plus, ça devient pénible.


(Soit dit en passant, l’impossibilité d’afficher simultanément plusieurs feuilles me surprend d’autant plus que masquer simultanément plusieurs feuilles est tout à fait possible !)

Voici deux astuces pour contourner voire résoudre ce problème.

La première : tout faire au clavier, ce qui va notablement plus vite :
- le raccourci clavier  Alt, T, F, A ouvre la fameuse fenêtre,
- on se déplace dans cette fenêtre avec les touches de direction pour sélectionner la feuille à afficher,
- on valide par Entrée.

La seconde : une macro VBA qui affiche en une seule fois toutes les feuilles masquées.
La voici d’abord en entier :

Sub Afficher_Feuilles_Masquées()
Dim Feuille As Object
For Each Feuille In ActiveWorkbook.Sheets
 If Feuille.Visible = xlSheetHidden Then
   Feuille.Visible = xlSheetVisible
 End If
Next
End Sub

Que fait cette macro ?
1. Elle parcourt, l’une après l’autre, toutes les feuilles du classeur actif :
For Each Feuille In ActiveWorkbook.Sheets
2. pour chaque feuille, elle teste si la feuille est masquée (c’est à dire “si la visibilité de la feuille est ’cachée’”) :
 If Feuille.Visible = xlSheetHidden Then
3. si c’est le cas, elle affiche la feuille :
  Feuille.Visible = xlSheetVisible

Précision – au début, on a déclaré une variable objet : Dim Feuille As Object
Il n’existe pas d’objet “feuille” (tout court) en VBA : étrangement, la collection Worksheets rassemble des objets Worksheet, mais la collection Sheets ne rassemble pas d’objets “feuille”.
Certes, on pourrait déclarer cette variable comme feuille de calcul (Worksheet), mais ça obligerait ensuite à parcourir les feuilles de calcul du classeur, de la façon suivante :
For Each Feuille In ActiveWorkbook.Worksheets
Ce qui reviendrait à exclure les feuilles qui ne sont pas des feuilles de calcul : les feuilles graphiques !



Allons plus loin.

A priori, une feuille peut être affichée ou masquée : seulement deux cas de figure.
Pourtant, la propriété Visible d’une feuille peut prendre trois valeurs différentes :
- lorsqu’elle est affichée, c’est xlSheetVisible (qu’on peut exprimer de façon plus simple par True) ;
- lorsqu’elle est masquée, c’est xlSheetHidden (qu’on peut exprimer de façon plus simple par False) mais aussi xlSheetVeryHidden.

Ce dernier cas de figure, “très masqué”, est particulier : lorsque la visibilité d’une feuille est définie à xlSheetVeryHidden, son nom n’apparaît même pas dans la petite fenêtre présentée au début. Il n’est donc pas possible de l’afficher depuis l’interface courante d’Excel.
De fait, ce niveau de visibilité de feuille ne peut être manipulé qu’en VBA, tant pour passer en “très masquée” une feuille affichée, que pour afficher une feuille “très masquée”.

Ce niveau de masquage est parfois utile, par exemple si on veut “cacher” une feuille de paramètres de manière à ce qu’un utilisateur ne puisse non seulement pas les modifier mais pas même les voir (ce que ne permet pas une simple protection de la feuille).

La macro présentée plus haut n’affiche que les feuilles qui sont masquées “classiquement” puisqu’elle teste la visibilité des feuilles pour ne travailler que sur celles qui sont définies à xlSheetHidden.

Pour étendre son action à toutes les feuilles, y compris celles qui sont “très masquées”, il suffit de... la simplifier en retirant le test en question :

Sub Afficher_Feuilles_Masquées()
Dim Feuille As Object
For Each Feuille In ActiveWorkbook.Sheets
 Feuille.Visible = xlSheetVisible
Next
End Sub

Placée dans un classeur de macros personnelles où on lui attribue un raccourci clavier, cette macro permet d’afficher toutes les feuilles d’un classeur en une fraction de seconde.

14 commentaires:

  1. merci car qaund on récupère des fichiers qui trainent 25 ans d'historique et qu'il y a plein de feuilles cachées, c'est CA-NON!

    RépondreSupprimer
  2. Content que ça serve... :-)
    Le nec plus ultra serait de monter une fenêtre similaire à celle qu'on voyait en début de billet, mais dans laquelle on pourrait sélectionner PLUSIEURS feuilles. Histoire de pouvoir afficher certaines feuilles (et pas forcément toutes).
    Un prochain billet pour ça !

    RépondreSupprimer
  3. Visiblement ça ne fonctionne pas dans tous les cas, j'obtiens l'erreur "Impossible de définir la propriété Visible de la classe Worksheet"...

    RépondreSupprimer
    Réponses
    1. Bonsoir Jul,
      Jamais vu cette erreur dans ce cas précis. Quelle version d'Excel ? Un mot de passe, peut-être ? Mon billet n'abordait pas les questions de protection de feuille, c'est vrai.
      (Désolé du délai de réponse, je bosse peu sur ce blog ces temps-ci...)

      Supprimer
    2. Excel 2003. Oui il y a un mot de passe, et justement je cherche à le contourner. Ça doit être possible avec du code, non ?

      Supprimer
    3. Possible, sans doute, oui.
      J'ai déjà travaillé en VBA-Excel sur des questions de mot de passe vers d'autres applis, mais jamais sur la protection de feuille dans un classeur.
      Je vais creuser ça et je répondrai sur le blog. Merci du questionnement ! :-)

      Supprimer
  4. Bonjour,

    J'aimerais un exemple de macro pour afficher un groupe de feuilles masquées et non pas toutes les feuilles marquées.

    C'est surement possible

    RépondreSupprimer
    Réponses
    1. Bonjour,

      Oui ; c'est l'esprit de ma réponse à Sophie en juillet dernier.

      Le noeud du problème est dans la fenêtre standard (ma capture d'écran au début du billet), qui ne permet de sélectionner qu'une seule feuille à la fois.

      L'astuce serait de créer, en VBA, une copie de cette fenêtre en permettant d'y sélectionner plusieurs lignes (propriété Multiselect de la ListBox) et de travailler ensuite sur une collection de noms de feuilles, plutôt que sur un nom de feuille unique.

      (Tiens, je vais faire ça cet été. Billet à venir...)

      Supprimer
  5. J'ai des difficultés à visionner deux classeurs à la fois: ils collent l'un après l'autre. quoi faire?

    RépondreSupprimer
    Réponses
    1. Bonjour Pancho,
      Je ne comprends pas bien le problème. Qu'est-ce que vous entendez en disant que deux classeurs "collent l'un après l'autre" ?

      Supprimer
    2. Bonsoir,
      Personnellement, je cherche a afficher et masqué 2 feuilles excel par macro, c'est possible ?

      Supprimer
    3. Bonsoir Dimitri,
      Les rendre simultanément visibles, c'est précisément le sujet de ce billet. Avec un bémol : le code proposé ici ne permet que de rendre visibles toutes les feuilles masquées d'un classeur - toutes en une seule fois. Pouvoir n'en ré-afficher que quelques unes (simultanément) sera l'objet d'un prochain billet.
      (Quant à masquer deux feuilles simultanément, ça se fait directement par Excel, sans qu'il y ait besoin de macro...)

      Supprimer