XL 2016 VBA - Affichage de colonne par catégories

Roseline

XLDnaute Occasionnel
Bonjour,
J'ai un fichier qui va contenir une énorme quantité de ligne et de colonne. Dans mon fichier joint comme exemple, ce que j'ai besoin c'est que lorsque je choisi une couleur dans ma cellule B1, j'ai besoin que toutes les colonnes sous la couleur choisie apparaissent (le bleu est choisi, donc je devrais voir apparaître seulement les colonnes C/D/E. Les autres devraient être masquées. Par contre, si je choisi un numéro dans ma cellule B4 (j'ai choisi 1, les colonnes C, F et K devraient apparaître et les autres doivent être masquées. Si je choisi 5 dans ma cellule B4, j'aurai seulement la colonne J qui apparaîtra. Bien entendu mes colonnes A et B doivent toujours rester visibles.
Merci de votre très précieuse et belle journée à vous!
 

Pièces jointes

  • Test - Excel Download.xlsm
    37.4 KB · Affichages: 28

gbinforme

XLDnaute Impliqué
Bonjour,

Regardes si le code que je t'ai mis dans ta feuille correspond à ton souhait.
VB:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.CountLarge = 1 Then
        If Target.Address = "$B$1" Then
            Columns("C:L").Hidden = True
            Select Case UCase(Target.Value)
                Case UCase(Range("C4").Value)
                        Columns("C:E").Hidden = False
                Case UCase(Range("F4").Value)
                        Columns("F:J").Hidden = False
                Case UCase(Range("K4").Value)
                        Columns("K:L").Hidden = False
            End Select
        ElseIf Target.Address = "$B$4" Then
            Columns("C:L").Hidden = True
            Dim col As Integer
            For col = 3 To 12
                If Cells(5, col).Value = Target.Value Then
                    Columns(col).Hidden = False
                End If
            Next col
        End If
    End If
End Sub
 

Pièces jointes

  • Test - Excel Download.xlsm
    28.9 KB · Affichages: 16

Roseline

XLDnaute Occasionnel
Bonjour,

Regardes si le code que je t'ai mis dans ta feuille correspond à ton souhait.
VB:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.CountLarge = 1 Then
        If Target.Address = "$B$1" Then
            Columns("C:L").Hidden = True
            Select Case UCase(Target.Value)
                Case UCase(Range("C4").Value)
                        Columns("C:E").Hidden = False
                Case UCase(Range("F4").Value)
                        Columns("F:J").Hidden = False
                Case UCase(Range("K4").Value)
                        Columns("K:L").Hidden = False
            End Select
        ElseIf Target.Address = "$B$4" Then
            Columns("C:L").Hidden = True
            Dim col As Integer
            For col = 3 To 12
                If Cells(5, col).Value = Target.Value Then
                    Columns(col).Hidden = False
                End If
            Next col
        End If
    End If
End Sub
C'est exactement ce que je voulais. Merci beaucoup de ton aide précieuse.
Bonne journée à toi :):)
 

Roseline

XLDnaute Occasionnel
Bonjour,

Regardes si le code que je t'ai mis dans ta feuille correspond à ton souhait.
VB:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.CountLarge = 1 Then
        If Target.Address = "$B$1" Then
            Columns("C:L").Hidden = True
            Select Case UCase(Target.Value)
                Case UCase(Range("C4").Value)
                        Columns("C:E").Hidden = False
                Case UCase(Range("F4").Value)
                        Columns("F:J").Hidden = False
                Case UCase(Range("K4").Value)
                        Columns("K:L").Hidden = False
            End Select
        ElseIf Target.Address = "$B$4" Then
            Columns("C:L").Hidden = True
            Dim col As Integer
            For col = 3 To 12
                If Cells(5, col).Value = Target.Value Then
                    Columns(col).Hidden = False
                End If
            Next col
        End If
    End If
End Sub
Rebonjour,
J'ai encore besoin de votre aide. Dans votre onglet configuration je vois que vous avez inscrit la lettre de la colonne correspondant à chacun des numéros. Jusque là tout va bien. Actuellement par exemple, le chiffre 4 correspond à la colonne I, cependant si le chiffre 4 se retrouve dans les colonnes I-M-P-Q par exemple, comment je dois adapter la vba....je suis un peu perdu?
Merci et bonne journée
 

gbinforme

XLDnaute Impliqué
Bonjour Roseline,
En fait les colonnes M-P-Q n'étaient pas prises en compte, aussi je t'ai modifié le code pour que tu puisses utiliser autant de colonnes que tu veux sans avoir à changer le code : tu peux donc mettre un 4 en Z et il sera pris en compte.
 

Pièces jointes

  • Test - Excel Download1.xlsm
    29.6 KB · Affichages: 4

job75

XLDnaute Barbatruc
Bonsoir Roseline, gbinforme,

Une autre manière de faire, voyez si elle vous convient :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If [B1] & [B4] = "" Then Columns.Hidden = False: Exit Sub 'affiche tout
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
On Error Resume Next
With Range("A1", UsedRange)
    With .Columns(3).Resize(, .Columns.Count - 2)
        .Rows(4).Replace [B1], "#N/A", xlWhole
        .Rows(5).Replace [B4], "#N/A"
        .Hidden = True 'masque
        .SpecialCells(xlCellTypeConstants, 16).EntireColumn.Hidden = False 'affiche
        .Rows(4).Replace "#N/A", [B1]
        .Rows(5).Replace "#N/A", [B4]
    End With
End With
Application.EnableEvents = True 'réactive les évènements
End Sub
A+
 

Pièces jointes

  • Test - Excel Download(1).xlsm
    31.4 KB · Affichages: 10

Roseline

XLDnaute Occasionnel
Bonsoir Roseline, gbinforme,

Une autre manière de faire, voyez si elle vous convient :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If [B1] & [B4] = "" Then Columns.Hidden = False: Exit Sub 'affiche tout
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
On Error Resume Next
With Range("A1", UsedRange)
    With .Columns(3).Resize(, .Columns.Count - 2)
        .Rows(4).Replace [B1], "#N/A", xlWhole
        .Rows(5).Replace [B4], "#N/A"
        .Hidden = True 'masque
        .SpecialCells(xlCellTypeConstants, 16).EntireColumn.Hidden = False 'affiche
        .Rows(4).Replace "#N/A", [B1]
        .Rows(5).Replace "#N/A", [B4]
    End With
End With
Application.EnableEvents = True 'réactive les évènements
End Sub
A+
Bonjour,
J'aime bien votre vba et je l'ai adapté à mon fichier. J'ai une interrogation par contre, j'aimerais que si je sélectionne Blanc par exemple dans la cellule B1 et que je choisi 3 dans la cellule B4, je vois seulement les blancs qui sont numérotés 3. Si j'y vais une cellule à la fois cela fonctionne bien mais si je veux que les deux choix fonctionne ensemble B1 et B4 c'est là où j'ai de la difficulté à le faire fonctionner.
Merci encore une fois de votre si précieuse aide.
 

job75

XLDnaute Barbatruc
Bonjour Roseline,
j'aimerais que si je sélectionne Blanc par exemple dans la cellule B1 et que je choisi 3 dans la cellule B4, je vois seulement les blancs qui sont numérotés 3.
Là il faut utiliser une boucle :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim v1, v2, c As Range
v1 = [B1]: v2 = [B4]
If v1 & v2 = "" Then Columns.Hidden = False: Exit Sub 'affiche tout
Application.ScreenUpdating = False
With Range("A1", UsedRange)
    With .Columns(3).Resize(, .Columns.Count - 2)
        .Hidden = True 'masque tout
        For Each c In .Rows(4).Cells
            If v1 <> "" And v2 <> "" Then If c.MergeArea(1) = v1 And c(2) = v2 Then c.EntireColumn.Hidden = False
            If v1 <> "" And v2 = "" Then If c = v1 Then c.MergeArea.EntireColumn.Hidden = False
            If v1 = "" And v2 <> "" Then If c(2) = v2 Then c.EntireColumn.Hidden = False
        Next
    End With
End With
End Sub
A+
 

Pièces jointes

  • Test - Excel Download(2).xlsm
    31.9 KB · Affichages: 7

Roseline

XLDnaute Occasionnel
Bonjour Roseline,

Là il faut utiliser une boucle :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim v1, v2, c As Range
v1 = [B1]: v2 = [B4]
If v1 & v2 = "" Then Columns.Hidden = False: Exit Sub 'affiche tout
Application.ScreenUpdating = False
With Range("A1", UsedRange)
    With .Columns(3).Resize(, .Columns.Count - 2)
        .Hidden = True 'masque tout
        For Each c In .Rows(4).Cells
            If v1 <> "" And v2 <> "" Then If c.MergeArea(1) = v1 And c(2) = v2 Then c.EntireColumn.Hidden = False
            If v1 <> "" And v2 = "" Then If c = v1 Then c.MergeArea.EntireColumn.Hidden = False
            If v1 = "" And v2 <> "" Then If c(2) = v2 Then c.EntireColumn.Hidden = False
        Next
    End With
End With
End Sub
A+
Rebonjour Job75,
J'ai modifié à nouveau mon fichier et wow ca roule parfaitement. J'ai un peu de misère à comprendre le for each par contre. Si je veux ajouter une troisième colonne, comment je l'inclus là dedans.
Merci et bonne journée
 

Roseline

XLDnaute Occasionnel
Bonjour Roseline,

C'est très simple, remplacez :
VB:
With .Columns(3).Resize(, .Columns.Count - 2)
par :
VB:
With .Columns(4).Resize(, .Columns.Count - 3)
A+
Rebonjour,
J'ai l'impression de tourner un peu en rond honnêtement avec le for each mais je vais y arriver avec votre aide. J'ai compris comment ajouter une colonne.....Maintenant si je veux ajouter un v3 qui serait en relation avec le V1 et le V2 comme dans votre vba, là je suis complètement perdu...:(
Merci encore de m'aider et surtout de votre grande patience
 

Roseline

XLDnaute Occasionnel
Vous parlez d'un v3, pourquoi pas, mais il faut le fichier correspondant.
Vous parlez d'un v3, pourquoi pas, mais il faut le fichier correspondant.
Rebonjour,

Quand je parle de V3, je veux dire si j'ajoute une cellule en prendre en compte avec les deux autres:
C'est là ou je m'y perd. Si je suis pas claire, je vais vous joindre un fichier?

v1 = [B1]: v2 = [B4] : V3= [B5]
 

Discussions similaires

Statistiques des forums

Discussions
312 231
Messages
2 086 449
Membres
103 213
dernier inscrit
Poupoule