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 :

Macro pour cacher des onglets


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Macro pour cacher des onglets
    Bonjour !!
    Petit nouveau sur ce forum, je sollicite votre aide.
    J'aimerais savoir comment créer une macro conditionnelle dans le contexte suivant :
    Sur un onglet nommé "Matrice", on aurait plusieurs cellules à remplir, dont certaines obligatoires pour compléter un autre onglet "Contrat".
    Je souhaiterais savoir si il est possible de cacher l'onglet "contrat" si tous les champs obligatoires de l'onglet "Matrice" ne sont pas remplis ?
    Si impossible (mais impossible n'est pas excel non ? ) est-il possible d'empêcher l'impression de l'onglet "Contrat" si tous les champs obligatoires de l'onglet "Matrice" ne sont pas remplis ?

    Merci d'avance,

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Tu caches de base la feuille contrat et tu crée un bouton "Générer le contrat".
    Quand tu appuies sur ce bouton : il vérifie les cellules et si c'est bon il affiche la page.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Merci de ta réponse, mais une question alors :
    Je sais cacher et faire apparaitre la feuille avec une macro mais comment faire la macro ou commande conditionnelle? Celle qui vérifie que les dites cellules soient remplies ?

  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 936
    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 936
    Points : 28 932
    Points
    28 932
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une solution parmi d'autres.
    Tu nommes la plage des cellules à remplir, par exemple "Obligatoire" et tu testes avec ce code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Test()
     Dim rng As Range: Set rng = ThisWorkbook.Worksheets("Feuil1").Range("Obligatoire")
     Select Case True
      Case Is = rng.Count = Application.WorksheetFunction.CountA(rng)
       MsgBox "Tout est rempli"
      Case Else
       MsgBox "Il reste " & rng.Count - Application.WorksheetFunction.CountA(rng) & " cellule(s) à remplir"
     End Select
    End Sub

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup !! En intégrant après le code pour masquer des onglets, ça marche !
    Par contre, comment faire pour de la même façon masquer une forme ou un dessin qu'on ferait apparaitre ou disparaitre dans les mêmes conditions ?

  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 936
    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 936
    Points : 28 932
    Points
    28 932
    Billets dans le blog
    53
    Par défaut
    Bonsoir,
    Tu utilises la propriété Visible de l'objet Shape

  7. #7
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut

    Un petit complément, la propriété visible de l'objet worksheet (une feuille) n'est pas un boolean, c'est à dire qu'il peut prendre plus de 2 état.
    tu as donc visible, invisible et très invisible (xlveryhide).
    Imagine que tu masque juste la feuille, il suffirait alors de fair un clique droit sur les onglet du classeur et de cliquer sur afficher pour faire apparaître la feuille Contrat. Hors si tu mets la feuille en veryhide, il n'est plus possible de l'afficher autrement que par du code

    ++
    Qwaz

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    @ Qwazerty
    J'utilise comme ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       Sheets("Contrat FR").Activate
    Sheets("Contrat FR").Visible = True
    est ce que ça veut dire que je dois remplacer ".Visible" par ".xlveryhide" ?

    @ corona
    Bonsoir,
    Tu utilises la propriété Visible de l'objet Shape
    Comment je fais ça s'il te plait ?

    (merci de vos réponses jusque là )

  9. #9
    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 936
    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 936
    Points : 28 932
    Points
    28 932
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Dim sh As Shape
     Dim sht As Worksheet
     Set sht = ThisWorkbook.Worksheets("Feuil3")
     sht.Shapes("Oval 1").Visible = msoFalse ' pour rendre invisible
     ' sht.Shapes("Oval 1").Visible = msoTrue ' pour rendre visible
    Et pour connaître la liste des dessins dans uine feuille, avec les mêmes variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each sh In sht.Shapes
        Debug.Print sh.Name
    Next
    [EDIT]
    Et en l'absence que Qwazerty que je salue au passage, je me permet de répondre que pour rendre une feuille réellement invisible, le code est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sht.Visible = xlSheetVeryHidden
    Le code complet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub t()
     Dim sh As Shape
     Dim sht As Worksheet
     Set sht = ThisWorkbook.Worksheets("Feuil3")
     For Each sh In sht.Shapes
      Debug.Print sh.Name
     Next
     sht.Visible = xlSheetVeryHidden ' Pour rendre réellement invisible une feuille
     'sht.Shapes("Oval 1").Visible = msoFalse ' pour rendre invisible
     sht.Shapes("Oval 1").Visible = msoTrue ' pour rendre visible
    End Sub

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Désolé pour le retard dans ma réponse, j'étais en vacances...

    Un grand merci, ça fonctionne parfaitement !
    Maintenant je souhaite corser la chose...

    Je souhaiterais pouvoir afficher/masquer des onglets excels selon comment est rempli un onglet "Matrice".

    On a défini une plage de cellules à remplir obligatoirement pour afficher les autres onglets, et je voudrais en plus intégrer dedans une condition supplémentaire : à savoir la cellule B10 de l'onglet "Matrice" doit comporter plus de 6 caractères. (et éventuellement B11)

    Pour résumer, pour afficher les onglets cachés, il faut que la plage de cellules soit remplie et que l'une d'entre elle comporte plus de 6 caractères. Si une seule de ces conditions est fausse, alors les onglets restent cachés.

    Avec l'aide que vous m'avez apporté, voici le code :
    Cependant il bug... car il ne tient pas compte de la 2ème condition : même si la cellule b10 a plus de 6 caractères, il remasque les onglets aussitôt...

    Si vous pouvez m'aider, merci d'avance !

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Macro100() 
     
     Dim rng As Range: Set rng = ThisWorkbook.Worksheets("Matrice").Range("b6:b10,b12:b14,b44:b45")
     
     Select Case True
     
      Case Is = rng.Count = Application.WorksheetFunction.CountA(rng)
       [/contents/vbscript/vbs-msgbox.php3 MsgBox] "Tout est rempli"
       Sheets("Feuil1").Activate
       Range("A1").Select
       Sheets("Feuil1").Visible = True
          Sheets("Feuil2").Activate
       Range("A1").Select
       Sheets("Feuil2").Visible = True
     
    Case Else
       MsgBox "Il reste " & rng.Count - Application.WorksheetFunction.CountA(rng) & "  cellules à remplir !!"
       Sheets("Feuil1").Visible = xlSheetVeryHidden
       Sheets("Feuil2").Visible = xlSheetVeryHidden
       End Select
     
     
     If Len(b10) < 6 Then
     
         MsgBox "Pas fini !"
       Sheets("Feuil1").Visible = xlSheetVeryHidden
       Sheets("Feuil2").Visible = xlSheetVeryHidden
     
       Else
     
        Sheets("Feuil1").Activate
       Range("A1").Select
       Sheets("Feuil1").Visible = True
          Sheets("Feuil2").Activate
       Range("A1").Select
       Sheets("Feuil2").Visible = True   
     
    End If
     
    End Sub

  11. #11
    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 936
    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 936
    Points : 28 932
    Points
    28 932
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour résumer, pour afficher les onglets cachés, il faut que la plage de cellules soit remplie et que l'une d'entre elle comporte plus de 6 caractères. Si une seule de ces conditions est fausse, alors les onglets restent cachés.
    Pour savoir si toutes les cellules d'une plage sont remplies utilise la fonction d'excel CountA
    Pour connaître le nombre d'éléments d'une chaîne de caractères c'est la fonction texte Len()
    La fonction logique pour vérifier que toutes les conditions sont remplies est And()
    Petit exemple : Vérification que la plage B3:E3 de la feuille Feuil1 est totalement remplie et que le nombre de caractères de E3 est égal à 7
    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
    Option Explicit
    Sub t()
     Dim sht As Worksheet, rng As Range
     Set sht = ThisWorkbook.Worksheets("Feuil1")
     Set rng = sht.Range("B3:E3")
     Debug.Print Application.WorksheetFunction.CountA(rng)
     Debug.Print rng(4) ' Donne la valeur du 4ème élément de la plage soit E3
     Debug.Print Len(rng(4)) ' renvoie le nombre decaractère de E3
     Select Case True
       Case Application.WorksheetFunction.CountA(rng) = 4 And Len(rng(4)) = 7
        MsgBox "Répond aux conditions"
       Case Else
        MsgBox "Ne répond pas aux conditions"
     End Select
    End Sub

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Merci !
    mais ça ne marche toujours pas... Il doit y avoir quelque chose que je rate.

    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
    20
    Sub Macro100()
     
     Dim sht As Worksheet, rng As Range
     Set sht = ThisWorkbook.Worksheets("Matrice")
     Set rng = sht.Range("b6:b10")
     Debug.Print Application.WorksheetFunction.CountA(rng)
     Debug.Print rng(4)
     Debug.Print Len(rng(4))
     Select Case True
       Case Application.WorksheetFunction.CountA(rng) = 4 And Len(rng(4)) = 7
        MsgBox "Répond aux conditions"
           Sheets("Feuil1").Activate
       Range("A1").Select
     
       Case Else
        MsgBox "Il reste " & rng.Count - Application.WorksheetFunction.CountA(rng) & "  cellules à remplir !!"
       Sheets("Feuil1").Visible = xlSheetVeryHidden
     
     End Select
    End Sub
    Avec ce code, seule la réponse "Case Else" ressort, même si les cellules b6 à b10 inclus ne sont pas vides, et que b10 contient plus de 6 caractères. J'ai fait le test, même avec 7 caractères, ça ne marche pas. (à la base, ma plage de cellules obligatoire est : Range("b6:b10,b12:b14,b44:b45") avec b10 et b:12 qui doivent contenir chacune plus de 6 caractères.)
    Où ai-je mal compris ?

  13. #13
    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 936
    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 936
    Points : 28 932
    Points
    28 932
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je fais toujours un test avant de publier du code.
    Désolé mais cela fonctionne parfaitement sauf qu'en changeant les adresses (B6:B10 au lieu de mon test qui portait sur B3:E3), tu as évidemment ajouté une cellule soit 5 cellules à remplir au lieu de 4, donc CountA vaut 5 quand toutes les cellules sont rempiies et pas 4
    De plus, tu écris que c'est B10 qui doit contenir plus de 6 caractères or tu testes RNG(4) et c'est RNG(5) dans ce cas là (B10 est le 5ème élément de B6:B10).

    Petite remarque : Au lieu de tester le nombre de cellules remplies avec une constante, tu peux le faire avec la propriété Rng.Count
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Case Application.WorksheetFunction.CountA(rng) = rng.Count And Len(rng(4)) = 7
    Je constate aussi que le Case Else masque la Feuil1 et que si la condition est remplie tu fais un Activate sur Feuil1 or on ne sait pas activer une feuille masquée, il faut d'abord la rendre visible. Par contre, tu peux lire et écrire dans une feuille masquée.
    Il n'y a aucune raison sauf si tu dois rendre la main à l'utilisateur sur cette feuille d'activer une feuille.
    On le répète tous les jours sur ce forum, pas d'Activate, Select etc... c'est parfaitement inutile et cela ralenti l'exécution de la procédure.
    Alors par contre
    (à la base, ma plage de cellules obligatoire est : Range("b6:b10,b12:b14,b44:b45") avec b10 et b:12 qui doivent contenir chacune plus de 6 caractères.)
    Ceci est un nouvel élément dont tu n'as pas parlé au début. Tes cellules ne sont pas contiguës alors Rng(x) posera problème.

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Encore merci pour votre aide.

    Ensuite, je suis désolé, je ne voulais pas dire que le code que vous m'aviez donné était faux, mais seulement que je n'arrivais pas à l'utiliser comme je le voulais. Vous m'avez vraiment aidé et je vous remercie sincèrement.

    Je suis newbie en vba, et je cherche à apprendre. C'est la raison pour laquelle j'ai fait les choses petit à petit, et ai corsé petit à petit ma demande. Je veux comprendre ce que je teste/fais, mais surtout ce que vous m'avez expliqué.

    Désolé mais cela fonctionne parfaitement sauf qu'en changeant les adresses (B6:B10 au lieu de mon test qui portait sur B3:E3), tu as évidemment ajouté une cellule soit 5 cellules à remplir au lieu de 4, donc CountA vaut 5 quand toutes les cellules sont rempiies et pas 4
    Désolé, j'ai pensé 10-6 = 4 donc je m'étais dit que c'était bon.

    On le répète tous les jours sur ce forum, pas d'Activate, Select etc... c'est parfaitement inutile et cela ralenti l'exécution de la procédure.
    J'ai pensé utiliser ce que j'avais appris... Mais merci, grace à vous j'ai compris que ce n'était pas nécessaire d'utiliser ces lignes.

    Ceci est un nouvel élément dont tu n'as pas parlé au début. Tes cellules ne sont pas contiguës alors Rng(x) posera problème.
    Une toute dernière question : dans mon cas, si ce n'est pas Rng() ; existe t'il une autre "formule" ? ou s'agit-il du Rng.Count ?

    Encore merci à tous !

Discussions similaires

  1. [XL-2007] Aide: Macro pour enregistrer des onglets excel en fichiers txt.
    Par Josecito dans le forum Excel
    Réponses: 5
    Dernier message: 05/08/2015, 15h20
  2. Réponses: 1
    Dernier message: 25/12/2012, 21h04
  3. Réponses: 1
    Dernier message: 27/10/2012, 19h59
  4. [XL-2007] Créer une macro pour supprimer des onglets dans un autre classeur
    Par nicosd54 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/03/2011, 10h01
  5. Macro pour cacher des paragraphes
    Par juhel philippe dans le forum VBA Word
    Réponses: 6
    Dernier message: 12/12/2008, 08h41

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