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 :

Code VBA pour masquer des onglets en fonction du contenu d'une cellule [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2014
    Messages : 46
    Points : 30
    Points
    30
    Par défaut Code VBA pour masquer des onglets en fonction du contenu d'une cellule
    Bonjour le forum,

    J'ai un classeur Excel composé de plusieurs onglets portant les noms suivants : Notice, Sortie, Partenaires, Arcachon, Gujan, Lacanau, Médoc, Pessac, ...

    Le nom des onglets Arcachon, Gujan, Lacanau, Médoc, Pessac, ... correspond au contenu de la cellule (i, 2) de l'onglet Sortie. Le contenu de ces onglets est différent, je ne peux donc pas avoir un seul onglet que je renommerai en fonction du contenu de la cellule (i, 2) de l'onglet Sortie.

    Je souhaiterai créer une macro pour masquer les onglets dont le nom ne correspond pas au contenu de la cellule (i, 2) de l'onglet Sortie, sauf les onglets Notice, Sortie, Partenaires.

    Par exemple, si le contenu de la cellule (i, 2) de l'onglet Sortie est Gujan, les onglets visibles dans mon classeur seraient : Notice, Sortie, Partenaires, Gujan. Les autres onglets (Arcachon, Lacanau, Médoc, Pessac, ...) seraient masqués.

    Si quelqu'un peut m'aider.

    Merci d'avance.

  2. #2
    Membre régulier
    Homme Profil pro
    Divers
    Inscrit en
    Février 2017
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Divers

    Informations forums :
    Inscription : Février 2017
    Messages : 282
    Points : 89
    Points
    89
    Par défaut
    Bonjour,

    Tu peux essayer avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If Sheets("Sortie").Range("I2") = "Gujan" Then
        Sheets("Notice").Visible = True
       '... ==> ajouter toutes les feuilles visibles ici
       Else
     
        End If
    A adapter..

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2014
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Bonjour rossemma,

    Merci pour ta réponse, mais je me demandais, n'étant pas très calé en VBA, si on ne pouvait pas avoir un code plus générique en affectant une variable, à la cellule (i, 2) de l'onglet Sortie et si le nom de cette variable est différent du nom des onglets, je masque ces onglets (sauf les onglets Notice, Sortie, Partenaires).

    Est-ce possible ou faut-il que je récrive la ligne 1 de ton code pour tous les onglets que je veux masquer.

    Merci encore pour ton aide.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai relu trois fois ton explication mais je ne suis pas certain d'avoir bien compris.
    Un classeur contient une feuille nommée [Sortie] qui dans les cellules de la colonne 2, de la 1ère ou 2ème ligne (ce n'est pas précisé) jusqu'à la Xème contient des valeurs qui correspondent aux noms d'autre feuilles du même classeur.
    Le but est de rendre visible ces feuilles ainsi que les les feuilles nommées Notice, Sortie et Partenaires
    Si c'est cela que tu souhaites, voici un exemple (Les données contenant le nom des feuilles commencent en B2). Il y a plus court code mais pas le temps de peaufiner.
    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
    16
    17
    18
    19
    Sub t()
     Dim Cel As Range, sht As Worksheet, rng As Range
     With ThisWorkbook.Worksheets("Sortie")
      Set rng = .Range("B2:B" & .Range("B2").End(xlDown).Row)
     End With
     ' Masque toutes les feuilles et affiche les feuilles principales
     For Each sht In ThisWorkbook.Sheets
      Select Case sht.Name ' Liste des feuilles à afficher d'office
       Case "Sortie", "Notice"
        sht.Visible = True
       Case Else
        sht.Visible = False
      End Select
     Next sht
     ' Affiche les feuilles de la colonne B
     For Each Cel In rng
      ThisWorkbook.Sheets(Cel.Value).Visible = True
     Next
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2014
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Bonjour Philippe Tulliez,

    Merci pour ta réponse.
    Par rapport à tes interrogations :
    Le classeur contient une feuille Sortie. Dans la cellule (I,2) de cette feuille, on saisi le nom de la feuille qu'on veut garder (Lacanau, par exemple) et dans ce cas les feuilles visibles seront Notice, Sortie, Partenaires et Lacanau. Les autres feuilles (Arcachon, Gujan, Médoc, Pessac, ) seraient masquées.

    Dans le code que tu m'a donné j'ai un message d'erreur (erreur d'exécution '9' : L'indice n'appartient pas à la sélection), pour la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ThisWorkbook.Sheets(Cel.Value).Visible = True
    Merci encore pour ton aide

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Dans le code que tu m'a donné j'ai un message d'erreur (erreur d'exécution '9' : L'indice n'appartient pas à la sélection), pour la ligne
    C'est logique puisque je n'avais pas compris ton problème et le code que j'ai publié parcourt plusieurs cellules et ce qui m'a induit en erreur c'est cellule (i, 2) où j'ai pris le i comme la variable d'une boucle.
    Code à placer dans le module de la feuille nommée [Sortie].
    Le code sera enclenché dès que l'on écrit une nouvelle valeur en cellule I2
    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
    16
    Private Sub Worksheet_Change(ByVal Target As Range)
     Dim sht As Worksheet
     If Target.Address = "$I$2" Then
      ' Masque toutes les feuilles et affiche les feuilles proincipales
      For Each sht In ThisWorkbook.Sheets
       Select Case Trim(LCase(sht.Name))
        ' Liste des feuilles à afficher toujours (écrire en minuscule)
        Case Trim(LCase(Me.Range("I2").Value)), "sortie", "notice"
         sht.Visible = True
        Case Else
         sht.Visible = False
       End Select
      Next sht
     End If
     Set sht = Nothing
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2014
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Re-bonjour Philippe Tulliez,

    Merci beaucoup pour ta réponse, c'est très bien.

    Petite question : comme je ne suis pas très calé en VBA, j'ai essayé de modifier ton code pour le faire fonctionner dans un module, mais je n'y suis pas arrivé. Aurais-tu la gentillesse de m'aider.
    Si tu ne peux pas ce n'est pas très grave, car ton code fonctionne parfaitement ainsi.
    Merci

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 764
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Petite question : comme je ne suis pas très calé en VBA, j'ai essayé de modifier ton code pour le faire fonctionner dans un module
    Dans un module standard, on ne pourra pas déclencher la procédure automatiquement lors de la modification de la cellule I2 de la feuille nommée Sortie mais cependant, il suffit de donner un nom quelconque à une procédure et ensuite copier/coller (ou couper/coller) les lignes 2 à 15

    Code de la procédure dans le module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub SheetsHideUnhide(mySheet As Worksheet)
     Dim sht As Worksheet
      ' Masque toutes les feuilles et affiche les feuilles principales
     For Each sht In ThisWorkbook.Sheets
      Select Case Trim(LCase(sht.Name))
       ' Liste des feuilles à afficher toujours
       Case "sortie", "notice", Trim(LCase(mySheet.Range("I2").Value))
        sht.Visible = True
       Case Else
        sht.Visible = False
      End Select
     Next sht
    End Sub
    Transformation éventuelle dans la procédure événementielle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Change(ByVal Target As Range)
     SheetsHideUnhide Me
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2014
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Bonjour Philippe Tulliez,

    Merci beaucoup pour ta réponse.
    En fait je voulais déclencher la macro, par un bouton, mais la première solution que tu m'a donnée me semble bien meilleure.
    Merci encore pour ton aide.

    Très bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] [Programme permettant de supprimer des lignes en fonction du contenu d'une cellule]
    Par Etrof dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/07/2016, 21h14
  2. [XL-2010] Supprimer des lignes en fonction du contenu d'une cellule
    Par Ardiden31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/05/2015, 08h49
  3. Code pour un test conditionnel en fonction du contenu d'une cellule
    Par aladdin1234 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/11/2011, 09h25
  4. [XL-2003] Code VBA pour fusion des Dossiers
    Par em_bengue dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 07/04/2009, 00h03
  5. [VBA-EXCEL] Gestion des erreurs et manipulation du contenu d'une cellule
    Par Froggy007 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/09/2008, 20h42

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