XL 2019 Afficher ou masquer une forme selon l'état visibilité d'une feuille.

Nenesse45

XLDnaute Nouveau
Bonjour à tous,

j'ai une demande particulière.

Dans mon fichier excel, j'ai une feuille FeuilleSommaire qui me sert de sommaire avec des formes rectangulaire qui me servent de "bouton" et qui pointent vers les autres feuilles du fichier.

Par exemple, j'ai un BoutonToto qui pointe vers FeuilleToto et un BoutonTiti qui pointe vers la FeuilleTiti.

J'ai commencé à regarder pour du code VBA pour afficher ou masquer les boutons selon que les feuilles soient masquées ou non. Par exemple, si la FeuilleTiti est masquée, alors sur la FeuilleSommaire, le BoutonTiti sera masqué également.

je sais que le code contiendra ça mais je trouve pas comment déclencher la vérification d'état des feuilles, qui feront que les boutons seront affichés ou non.


VB:
If Worksheets("FeuilleToto").Visible = True Then
        Shapes("BoutonToto").Visible = True
        Else:
            Shapes("BoutonToto").Visible = False
    End If
    If Worksheets("FeuilleTiti").Visible = True Then
        Shapes("BoutonTiti").Visible = True
        Else:
            Shapes("BoutonTiti").Visible = False
    End If

Le problème est que je ne me base pas sur la valeur d'une cellule, calculée ou non, donc je pense que je ne peux pas mettre du code comme
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
...
End Sub

ou sur
Code:
Private Sub Worksheet_Calculate()
...
End Sub

Auriez-vous une idée de comment déclencher la vérification de l'état d'un onglet pour que le code fonctionne s'il vous plaît?

Merci de votre aide
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @Nenesse45 :),

Un essai dans le fichier joint.
  • Quatre formes sur la feuille "Sommaire"
  • Trois formes avec lien hypertexte vers Ti ti, Toto et Tutu.
  • Une forme sans lien hypertexte
Un code dans module1:
VB:
'------ dans VBE menu Outils / Options...
'------ sur l'onglet "Général"
'------ décocher l'option "Arrêt sur toutes les erreurs"

Sub AfficherMasquer()
Dim x As Shape, xrg As Range, f
   Application.ScreenUpdating = False
   With Sheets("Sommaire")
      On Error Resume Next
      For Each x In .Shapes
         f = "": f = Replace(Split(x.Hyperlink.SubAddress, "!")(0), "'", "")
         x.Visible = Sheets(f).Visible = True
      Next x
   End With
   On Error GoTo 0
End Sub

Code dans le module de ThisWorkbook:
VB:
Private Sub Workbook_Open()
   AfficherMasquer
End Sub

Code dans le module de la feuille "Sommaire":
VB:
Private Sub Worksheet_Activate()
   AfficherMasquer
End Sub
 

Pièces jointes

  • Nenesse45- Hypertexte- v1.xlsm
    21.1 KB · Affichages: 22
Dernière édition:

Nenesse45

XLDnaute Nouveau
Bonsoir @Nenesse45 :),

Un essai dans le fichier joint.
  • Quatre formes sur la feuille "Sommaire"
  • Trois formes avec lien hypertexte vers Ti ti, Toto et Tutu.
  • Une forme sans lien hypertexte
Un code dans module1:
VB:
'------ dans VBE menu Outils / Options...
'------ sur l'onglet "Général"
'------ décocher l'option "Arrêt sur toutes les erreurs"

Sub AfficherMasquer()
Dim x As Shape, xrg As Range, f
   Application.ScreenUpdating = False
   With Sheets("Sommaire")
      On Error Resume Next
      For Each x In .Shapes
         f = "": f = Replace(Split(x.Hyperlink.SubAddress, "!")(0), "'", "")
         x.Visible = Sheets(f).Visible = True
      Next x
   End With
   On Error GoTo 0
End Sub

Code dans le module de ThisWorkbook:
VB:
Private Sub Workbook_Open()
   AfficherMasquer
End Sub

Code dans le module de la feuille "Sommaire":
VB:
Private Sub Worksheet_Activate()
   AfficherMasquer
End Sub
Bonsoir,

Merci, ça fait effectivement bien le travail.

Par contre, pourquoi le commentaire sur le module? il y a des erreurs qui peuvent apparaître? dans quel(s) cas?

Sinon, pour la gestion des erreurs, ce sont des boutons radio dans Excel 2019, on ne peut pas décocher.
Dans mon cas, j'avais Arrêt sur les erreurs non gérées.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Par contre, pourquoi le commentaire sur le module? il y a des erreurs qui peuvent apparaître? dans quel(s) cas?
La macro fait une boucle sur toutes les formes présentes sur la feuille "Sommaire".
Pour chaque forme, on prend l'adresse de destination du lien hypertexte et on en extrait le nom f de la feuille de destination. Puis on masque le bouton suivant que la feuille de destination est masquée ou non.

Mais si la forme n'a pas de lien hypertexte, alors le fait de lire le lien hypertexte renvoie une erreur. On error resume next permet que VBA ne s'arrête pas en mode débogage et de passer à l'instruction suivante (f vaut alors la chaine vide)
L'instruction suivante regarde si la feuille de destination est masquée ou non. Comme la feuille f (chaine vide) n'existe pas, l'instruction renvoie aussi une erreur. Mais comme on a indiqué On Error Resume Next, on passe encore une fois à l'instruction suivante (Next x).

Si on avait omis On Error Resume next (et/ou laisser l'option Arrêt sur toutes les erreurs non gérées), le premier traitement d'une forme sans lien vers une autre feuille aurait provoqué l'arrêt de la macro.
 
Dernière édition:

Discussions similaires