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 Subavec 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 SubPour 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