IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Masquer onglets en fonction de contrôle de formulaire


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    janvier 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 126
    Points : 35
    Points
    35
    Par défaut Masquer onglets en fonction de contrôle de formulaire
    Bonjour,

    Je suis en train d'élaborer un fichier excel avec différents onglets.
    Sur le premier je souhaiterai afficher la liste complète des onglets avec en face 2 cases à cocher contrôle de formulaire (Oui/non) par exemple.
    Si oui est coché on conserve l'onglet, si non est coché, on masque l'onglet.
    Est-ce que cela vous semble envisageable avec ou sans macro?

    Merci d'avance!

    Emilie

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    17 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 17 383
    Points : 50 217
    Points
    50 217
    Billets dans le blog
    92
    Par défaut
    Salut.

    C'est possible en VBA.

    Je propose de travailler avec un tableau structuré qui contiendra les noms des onglets du classeur et une colonne pour préciser l'option d'affichage. Dans cette colonne, on pourrait placer une liste de validation proposant Oui ou Non.

    Nom : 2021-04-09_094332.png
Affichages : 21
Taille : 25,0 Ko


    Je propose de récupérer les noms grâce à la procédure suivante (si c'est un One Shot, on peut bien sûr les saisir manuellement, attention aux espaces à droite qui pourraient traîner)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub RetrieveTabs()
      Dim sh As Object
     
      ' Vidange du tableau des onglets
      Range("t_Onglets").ListObject.AutoFilter.ShowAllData
      If Not Range("t_Onglets").ListObject.DataBodyRange Is Nothing Then Range("t_Onglets").ListObject.DataBodyRange.Delete
     
      ' Remplissage
      For Each sh In ThisWorkbook.Sheets
        If sh.Name <> "Menu" Then
          Range("t_Onglets").ListObject.ListRows.Add
          Range("t_Onglets[Onglet]")(Range("t_Onglets").Rows.Count).Value = sh.Name
        End If
      Next
    End Sub

    On peut alors utiliser une procédure qui va boucler sur les lignes de ce tableau et afficher ou masquer l'onglet en fonction de la valeur de la colonne Visible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub ShowHideTabs()
      Dim i As Long
     
      For i = 1 To Range("t_Onglets").Rows.Count
        If Range("t_Onglets[Visible]")(i) = "Oui" Then
          Worksheets(Range("t_Onglets[Onglet]")(i).Value).Visible = xlSheetVisible
        Else
          Worksheets(Range("t_Onglets[Onglet]")(i).Value).Visible = xlSheetHidden
        End If
      Next i
    End Sub
    Par la suite, on peut afficher/masquer sur base d'une modif de la cellule, par exemple, en capturant l'évènement Change de la feuille Menu (dans mon exemple).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Worksheet_Change(ByVal Target As Range)
      If Not Intersect(Target, Range("t_Onglets[Visible]")) Is Nothing And Target.Count = 1 Then ShowHideTab Target
    End Sub
     
    Sub ShowHideTab(Target As Range)
      Dim Index As Long
     
      Index = Target.Row - Range("t_Onglets").Row + 1
      If Range("t_Onglets[Visible]")(Index).Value = "Oui" Then
        Worksheets(Range("t_Onglets[Onglet]")(Index).Value).Visible = xlSheetVisible
      Else
        Worksheets(Range("t_Onglets[Onglet]")(Index).Value).Visible = xlSheetHidden
      End If
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Comment masquer un contrôle de formulaire
    Par Peat1 dans le forum Excel
    Réponses: 38
    Dernier message: 15/04/2020, 08h20
  2. [XL-2003] Code VBA pour masquer des onglets en fonction du contenu d'une cellule
    Par Sergio33600 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/02/2017, 10h02
  3. Réponses: 6
    Dernier message: 12/12/2016, 20h56
  4. [AC-2010] Fonction "Rechercher" de la boîte contrôle des formulaires
    Par ANDROID17 dans le forum IHM
    Réponses: 2
    Dernier message: 17/08/2012, 09h10
  5. Contrôle tabStrip masquer onglet
    Par totoche dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/03/2007, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo