Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Formulaire permettant de masquer et/ou d'afficher une ligne VBA en fonction d'un caractère et/ou d'une couleur

doby

XLDnaute Nouveau
Bonjour,

Je viens solliciter votre aide afin de créer un formulaire permettant d'afficher ou de masquer un ligne en fonction du remplissage d'une cellule.
Utilisant le fichier en partie sur le téléphone les boutons radio type Userform n'est pas envisageable.
La cellule déclenchant la macro serait soit vide soit complété d'un simple "x".
Pour que ce soit concret: je répond à une question par oui ou par non ; cochant donc soit le K15 pour oui et le M15 pour non. Si la réponse est oui la ligne 73 doit être masquée. Jusque là ca fonctionne... enfin à moitié. Si je retire le "x" du K15 la ligne 73 ne réapparait pas!
J'ai tenté de forcer l'affichage en créant la règle M15 qui est strictement opposé à K15 sans que ça fonctionne. J'ai également essayé de remplacer le case else par case"" ou case " ".


VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$K$15" Then
        Call validationapp
    End If
End Sub

Sub validationapp()
 
    If [K15] <> msValeurSave Then
        Select Case [K15]
                Case "x"
                    Rows("73:73").Hidden = True '  ok
                Case Else
                    Rows("73:73").Hidden = False ' ok
                End Select
        msValeurSave = [K15]
    End If
End Sub



Private Sub Worksheet_Change2(ByVal Target As Range)
    If Target.Address = "$M$15" Then
        Call validationapp2
    End If
End Sub

Sub validationapp2()
 
    If [M15] <> msValeurSave Then
        Select Case [M15]
                Case "x"
                    Rows("73:73").Hidden = False '   ok
                Case Else
                    Rows("73:73").Hidden = True '   ok
                End Select
        msValeurSave = [M15]
    End If
End Sub

NB: Ma demande avec la partie couleur arrive après
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Pas certain d'avoir tout compris mais les lignes ci-dessous masquent ou démasque la ligne 73 en fonction du contenu de K15.

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    '
    ' Masque ou démasque la ligne 73 si K15 ="x" ou non
    If Target.Address = "$K$15" Then Rows(73).EntireRow.Hidden = Target.Value = "x"
End Sub

Cordialement
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Vous ne disiez pas (même si je m'en doutais) que K15 était fusionné !
C'est pourquoi j'attendais le fichier
Je vous propose ceci qui fonctionne sur votre fichier :

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    '
    ' Masque ou démasque la ligne 73 si K15 ="x" ou non
    If Left(Target.Address(0, 0), 3) = "K15" Then Rows(73).EntireRow.Hidden = Target.Cells(1, 1).Value = "x"
   
End Sub

Lorsque vous mettez quelque chose en K15 Target.Address = "$K$15" lorsque vous effacez K15, Target.Address = "$K$15:$L$15"

Un avis personnel : dans votre fichier est-il bien utile de fusionner les cellules de k:L ? Jouez sur les largeurs.
De façon générale, commencez par les fonctionnalités et ensuite la présentation, pas l'inverse.

Cordialement
 

Pièces jointes

  • fch test.xlsm
    41.6 KB · Affichages: 8

doby

XLDnaute Nouveau
Merci!!!!!
Effectivement je n'ai pas pensé à cette subtilité!
Je suis d'accord sur votre retour concernant la présentation et l'esthétique sauf que le fichier de base n'est pas de mon fait et que celui ci doit rester strictement identique
 

doby

XLDnaute Nouveau
Deuxième question:
Le remplissage de K20 doit cacher deux lignes c'est un x (68 et 72) et uniquement la ligne 68 si c'est complété par NV. Je pense que la 2e ligne de code et la 3e rentre en conflit...


Troisième question:
J'ai contrainte supplémentaire pour le fonctionnement de la cellule T15. J'ai deux possibilités soit NV soit un nombre.
Si NV ou vide alors la ligne 70 doit s'afficher. Sinon la ligne 70 doit rester cachée.
Ou si T15<U17 alors la ligne 70 reste cachée et la ligne 61 doit s'affichée.
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Il est complètement inutile de répéter le test sur target.

Code:
If Left(Target.Address(0, 0), 3) = "K20" Then
' Les trois action ici
End If

Pour la deuxième question, ce pourrait être en autres :
VB:
If Left(Target.Address(0, 0), 3) = "K20" Then Union(Rows(68),Rows(72)).EntireRow.Hidden = Target.Cells(1, 1).Value = "x"

Pour la troisième question essayez quelque chose sur la base de ce que nous avons déjà fait et voyez. Je ne vais pas vous pondre du code tout prêt.

Cordialement
 

doby

XLDnaute Nouveau
Voilà l'essai

VB:
If Left(Target.Address(0, 0), 3) = "K20" Then
    Union(Rows(68), Rows(72)).EntireRow.Hidden = Target.Cells(1, 1).Value = "x" 
    Rows(68).EntireRow.Hidden = Target.Cells(1, 1).Value = "NV"

Ce morceau ne fonctionne pas complètement car le x en K20 ne cache que la ligne 72. Le basculement avec NV change bien le statut car la ligne 68 se cache. J'ai l'impression que le code se bloque entre le fait qu'il y ait un x et donc qui doit cacher la ligne 68 mais le fait qu'il n'y ait pas NV et donc que la 68 devrait être apparente.

Par contre si je passe par la fonction or, la c'est la seconde partie qui ne veut pas fonctionner: le x fonctionne bien mais jamais le NV.

VB:
 If Left(Target.Address(0, 0), 3) = "K20" Then
    Union(Rows(68), Rows(72)).EntireRow.Hidden = Target.Cells(1, 1).Value = "x" Or Rows(68).EntireRow.Hidden = Target.Cells(1, 1).Value = "NV"

Enfin pour la 3e question j'ai essayé de faire le truc a l'envers en indiquant uniquement les conditions de non affichage considérant l'absence de texte ou NV comme par défaut. Mais ca ne fonctionne pas non plus

VB:
    If Left(Target.Address(0, 0), 3) = "T18" Then Rows(54).EntireRow.Hidden = Target.Cells(1, 1).Value >= U20

NB: je ne cherche pas à avoir un code tout pondu mais j'avoue que mon niveau VBA se situe entre chèvre intergalactique et bon à rien intersidéral.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…