Masquer colonne sous condition
Bonjour,
Je souhaiterais masquer des colonnes dans une feuille de mon fichier excel sous condition du contenu d'une autre cellule dans une autre feuille.
Je vous explique par rapport a mon fichier joint:
Dans ma feuille "CHOIX" j'ai 5 cases a remplir avec une liste de choix (il y en a 27) pour chaque case. Je ne suis pas obligé de tout remplir.
Dans ma feuille "LUNDI" j'ai un tableau de 27 colonnes correspondant au 27 choix précédents que j'ai dupliqué 5 fois a la suite.
Ce que je veux c'est que a chaque fois que je sélectionne un produit dans la liste des choix de chaque case, dans ma feuille "LUNDI" il ne s'affiche que les colonnes correspondants au choix fais et les autres se masquent automatiquement.
Exemple: dans la feuille "CHOIX" pour lundi, la case 1 je choisi "pain", case 2 "baguette", case 3 "croissant", case 4 jusqu’à 5 rien, je souhaite que dans la feuille "LUNDI" j'ai un tableau de 5 colonnes avec colonne 1 "pain", colonne 2 "baguette", colonne 3 "croissant" et le reste rien.
J’espère avoir été clair.
Merci d'avance de votre aide.
Bonjour,
Dans le fichier joint, 3 codes.
Le premier, dans l'évènement de feuille
- Lorsque tu actives un onglet (LUNDI.....), tu appelles le deuxième code
Le deuxième, qui masque les colonnes en fonction de tes choix
Le troisième qui te permet d'afficher tout
Pense à rajouter le premier dans chaque évènement de feuilles que tu vas créer (MARDI.....)
Les codes :
Private Sub Worksheet_Activate()
Call Masq(Me.Name)
End SubPuis :
Sub Masq(Nom As String)
Dim Cel As Range, C As Range
Application.ScreenUpdating = False
Cells.EntireColumn.Hidden = False
For Each Cel In Sheets("CHOIX").Range("A8:A14")
If UCase(Format(Cel, "dddd")) = UCase(Nom) Then
For Each C In Sheets(Nom).Range("B3:EF3")
If IsEmpty(C) Or IsError(Application.Match(C, Cel.Offset(, 1).Resize(1, 5), 0)) Then
C.EntireColumn.Hidden = True
End If
Next C
Exit Sub
End If
Next Cel
End SubEt enfin :
Sub affiche()
Cells.EntireColumn.Hidden = False
End SubEt ton fichier en exemple :
bonne journée
Bonjour,
Merci cousinhub pour ta réponse. On y est presque je pense.
Dans ma feuille LUNDI, j'ai créer 5 tableau de 27 colonnes chacun, les 27 premières correspondent au choix1 dans la feuille CHOIX, les 27 suivants au choix2...
quand je choisi PAIN dans le choix1, il faudrait afficher seulement la colonne pain des 27 premières colonnes, BAGUETTE dans le choix2 doit afficher seulement la colonne baguettes des 27 colonnes suivantes...
Dans ta réponse j'ai les 5 choix d'afficher pour chaque 27 colonnes.
J’espère que t'as compris mon raisonnement. Logiquement avec les choix que tu as fais dans le fichier que tu m'as envoyé, je devrais avoir un tableau de 5 colonnes avec Baguette, 1/2 Baguettes, Pain au chocolat, Torsades au Chocolat et la 5eme colonne vide.
Encore Merci
Re-,
J'ai modifié le code comme ceci :
Sub Masq(Nom As String)
Dim Cel As Range, C As Range
Dim I As Byte
Application.ScreenUpdating = False
Cells.EntireColumn.Hidden = False
For Each Cel In Sheets("CHOIX").Range("A8:A14")
If UCase(Format(Cel, "dddd")) = UCase(Nom) Then
For Each C In Sheets(Nom).Range("B3:EF3")
I = Application.RoundUp(C.Column / 27, 0)
If C.Value = 0 Or C.Value <> Cel.Offset(, I) Then C.EntireColumn.Hidden = True
Next C
Exit Sub
End If
Next Cel
End SubLe fichier :
Merci cousinhub, c'est vraiment sympa, depuis le temps que je cherchais la solution.
Par contre juste une dernière chose, je souhaite quand même que dans mon tableau final j'ai l'affichage de 5 colonnes, même celle ou j'ai rien mis dans le choix. Exemple, je choisi pain case1, baguette case2, vide case3, 1/2 baguettes case4 et rien case5, il fraudais que ça affiche pain, baguettes, colonne vide, 1/2 baguette et colonne vide.
Merci encore
Re-,
Remplace le code par celui-ci :
Sub Masq(Nom As String)
Dim Cel As Range, C As Range
Dim I As Byte
Application.ScreenUpdating = False
Cells.EntireColumn.Hidden = False
For Each Cel In Sheets("CHOIX").Range("A8:A14")
If UCase(Format(Cel, "dddd")) = UCase(Nom) Then
For Each C In Sheets(Nom).Range("B3:EF3")
I = Application.RoundUp(C.Column / 27, 0)
If C.Value = 0 Or C.Value <> Cel.Offset(, I) Then C.EntireColumn.Hidden = True
If C.Column Mod 27 = 0 And IsEmpty(Cel.Offset(, I)) Then C.EntireColumn.Hidden = False
Next C
Exit Sub
End If
Next Cel
End SubBonne soirée
Bonsoir cousinhub
Encore merci pour ton aide, c'est exactement ce que je voulais.
Par contre est-ce normal le ralentissement que j'ai une fois le code changé? quand je passe sur la feuille LUNDI, ça met un petit laps de temps avant de s'afficher.
Merci
Re-,
Par contre est-ce normal le ralentissement que j'ai une fois le code changé? quand je passe sur la feuille LUNDI, ça met un petit laps de temps avant de s'afficher.
Chez moi, je ne le remarque pas....
Stoppe Excel, et redémarre, peut-être?
Bonne soirée
Bonjour,
Merci cousinhub, c'est bon j'ai redémarré mon ordinateur et tout fonctionne parfaitement.
Bonne journée