Macro pour masquer Colonnes qui varient selon liste déroulante

Bonjour à tous,

J'ai eu beau chercher et me creuser la tête, je n'arrive pas à comprendre comment insérer des critères type "formule de cellule" dans une macro. Je vous explique:

J'ai un tableau: E22:L50

J'ai deux listes déroulantes "Choix 1" en cellule A10 et "Choix 2" en cellule A12. Les valeurs de cette liste réfèrent à la ligne 22 de l'une des colonnes G à L (selon le choix de l'utilisateur)

J'ai trouvé la formule pour lier la value "Choix 1" et "Choix 2" à la lettre de ma colonne:

Ex: =LEFT(ADDRESS(1;MATCH(A10;$A22:$L22;0);4);1) me renvoit la colonne I

et =LEFT(ADDRESS(1;MATCH(A12;$A22:$L22;0);4);1) me renvoit la colonne L

J'ai aussi trouvé la macro pour cacher ou afficher des colonnes (example colomne G=> Range("G:G").EntireColum,.Hidden=True /False

J'aimerais lier les deux maintenant mais je n'y arrive pas:

J'ai fait cette macro assez nulle pour vous expliquer mon point de vue: l'idée est que les colonnes affichées (ici I et L) dépendent du choix de l'utilisateur dans sa liste déroulante

Sub Compare()

'Je masque toutes les colonnes

Range("G:L").EntireColumn.Hidden = True

'Ensuite j'affiche mes deux colonnes "I et L" qui correspondent en fait à mon choix 1 et 2 (et qui seraient liés à la formule "LEFT(ADDRESS(1;MATCH(A10;$A22:$L22;0);4);1)") et LEFT(ADDRESS(1;MATCH(A12;$A22:$L22;0);4);1)

Range("I:I,L:L").EntireColumn.Hidden = False

End Sub

Deuxième problème avec cette macro: toutes mes colonnes sont cachées par défaut à l'ouverture du fichier

Ensuite je voudrais une macro pour tout afficher et je crois que celle là est bonne :

Sub Afficher()

'Réafficher toutes les colonnes

Range("G:L").EntireColumn.Hidden = False

End Sub

Vraiment là ou je ne comprends pas c'est lier des formules sur tableur à des macros...Je sais qu'avec votre aide ça sera un déclic sur comment aller plus loin dans les macros

Merci beaucoup pour votre aide, mon fichier en PJ

COrdialement

Paul/Sooflhett

Bonjour,

et si vous preniez le problème dans l'autre sens :

c'est VBA qui trouve les colonnes à afficher.

En fait avec l'instruction FIND vous pouvez trouver où se trouve la cellule contenant la valeur de votre liste de choix.

cette cellule trouvée, il suffit d'en prend sa colonne et de la montrer.

C'est une piste, et cela évite des formules intermédiaires sur la feuille.

@ bientôt

LouReeD

Bonjour sooflhett96 et bienvenue,

Salut LouReeD

On peut aussi obtenir le même résultat par formules, sans masquer de colonnes ... voir la pièce jointe, si la solution t'intéresse ...

Bonjour,

sinon j'ai ceci en VBA :

Option Explicit

Sub Compare()
    ' on affiche tout pour faire la recherche
    Range("G:L").EntireColumn.Hidden = False
    ' on dimensionne des variables
    Dim Cel_trouvée As Range, Plage_recherche As Range, valeur_cherchée As String
    Dim col1 As Integer, col2 As Integer, col1_err As Boolean, col2_err As Boolean
    ' on attribu la plage de recherche
    Set Plage_recherche = ActiveSheet.Range("G22:L22")
    ' on attribue la première valeur recherché
    valeur_cherchée = [choix1].Value
    ' on cherche cette valeur dans la plage de recherche
    Set Cel_trouvée = Plage_recherche.Cells.Find(what:=valeur_cherchée, LookAt:=xlWhole)
    ' s'il ny a pas de résultat on gère l'erreur
    If Cel_trouvée Is Nothing Then
        'ici, traitement pour le cas où la valeur n'est pas trouvée
        col1_err = True
    Else
        ' sinon on attribu le numéro de colonne
        col1 = Cel_trouvée.Column
    End If
    ' on effectue la deuxième recherche
    valeur_cherchée = [choix2].Value
    Set Cel_trouvée = Plage_recherche.Cells.Find(what:=valeur_cherchée, LookAt:=xlWhole)
    If Cel_trouvée Is Nothing Then
     'ici, traitement pour le cas où la valeur n'est pas trouvée
        col2_err = True
    Else
        col2 = Cel_trouvée.Column
    End If
    ' on vide la mémoire
    Set Plage_recherche = Nothing
    Set Cel_trouvée = Nothing
    ' on masque tout
    Range("G:L").EntireColumn.Hidden = True
    ' on affiche les colonnes choisies si pas d'erreur
    If col1_err = False Then Cells(1, col1).EntireColumn.Hidden = False
    If col2_err = False Then Cells(1, col2).EntireColumn.Hidden = False
End Sub

Sub Afficher()
    'Réafficher toutes les colonnes
    Range("G:L").EntireColumn.Hidden = False
End Sub

avec les commentaires dans le code.

@ bientôt

LouReeD

Bonjour,

Merci à LouReeD et à U. Milité

@U. Milité: merci il est vrai que c'est un moyen de contourner le problème!

Cepandant je vais avoir besoin du code de LouReeD pour commencer à bien comprendre VBA

@LouReeD:

En effet on peut penser dans ce sens là, je comprends

j'ai écris votre code en remplaçant choix1 et choix2 par A10 et A12 (les cellules qui correspondent au choix de la liste déroulante) mais malheureusement la macro Compare() me cache toutes les colonnes...Auriez vous la solution?

Oui en effet, les valeurs de la plage de cellule sont obtenues par formule, il faut donc spécifier à FIND que l'on recherche une valeur et qu'il ne faut pas "regarder" le texte de la formule mais seulement le résultat !

Il faut donc ajouter : LookIn:=xlValues

Le code modifié :

Option Explicit

Sub Compare()
    ' on affiche tout pour faire la recherche
    Range("G:L").EntireColumn.Hidden = False
    ' on dimensionne des variables
    Dim Cel_trouvée As Range, Plage_recherche As Range, valeur_cherchée As String
    Dim col1 As Integer, col2 As Integer, col1_err As Boolean, col2_err As Boolean
    ' on attribu la plage de recherche
    Set Plage_recherche = ActiveSheet.Range("G22:L22")
    ' on attribue la première valeur recherché
    valeur_cherchée = [A10].Value
    ' on cherche cette valeur dans la plage de recherche
    Set Cel_trouvée = Plage_recherche.Cells.Find(what:=valeur_cherchée, LookIn:=xlValues, LookAt:=xlWhole)
    ' s'il ny a pas de résultat on gère l'erreur
    If Cel_trouvée Is Nothing Then
        'ici, traitement pour le cas où la valeur n'est pas trouvée
        col1_err = True
    Else
        ' sinon on attribu le numéro de colonne
        col1 = Cel_trouvée.Column
    End If
    ' on effectue la deuxième recherche
    valeur_cherchée = [A12].Value
    Set Cel_trouvée = Plage_recherche.Cells.Find(what:=valeur_cherchée, LookIn:=xlValues, LookAt:=xlWhole)
    If Cel_trouvée Is Nothing Then
     'ici, traitement pour le cas où la valeur n'est pas trouvée
        col2_err = True
    Else
        col2 = Cel_trouvée.Column
    End If
    ' on vide la mémoire
    Set Plage_recherche = Nothing
    Set Cel_trouvée = Nothing
    ' on masque tout
    Range("G:L").EntireColumn.Hidden = True
    ' on affiche les colonnes choisies si pas d'erreur
    If col1_err = False Then Cells(1, col1).EntireColumn.Hidden = False
    If col2_err = False Then Cells(1, col2).EntireColumn.Hidden = False
End Sub

Sub Afficher()
    'Réafficher toutes les colonnes
    Range("G:L").EntireColumn.Hidden = False
End Sub

Pour ce qui est de mettre [A10] et [A12] au lieu des noms donnés à ces deux cellules, voici ma façon de voir les choses :

si un jour vous déplacez ces deux cellules en B1 et B3, alors il faudra retoucher le code, hors si dans le code vous utilisez des noms de cellules, alors lorsque vous déplacerez les cellules, leur nom ne changera pas et le code ne sera pas à modifier...

Attention également, à priori FIND fonctionne avec des cellules visibles... D'où le fait de faire apparaitre les colonnes au début du code.

mais je n'ai pas ré essayé...

@ bientôt

LouReeD

Bonjour Lou Reed,

Désolé je n'ai pas eu le temps de te répondre et de tester ta macro, elle marche! Merci infiniment!

En effet tu as raison, je ne savais pas qu'on pouvait donner un nom (je suis un noob), j'ai trouvé et en effet ça marche quand je les déplace

C'est génial, merci!!!!

Bonjour,

Merci pour vos remerciements !

@ bientôt

LouReeD

Rechercher des sujets similaires à "macro masquer colonnes qui varient liste deroulante"