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

Masquer des colonnes en fonction des valeurs d'une plage avec menu déroulant

citizenbaban

XLDnaute Junior
Bonjour à tous,

Petit problème avec une macro d'affichage/masquage de colonnes. J'ai cherché sur le forum et un peu sur le net mais j'ai surtout trouvé des solutions qui ne s'appliquent que pour une cellule et pas une plage de cellule.
Voici l'idée :

En colonne A, de A3 à A150 des cellules à menu déroulant "Test1; Test2; Tets3".
En fonction de la valeur retenue en A : afficher les colonnes "B" si Test 1, "E:G" si Test2 et "H:J" si Test 3, et si cellule A vide : "B:J" masqué.

Ca, j'arrive à le faire avec ce code :


VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim h, iSct As Range
    Set iSct = Intersect(Target, Range("A2:A150"))
    If iSct Is Nothing Then Exit Sub
        
    Application.EnableEvents = True
    For Each h In iSct.Cells
            If IsEmpty(h) Then
            Columns("B:J").Hidden = True
            
            ElseIf h.Value = "Test1" Then
            Columns("B:D").Hidden = False
                
            ElseIf h.Value = "Test2" Then
            Columns("E:G").Hidden = False
            
            ElseIf h.Value = "Test3" Then
            Columns("H:J").Hidden = False
            
        End If

        Next
      
End Sub


Le truc c'est que si je supprime un Test sur une ligne, ça ne prend pas en compte les valeurs des cellules au dessus/en dessous, idem si un Test3 est remplacé par un Test2 par exemple.

Est-ce que vous auriez une idée pour "interconnecter" les valeurs en A ? (sachant que le A150 est pris pour être large, le nombre de saisies en A sera variable).

Merci à tous,

Citizen
 

Iznogood1

XLDnaute Impliqué
Bonjour,

je ne comprends pas la logique.
En fonction de la valeur retenue en A : afficher les colonnes "B : D" si Test 1, "E:G" si Test2 et "H:J" si Test 3, et si cellule A vide : "B:J" masqué.

Quelles colonnes doivent être affichées s'il y a "Test1" en A3 et "Test2" en A4 ?
(On ne peut pas afficher / masquer des colonnes différentes pour chaque ligne)
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

citizenbaban
Si tu testes ce code en lieu et place du tien, tu en penses quoi?
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Columns("B:J").Hidden = True
If IsEmpty(Target) Then Exit Sub
Range(Choose(Right(Target, 1) * 1, "B:D", "E:G", "H:J")).Columns.Hidden = False
End Sub

EDITION
Bonjour Iznogood1
 

citizenbaban

XLDnaute Junior
Bonjour Staple1600, Iznogood,
J'ai une incompatiblité de type, erreur d'execution 13 sur la ligne
Range(Choose(Right(Target, 1) * 1, "B", "E:G", "H:J")).Columns.Hidden = False

Le Test1/Test2/Test3 sont génériques, j'ai mis ça car je n'ai pas encore l'intitulé exact de tous les termes qui seront dans la liste déroulante, mais ils ne suivront pas une incrémentation.
 

Staple1600

XLDnaute Barbatruc
Re

J'ai suivi ton exemple
Testes avec dans la liste déroulante les valeurs Test1,Test2,Test3
et tu n'auras pas d'erreur.

Quand tu nous donneras les intitulés exacts, j'adapterai mon code.
Pour le moment, nous sommes en période de test, donc je teste selon les éléments du message 1
(et mon test est OK sur mon PC, sinon je n'aurai pas posté mon code...)
 

citizenbaban

XLDnaute Junior
Bonjour,

je ne comprends pas la logique.


Quelles colonnes doivent être affichées s'il y a "Test1" en A3 et "Test2" en A4 ?
(On ne peut pas afficher / masquer des colonnes différentes pour chaque ligne)

En fait je voudrais :
-si rien entre A3:A150 : colonnes B ) J masquées
- si 1 valeur ou + par test : afficher les colonnes correspondantes

Et du coup en écrivant ça je crois que je viens de trouver une piste lol. Il me suffirait juste de définir la plage A3:A150 et de mettre en critère :
- si nombre de Test 1>0 alors masquer colonnes B à D
- si nombre de Test 2>0 alors masquer colonnes E à G
etc

Non ?
 

citizenbaban

XLDnaute Junior
Exact, j'avais fait le boulet.
donc ça marche ligne par ligne effectivement mais ça ne tient pas compte des valeurs avant/après :
si je met Test1 en A2, il affiche bien les colonnes B à D mais si je mets Test 2 en A3, ces cette condition qui s'applique donc ça masque B à D pour afficher E à F, or j'aimerai que les conditions se cumulent en quelque sorte.

Je peux essayer de vous faire un fichier pour expliquer un peu mieux mais il faut que je l'anonymise avant
 

Staple1600

XLDnaute Barbatruc
Re

Je suis dans le même questionnemnt qu'Iznogood1 quant à la logique de la chose.
Mon code se base sur le Target
Donc si on change de cellule, c'est logique que le masquage/démasquage change à chaque fois, non?

NB:
Je peux essayer de vous faire un fichier pour expliquer un peu mieux mais il faut que je l'anonymise avant
Si ce petit fichier eut été là dès le départ, nous ne serions pas arrivé au message#8
 

citizenbaban

XLDnaute Junior
Re

Je suis dans le même questionnemnt qu'Iznogood1 quant à la logique de la chose.
Mon code se base sur le Target
Donc si on change de cellule, c'est logique que le masquage/démasquage change à chaque fois, non?

NB:
Oui c'est logique

En fait c'est un fichier qui doit servir au traitement de résultats de beaucoup d'espèces de bactéries. En A seront notées les familles (Staphylocoques, entérobactéries ceux là je pense que vous les connaissez ^^ mais il y en a des dizaines d'autres) et les colonnes serviront à réaliser les traitements de résultats par famille. Donc là actuellement j'ai un tableau qui va jusqu'en CW. Ingérable si il est ouvert "en l'état".

L'idée était donc d'avoir toutes les espèces de bactéries en colonne B qui seront rentrées manuellement, et leur famille choisie par menu déroulant en colonne A (pas possible de l'automatiser ça) donc je peux me retrouver avec 15 Staphylocoques, 34 entérobactéries, et 3 autres familles par exemple.
L'idée c'est de n'afficher automatiquement que les colonnes "utiles" et de masquer celles des familles qui n'apparaissent pas car ça ne dépassera jamais 5 ou 6 familles donc lisible sur un écran d'ordi ou sur une impression A3.

Ce n'est peut etre pas très clair lol, je vais essayer d'anonymiser un fichier pour le début d'après-midi
 

citizenbaban

XLDnaute Junior
Voici le fichier draft, grandement épuré. Je n'ai mis que 5 "blocs famille" dans le tableau pour ne pas le charger inutilement (5 blocs de 3 colonnes de couleurs différentes juste avant la colonne "remarque").

Bon appétit
 

Pièces jointes

  • Draft.xlsx
    31.8 KB · Affichages: 15

Staple1600

XLDnaute Barbatruc
Re

Chez moi aucune lise déroulante en A4:A150
(mise en place avec Données/Validation)
Bizarrre ou alors elle a disparue lors du downgrading du *.xlsm en *.xls

Du coup, je viens de nommer liste la plage A3:A22
et j'ai recréé la liste déroulante (avecAutoriser: Liste et Source=liste)
 

Staple1600

XLDnaute Barbatruc
Re

En attendant de tes nouvelles, je suis parti sur cette piste
Tu en penses quoi?
(C'est juste pour un test, pour la logique du truc)
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim x
x = Application.Match(Target, [liste], 0)
If Application.CountIf([colA], Target) > 1 Then
Select Case x
Case 1, 3, 5, 7
MsgBox "titi"
Case 2, 4, 6, 7, 8
MsgBox "toto"
Case Is > 13
MsgBox "tutu"
End Select
End If
End Sub
liste et colA correspondent à des plages nommées
et selon la valeur renvoyée par Application.Match dans le Select Case, on lance telle ou telle action
(symbolisée ici pour le test par des MsgBox)
 

citizenbaban

XLDnaute Junior
Ha oui bizarre en effet, je la retrouvais bien en ouvrant le fichier ici.
Je regarde de suite

Tu peux m'expliquer ton code stp? je n'ai jamais utilisé les case
 
Dernière édition:

Discussions similaires

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