Masquer colonnes et lignes en fonction d'un choix dans liste déroulante

mde

XLDnaute Nouveau
Bonjour,

Je travaille sur un fichier xls et j'aimerais faire en sorte que les colonnes et les lignes se masquent en fonction de la valeur sélectionnée dans une liste de choix.

Mon tableau comporte
- une feuille1 avec en A les références produits, en B la famille à laquelle il appartient, de C à L des infos communes à tous les produits et de M à FB toutes les caractéristiques disponibles.
- une feuille2 avec en A le code de la famille, en B le libellé de la famille et de C à L les caractéristiques associées à chaque famille

Les caractéristiques attribuées à un produit varie donc en fonction de la famille à laquelle il appartient. J'ai créé sur la feuille1 une cellule avec une liste de choix incluant toutes les familles produits listées en feuille2

Il me faudrait donc une macro ou autre qui, je choisi la famille 00 dans la liste déroulante de la feuille1 passe la colonne B en revue pour masquer toutes les lignes ou ne figurent pas 00, puis trouve 00 dans la colonne B de la feuille2 et masque les colonnes de la feuille1 dont l'en tête ne correspond pas aux valeurs stockées dans les colonnes C à L de la ligne ou elle aura trouvé 00 dans la colonne B de la feuille.

Je ne sais pas si tout est très compréhensible ^^ Je joint un fichier exemple pour que ce soit plus clair (j'ai enlevé toutes les données confidentielles forcément et mon fichier a un total de 7000 lignes au total).

Merci d'avance de votre aide !!!
 

Pièces jointes

  • exemple1.xlsx
    71.1 KB · Affichages: 39
  • exemple1.xlsx
    71.1 KB · Affichages: 43
  • exemple1.xlsx
    71.1 KB · Affichages: 41

Modeste

XLDnaute Barbatruc
Re : Masquer colonnes et lignes en fonction d'un choix dans liste déroulante

Bonjour mde et bienvenue,

Si tu repasses par ici, tu verras bien si la réponse qui suit t'aide.
Ton projet est sans doute clair pour toi ... mais beaucoup moins pour ceux qui le découvrent ici.

Avec ce que j'ai compris, teste ce qui suit: dans la fenêtre de code de la "Feuille1", copie-colle les quelques lignes suivantes
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$C$1" Then Exit Sub
If Me.AutoFilter.FilterMode Then Me.ShowAllData
If Target = "" Or Target = "Libellé" Then Exit Sub
Application.ScreenUpdating = False
[A4].CurrentRegion.AutoFilter Field:=2, Criteria1:=Target
Dim tabCol()
With Sheets("Feuille2")
    ligneFam = Application.Match(Target, .[A:A], 0)
    For col = 3 To 12
        If .Cells(ligneFam, col) <> "" Then
            ReDim Preserve tabCol(x)
            tabCol(x) = Application.Match(.Cells(ligneFam, col), [4:4], 0)
            x = x + 1
        End If
    Next col
End With
On Error GoTo fin
test = UBound(tabCol)
Columns("M:FB").EntireColumn.Hidden = True
For c = 0 To UBound(tabCol)
    Cells(1, tabCol(c)).EntireColumn.Hidden = False
Next c
fin:
Application.ScreenUpdating = True
End Sub
La macro (puisque c'en est une, se déclenche lorsque tu sélectionnes un élément de ta liste déroulante.

Attention, il est plus que vraisemblable que des situations particulières n'aient pas été prévues ... Voyons déjà si tu reviens :)
 

mde

XLDnaute Nouveau
Re : Masquer colonnes et lignes en fonction d'un choix dans liste déroulante

Bonjour Modeste,

Merci beaucoup pour ta réponse :) Je vais tester ton code tout de suite.

J'imagine bien que mon explication n'était pas très claire ^^ mais j'ai fait de mon mieux pour expliciter tout ça.

J'espère que ça va marcher, merci encore !
 

mde

XLDnaute Nouveau
Re : Masquer colonnes et lignes en fonction d'un choix dans liste déroulante

Modeste,

J'ai testé et malheureusement cela ne donne pas le résultat attendu :

- les colonnes masquée dans feuille1 sont toujours les mêmes quel que soit le choix dans la liste déroulante
- les lignes sont toutes masquées quand je choisis une valeur autre que 00 dans la liste de choix

J'ai modifié mon fichier exemple1 pour ajouter une feuille3 avec le résultat que j'aimerais obtenir si par exemple je choisissais le code famille 120050 dans ma liste de choix.

Un peu de contexte en plus pour éclaircir la chose :
Ce fichier est une extraction d'un logiciel permettant de gérer l'information produit dans une entreprise. Dans ce logiciel il y a toute une liste de champs "caractéristiques produit" qui sont rattachées à des famille de produits. Donc en fonction de la famille à laquelle appartient un produit on a la possibilité de saisir telle ou telle caractéristiques mais pas telle ou telle autre (exemple : si le produit appartient à la famille "Table" on peut saisir les caractéristiques "couleurs", "dimension"...mais pas "contenance" ou "floraison" même si elles existent dans le logiciel).
Quand je fais une extraction j'obtiens ma liste de produit, leur famille ainsi tous les champs "caractéristiques produits" disponible dans le logiciel (ex un colonne "couleur", une colonne "dimension"...). Pour une référence de produit, certaines de ces caractéristiques sont "Vide" d'autres contiennent de l'information (les chiffres sont le nombre de caractères présent dans le champ). Je voudrais trouver une façon simple de voir rapidement si pour un produit donné le champ est vide parce qu'on a oublié de saisir de l'info dedans ou s'il est vide parce qu'il n'est pas disponible pour ce produit en fonction de sa famille.

D'où mon besoin quand je sélectionne un code famille dans ma liste déroulante de masquer les colonnes caractéristiques qui ne sont pas rattachés à cette famille et les lignes de produit n'appartenant pas à la famille (ex: si je sélectionne le code 120050 de la famille "Table" il faut affichers les colonnes "couleurs" et "dimensions" mais masquer la colonne "floraison")

Hem hem...pas sure d'avoir été beaucoup plus claire ^^

Merci de l'aide quoi qu'il en soit !!
 

Pièces jointes

  • exemple1.xlsm
    128.5 KB · Affichages: 31
  • exemple1.xlsm
    128.5 KB · Affichages: 43
  • exemple1.xlsm
    128.5 KB · Affichages: 41

Modeste

XLDnaute Barbatruc
Re : Masquer colonnes et lignes en fonction d'un choix dans liste déroulante

Re-bonjour,

les lignes sont toutes masquées quand je choisis une valeur autre que 00 dans la liste de choix
Si tu parles du résultat obtenu avec ton premier fichier exemple ... c'est un peu normal: il n'y avait que la famille '00' qui figurait dans la "Feuille1". J'avais ajouté une ou deux autres familles présentes en "Feuille2" pour faire des tests: il me semblait que ça marchait.

les colonnes masquée dans feuille1 sont toujours les mêmes quel que soit le choix dans la liste déroulante
Ben ... s'il n'y a qu'une famille ça semble assez normal (mais j'insiste: il est probable que j'aie mal compris!?)
Ceci dit, tu as essayé la macro, dans ton dernier fichier, en choisissant le code '120050' ?? Il me semble que nos résultats sont identiques (ou alors il y a vraiment un truc énoooorme qui m'échappe :eek::confused:)
 

mde

XLDnaute Nouveau
Re : Masquer colonnes et lignes en fonction d'un choix dans liste déroulante

Je suis désolée, je suis vraiment une une quiche parfois ^^ Effectivement ça marche mieux quand on applique ton code au fichier complet :D
C'est tout bon ! Merci beaucoup pour ton aide, c'est parfait !!!
 

Modeste

XLDnaute Barbatruc
Re : Masquer colonnes et lignes en fonction d'un choix dans liste déroulante

Re²,

Je n'ai rien contre les quiches, moi (les lorraines, par exemple ou celles au saumon me conviennent tout à fait)!

Tu verras à l'usage si des améliorations doivent être apportées. Ci-dessous une version qui affiche toutes les colonnes, si C1 est vide et actualise les colonnes si la famille n'existe pas ... à tester, bien sûr!
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$C$1" Then Exit Sub
If Me.AutoFilter.FilterMode Then Me.ShowAllData
If Target = "" Or Target = "Libellé" Then Columns("M:FB").EntireColumn.Hidden = False: Exit Sub
Application.ScreenUpdating = False
Columns("M:FB").EntireColumn.Hidden = True
[A4].CurrentRegion.AutoFilter Field:=2, Criteria1:=Target
Dim tabCol()
With Sheets("Feuille2")
    ligneFam = Application.Match(Target, .[A:A], 0)
    For col = 3 To 12
        If .Cells(ligneFam, col) <> "" Then
            ReDim Preserve tabCol(x)
            tabCol(x) = Application.Match(.Cells(ligneFam, col), [4:4], 0)
            x = x + 1
        End If
    Next col
End With
On Error GoTo fin
test = UBound(tabCol)
For c = 0 To UBound(tabCol)
    Cells(1, tabCol(c)).EntireColumn.Hidden = False
Next c
fin:
Application.ScreenUpdating = True
End Sub
 

Discussions similaires

Réponses
8
Affichages
431

Statistiques des forums

Discussions
312 195
Messages
2 086 078
Membres
103 112
dernier inscrit
cuq-laet