XL 2019 Afficher ou masquer dynamiquement des lignes, selon la valeur d'une cellule.

Nenesse45

XLDnaute Nouveau
Bonjour à tous,

sur une feuille Excel, je cherche à masquer ou à afficher dynamiquement des lignes, selon la valeur d'une cellule.

Sur la feuille, il y a une liste déroulante (qui dépend d'une autre feuille listing) pour sélectionner le nom d'un équipement.
Selon l'équipement choisi dans la liste déroulante, la cellule D14 affiche la marque de cet équipement sélectionné (avec une RECHERCHEV du nom de l'équipement dans la feuille listing).

Des lignes doivent être masquées ou affichées selon la valeur de la cellule D14:
  • Par défaut, si la cellule D14 est vide ou différente de MARQUE1 MARQUE2, alors il faut masquer les lignes 21:22, 25:27 et 42:57
  • Si la cellule D14 = MARQUE1 alors il faut afficher les lignes 21:22 et 42:57 et masquer les lignes 25:27
  • Si la cellule D14 = MARQUE2 alors il faut afficher les lignes 25:27 et masquer les lignes 21:22 et 42:57
J'ai trouvé du code VBA pour essayer de le faire:
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim TrigerCell As Range

Set Triggercell = Range("D14")
  
    If Not Application.Intersect(Triggercell, Target) Is Nothing Then
            If Triggercell.Value = "MARQUE1" Then
                Rows("21:22").Hidden = False
                Rows("25:27").Hidden = True
                Rows("42:57").Hidden = False
            ElseIf Triggercell.Value = "MARQUE2" Then
                Rows("21:22").Hidden = True
                Rows("25:27").Hidden = False
                Rows("42:57").Hidden = True
            ElseIf Triggercell.Value = "" Then
                Rows("21:22").Hidden = True
                Rows("25:27").Hidden = True
                Rows("42:57").Hidden = True
            End If
    End If
End Sub

Mais il y a plusieurs problèmes:
  1. Le premier problème est que l'affichage ou le masquage des lignes n'est pas dynamique. Si je change le nom de l'équipement dans la liste déroulante, la marque change bien dans la cellule D14 grâce à la RECHERCHEV mais les lignes devant s'afficher ou se masquer ne changent pas.
    Il faut que je sélectionne la cellule D14 et que je "revalide" la fonction RECHERCHEV pour que ça fonctionne.
  2. Le deuxième problème est qu'avec le code, je tiens compte de la cellule vide, mais pas si la marque est différente de MARQUE1 ou MARQUE2 (MARQUE3 par exemple) selon le nom de l’équipement sélectionné dans la liste déroulante.
Quelqu'un aurait-il une idée s'il vous plaît pour rendre le code dynamique et plus complet?

Merci de votre aide.
 
Solution
Bonjour Nenesse,
En PJ un essai basé sur Worksheet_Calculate. D14 doit être une formule :
VB:
Public msValeurSave
Sub Worksheet_Calculate()
    If [D14] <> msValeurSave Then
        Select Case [D14]
                Case "MARQUE1"
                    Rows("21:22").Hidden = False
                    Rows("25:27").Hidden = True
                    Rows("42:57").Hidden = False
                Case "MARQUE2"
                    Rows("21:22").Hidden = True
                    Rows("25:27").Hidden = False
                    Rows("42:57").Hidden = True
                Case Else
                    Rows("21:22").Hidden = True
                    Rows("25:27").Hidden = True
                    Rows("42:57").Hidden = True
        End Select...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Nenesse,
En PJ un essai basé sur Worksheet_Calculate. D14 doit être une formule :
VB:
Public msValeurSave
Sub Worksheet_Calculate()
    If [D14] <> msValeurSave Then
        Select Case [D14]
                Case "MARQUE1"
                    Rows("21:22").Hidden = False
                    Rows("25:27").Hidden = True
                    Rows("42:57").Hidden = False
                Case "MARQUE2"
                    Rows("21:22").Hidden = True
                    Rows("25:27").Hidden = False
                    Rows("42:57").Hidden = True
                Case Else
                    Rows("21:22").Hidden = True
                    Rows("25:27").Hidden = True
                    Rows("42:57").Hidden = True
        End Select
        msValeurSave = [D14]
    End If
End Sub
Pour le point 2, si D14 ne contient ni marque1 ni marque2 alors on masque tout.
( attention le Case tient compte de la casse )
 

Pièces jointes

  • Nenesse.xlsm
    14.2 KB · Affichages: 42

Nenesse45

XLDnaute Nouveau
Hello,

Je me permets de relancer le sujet pour vérifier un point:
Le tableau se remplit désormais de manière automatique via Power Query, l'équipement n'est plus sélectionné par une liste déroulante, et il n'y a plus de formule RECHERCHEV dans la cellule D14. L'actualisation ne se fait pas correctement sur les lignes à afficher ou masquer.

J'ai donc transformé le code

VB:
Public msValeurSave
Sub Worksheet_Calculate()
    If [D14] <> msValeurSave Then
        Select Case [D14]
                Case "MARQUE1"
                    Rows("21:22").Hidden = False
                    Rows("25:27").Hidden = True
                    Rows("42:57").Hidden = False
                Case "MARQUE2"
                    Rows("21:22").Hidden = True
                    Rows("25:27").Hidden = False
                    Rows("42:57").Hidden = True
                Case Else
                    Rows("21:22").Hidden = True
                    Rows("25:27").Hidden = True
                    Rows("42:57").Hidden = True
        End Select
        msValeurSave = [D14]
    End If
End Sub

Par le code suivant:

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Select Case [D14]
        Case "MARQUE1"
            Rows("21:22").Hidden = False
            Rows("25:27").Hidden = True
            Rows("42:57").Hidden = False
        Case "MARQUE2"
            Rows("21:22").Hidden = True
            Rows("25:27").Hidden = False
            Rows("42:57").Hidden = True
        Case Else
            Rows("21:22").Hidden = True
            Rows("25:27").Hidden = True
            Rows("42:57").Hidden = True
     End Select
End Sub

Ça a l'air de fonctionner mais est-ce la façon la plus optimale de faire? Est-ce qu'il y a un autre code qui serait plus adapté?

Merci de votre aide.
 

JohDan

XLDnaute Nouveau
Bonjour Nenesse,
En PJ un essai basé sur Worksheet_Calculate. D14 doit être une formule :
VB:
Public msValeurSave
Sub Worksheet_Calculate()
    If [D14] <> msValeurSave Then
        Select Case [D14]
                Case "MARQUE1"
                    Rows("21:22").Hidden = False
                    Rows("25:27").Hidden = True
                    Rows("42:57").Hidden = False
                Case "MARQUE2"
                    Rows("21:22").Hidden = True
                    Rows("25:27").Hidden = False
                    Rows("42:57").Hidden = True
                Case Else
                    Rows("21:22").Hidden = True
                    Rows("25:27").Hidden = True
                    Rows("42:57").Hidden = True
        End Select
        msValeurSave = [D14]
    End If
End Sub
Pour le point 2, si D14 ne contient ni marque1 ni marque2 alors on masque tout.
( attention le Case tient compte de la casse )
Salut,

J'adore, je l'ai utilisé pour mon fichier... Sauf que, pour une raison que j'ignore (je dois oublier une étape), cela ne se fait pas automatiquement, je dois l'exécuter à chaque fois. Pourquoi ? Heu au bureau je n'ai que Excel 2016 et non le 365... Est-ce que ça pourrait être la cause ?
 

soan

XLDnaute Barbatruc
Inactif
Bonjour JohDan, sylvanu, le fil,

bienvenue sur le site XLD ! :)

pour te répondre, je suis parti du fichier du post #2 de sylvanu.

j'ai réécrit la sub « à ma sauce » :

Image.jpg


cette sub est dans le module de la feuille "Feuil1" ; pour voir ce module, fais un double-clic sur la ligne "Feuil1" qui est pointée par la flèche verte ; OU sélectionne cette ligne et appuie sur la touche Entrée ; ça, c'était à partir de la fenêtre "Microsoft Visual Basic" ; à partir de la fenêtre "Excel", tu peux faire un clic droit sur l'onglet "Feuil1" puis choisir l'item "Visualiser le code".

attention de bien choisir le module de la feuille concernée, ici celui de "Feuil1" et pas "Feuil2" ; en plus des modules standards tels que Module1 (que tu connais déjà), un classeur Excel a son propre module nommé ThisWorkbook et chaque feuille a son propre module (c'est pour des subs événementielles).

une fois que la sub est placée dans le bon module de la feuille concernée, tu n'as rien à faire de spécial pour exécuter la sub : fais simplement Alt F11 pour retourner sur Excel, puis utilise ta feuille comme d'habitude ; ici : D5 est vide ; tu as juste à choisir un des 2 items de la liste : "MARQUE1" ou "MARQUE2" ; la cellule D14 sera modifiée car elle contient la formule =SI(D5="";"";D5), et comme un calcul sur "Feuil1" s'est produit, la sub Worksheet_Calculate() est appelée.​

soan
 

Pièces jointes

  • Nenesse.xlsm
    14.8 KB · Affichages: 10
Dernière édition:

JohDan

XLDnaute Nouveau
Bonjour JohDan, sylvanu, le fil,

bienvenue sur le site XLD ! :)

pour te répondre, je suis parti du fichier du post #2 de sylvanu.

j'ai réécrit la sub « à ma sauce » :

Regarde la pièce jointe 1103241

cette sub est dans le module de la feuille "Feuil1" ; pour voir ce module, fais un double-clic sur la ligne "Feuil1" qui est pointée par la flèche verte ; OU sélectionne cette ligne et appuie sur la touche Entrée ; ça, c'était à partir de la fenêtre "Microsoft Visual Basic" ; à partir de la fenêtre "Excel", tu peux faire un clic droit sur l'onglet "Feuil1" puis choisir l'item "Visualiser le code".

attention de bien choisir le module de la feuille concernée, ici celui de "Feuil1" et pas "Feuil2" ; en plus des modules standards tels que Module1 (que tu connais déjà), un classeur Excel a son propre module nommé ThisWorkbook et chaque feuille a son propre module (c'est pour des subs événementielles).

une fois que la sub est placée dans le bon module de la feuille concernée, tu n'as rien à faire de spécial pour exécuter la sub : fais simplement Alt F11 pour retourner sur Excel, puis utilise ta feuille comme d'habitude ; ici : D5 est vide ; tu as juste à choisir un des 2 items de la liste : "MARQUE1" ou "MARQUE2" ; la cellule D14 sera modifiée car elle contient la formule =SI(D5="";"";D5), et comme un calcul sur "Feuil1" s'est produit, la sub Worksheet_Calculate() est appelée.​

soan
Merci,

Je vais essayer ça tantôt et je dis si tout fonctionne bien.
@plus
 

JohDan

XLDnaute Nouveau
Bonjour JohDan, sylvanu, le fil,

bienvenue sur le site XLD ! :)

pour te répondre, je suis parti du fichier du post #2 de sylvanu.

j'ai réécrit la sub « à ma sauce » :

Regarde la pièce jointe 1103241

cette sub est dans le module de la feuille "Feuil1" ; pour voir ce module, fais un double-clic sur la ligne "Feuil1" qui est pointée par la flèche verte ; OU sélectionne cette ligne et appuie sur la touche Entrée ; ça, c'était à partir de la fenêtre "Microsoft Visual Basic" ; à partir de la fenêtre "Excel", tu peux faire un clic droit sur l'onglet "Feuil1" puis choisir l'item "Visualiser le code".

attention de bien choisir le module de la feuille concernée, ici celui de "Feuil1" et pas "Feuil2" ; en plus des modules standards tels que Module1 (que tu connais déjà), un classeur Excel a son propre module nommé ThisWorkbook et chaque feuille a son propre module (c'est pour des subs événementielles).

une fois que la sub est placée dans le bon module de la feuille concernée, tu n'as rien à faire de spécial pour exécuter la sub : fais simplement Alt F11 pour retourner sur Excel, puis utilise ta feuille comme d'habitude ; ici : D5 est vide ; tu as juste à choisir un des 2 items de la liste : "MARQUE1" ou "MARQUE2" ; la cellule D14 sera modifiée car elle contient la formule =SI(D5="";"";D5), et comme un calcul sur "Feuil1" s'est produit, la sub Worksheet_Calculate() est appelée.​

soan
Malheureusement, je crois vraiment que je suis nulle, là tout de suite. J'ai beau tenter de transposer le tout, je n'y arrive juste pas. À moins que ce soit mon établissement qui bloque le tout, je ne sais pas où je erre.

Je te joins donc un ficher où je crois avoir retirer toutes les informations confidentielles, pour que tu puisses faire de la magie lolll.

Si j'étais dans Acrobat, je pense que j'y arriverais plus facilement, mais bon, je dois le faire dans Excel, car notre établissement ne supporte pas Acrobat et il faut que je rendre mon formulaire "publique" quand il sera terminé.

Alors, le voici... J'espère que tu y arriveras, là où moi je n'y arrive tout simplement pas.

Merci d'avance.
 

Pièces jointes

  • Test pour Excel download.xlsm
    59.4 KB · Affichages: 3

soan

XLDnaute Barbatruc
Inactif
Bonsoir JohDan,

ton fichier en retour. :)

en B2, il y a : "AVIS DE TRAVAUX / INTERRUPTION DE SERVICE"
➯ les lignes 24 à 27 sont affichées.

en B2, saisis "INFO TRAVAUX" ➯ les lignes 24 à 27 sont cachées.

si tu effaces B2 (touche Suppression), OU si tu saisis une autre donnée,
les lignes 24 à 27 sont de nouveau affichées.



ATTENTION :

Rows(24).Hidden = 0 : idem que : Rows(24).Hidden = False

➯ la ligne 24 n'est pas cachée ➯ la ligne 24 est affichée ; et il ne faut pas faire :
Rows(24).Show = 0 car la propriété .Show n'existe pas pour une ligne.

Rows(24).Hidden = -1 : idem que : Rows(24).Hidden = True
➯ la ligne 24 est cachée ➯ la ligne 24 n'est pas affichée.

ce sera plus facile si tu te dis : le mot « Hidden » traduit en français signifie « caché » ; si caché est Vrai (True ou -1), alors la ligne est masquée (= cachée) ; si caché est Faux (False ou 0), alors la ligne n'est pas masquée, donc elle est affichée.​



VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Cells(1).Address = "$B$2" Then _
    Rows("24:27").Hidden = [B2] = "INFO TRAVAUX"
End Sub

la sub Worksheet_Calculate() initiale ne marchait pas car ton exo aurait dû dépendre d'une cellule ayant une formule calculée, ce qui n'était pas le cas ; j'ai donc utilisé à la place Worksheet_Change().​

à te lire pour avoir ton avis. ;)

soan
 

Pièces jointes

  • Test pour Excel download.xlsm
    70.4 KB · Affichages: 4

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour JohDan, Soan,
Ou encore avec :
VB:
Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("B2:E2")) Is Nothing Then
        If LCase(Target) = "info travaux" Then
            Rows("24:27").Hidden = True
            ' Autre traitement possible quand on masque
        Else
            Rows("24:27").Hidden = False
            ' Autre traitement possible quand on démasque
        End If
    End If
End Sub
Plus souple si on veut ajouter d'autres traitements. Lcase évite de prendre en compte majuscules et minuscules.
 

Pièces jointes

  • Test pour Excel download.xlsm
    70 KB · Affichages: 13

JohDan

XLDnaute Nouveau
Bonsoir JohDan,

ton fichier en retour. :)

en B2, il y a : "AVIS DE TRAVAUX / INTERRUPTION DE SERVICE"
➯ les lignes 24 à 27 sont affichées.

en B2, saisis "INFO TRAVAUX" ➯ les lignes 24 à 27 sont cachées.

si tu effaces B2 (touche Suppression), OU si tu saisis une autre donnée,
les lignes 24 à 27 sont de nouveau affichées.



ATTENTION :

Rows(24).Hidden = 0 : idem que : Rows(24).Hidden = False

➯ la ligne 24 n'est pas cachée ➯ la ligne 24 est affichée ; et il ne faut pas faire :
Rows(24).Show = 0 car la propriété .Show n'existe pas pour une ligne.

Rows(24).Hidden = -1 : idem que : Rows(24).Hidden = True
➯ la ligne 24 est cachée ➯ la ligne 24 n'est pas affichée.

ce sera plus facile si tu te dis : le mot « Hidden » traduit en français signifie « caché » ; si caché est Vrai (True ou -1), alors la ligne est masquée (= cachée) ; si caché est Faux (False ou 0), alors la ligne n'est pas masquée, donc elle est affichée.​



VB:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Cells(1).Address = "$B$2" Then _
    Rows("24:27").Hidden = [B2] = "INFO TRAVAUX"
End Sub

la sub Worksheet_Calculate() initiale ne marchait pas car ton exo aurait dû dépendre d'une cellule ayant une formule calculée, ce qui n'était pas le cas ; j'ai donc utilisé à la place Worksheet_Change().​

à te lire pour avoir ton avis. ;)

soan
Wow un gros MERCI. C'est exactement ce dont j'avais besoin. Je suis très contente du résultat.

Merci, merci, merci.

Joh :)
 

JohDan

XLDnaute Nouveau
Bonjour JohDan, Soan,
Ou encore avec :
VB:
Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("B2:E2")) Is Nothing Then
        If LCase(Target) = "info travaux" Then
            Rows("24:27").Hidden = True
            ' Autre traitement possible quand on masque
        Else
            Rows("24:27").Hidden = False
            ' Autre traitement possible quand on démasque
        End If
    End If
End Sub
Plus souple si on veut ajouter d'autres traitements. Lcase évite de prendre en compte majuscules et minuscules.
Cela fonctionne aussi. Vous êtes vraiment super. Très heureuse des résultats. Je vais conserver tout ceci précieusement pour utilisation future au besoin.

Désolée si je mets du temps aussi à vous revenir, je ne travaille pas là-dessus tous les jours, j'ai bien d'autres chats à fouetter au boulot. Ce dossier-là est un projet spécial et vous venez tous les deux de lui faire prendre une belle avance.

Encore une fois - MERCI À TOUS LES DEUX !!!

Joh :)
 

Discussions similaires