Masquer des colonnes en fonction du libellé de la première ligne
Bonjour à tous,
J'utilise un logiciel de de gestion, avec lequel je fais régulièrement des extractions sur Excel.
Le logiciel extrait beaucoup d'informations, bien plus que ce qu'il me faut. J'avais donc créé une macro très simple me permettant de cacher en 1 clic toutes les colonnes qui ne m'intéressent pas.
Basiquement je me contentais de sélectionner les colonnes puis de les masquer (Il y a sans doute des moyens plus efficaces mais à mon niveau c'était le plus simple pour être sur que ça fonctionne :D ) (Exemple raccourci ci dessous)
Sub MacroSimple()
Range("A").Select
Selection.EntireColumn.Hidden = True
Range("C").Select
Selection.EntireColumn.Hidden = True
End Sub
Le soucis est que ce logiciel est souvent mis à jour, et des colonnes apparaissent, disparaissent, décalant tout à chaque mise à jour.
Pour ne pas devoir modifier ma macro précédente à chaque fois, j'essaie de créer une macro qui puisse cacher la colonne en fonction du libellé de la première ligne.
Mon idée est donc de créer une liste, puis de faire un tableau avec tous les libellés sur la ligne 1, puis de tester au fur et à mesure si le libellé est dans la liste, et si oui cacher la colonne.
Voici le code de mon idée:
Sub MacroTableau()
Dim tableau2()
Dim tableau(), i As Integer
tableau2 = Array("TEST", "MESSAGE", "SOMME", "BOOP", "MSG", "TXT") ' liste des libellés des colonnes à masquer
tableau = Range("A1:AN1") ' 40 premières valeurs de la ligne 1
For i = 1 To 40 ' pour chaque i
For j = 0 To 5 ' pour chaque j
If tableau(1, i) = tableau2(j) Then 'on teste si la valeur de la case est dans la liste des libellés à cacher
Select Range()
Selection.EntireColumn.Hidden = True 'on cache
Next
Next
End Sub
Étant débutant/casu j'ai un peu de mal à travailler avec les colonnes. J'aimerai savoir comment sélectionner la colonne correspondante à la ligne 9 du code. Je ne sais pas si le reste du code est bon mais je test petit à petit ^-^
Si vous avez une autre solution qui vous parait évidente mais qui ne l'est pas pour moi je suis aussi preneur, comme je l'ai dit je n'utilise vba que très casuellement, et à part ça j'ai appris quelques bases de certains langages mais je ne suis pas développeur!
J'espère avoir réussi à exprimer clairement mon problème, s'il faut je pourrai faire un fichier d'exemple.
Merci d'avance! :)
Je reste à votre dispo pour toutes questions!
Bonjour
Tu devrais joindre un extrait de ton tableau en indiquant les colonnes que tu veux afficher (en mettant en couleur le titre de leur colonne, par exemple..
Bye !
Bonjour à tous,
Un exemple en partant du principe que tous les libellés seront trouvés sur la ligne 1, c'est à dire que je ne me suis pas penché sur la gestion d'erreur dans le cas où un libellé n'est pas trouvé. N'étant pas fan des boucles imbriquées, génératrices de ressources j'ai utilisé la méthode .find. Je ne suis pas développeur non plus, donc pas sûr que ce soit le plus optimal mais c'est fonctionnel :
Sub MacroTableau()
Dim LIBELLES(), LIBELLE As Variant, COL%
LIBELLES = Array("TEST", "MESSAGE", "SOMME", "BOOP", "MSG", "TXT")
For Each LIBELLE In LIBELLES
COL = Worksheets("Feuil1").Rows(1).Find(LIBELLE).Column 'Nom de la feuille à adapter
Worksheets("Feuil1").Columns(COL).EntireColumn.Hidden = True 'Nom de la feuille à adapter
Next
End Sub
Cdlt,
Bonjour!Bonjour
Tu devrais joindre un extrait de ton tableau en indiquant les colonnes que tu veux afficher (en mettant en couleur le titre de leur colonne, par exemple..
Bye !
Je ne pensais pas que ce serai nécessaire mais c'est vrai que c'est quand même plus pratique, j'ai créé un petit fichier pour faire les tests de mon coté ;)
Un exemple en partant du principe que tous les libellés seront trouvés sur la ligne 1, c'est à dire que je ne me suis pas penché sur la gestion d'erreur dans le cas où un libellé n'est pas trouvé. N'étant pas fan des boucles imbriquées, génératrices de ressources j'ai utilisé la méthode .find. Je ne suis pas développeur non plus, donc pas sûr que ce soit le plus optimal mais c'est fonctionnel :
Sub MacroTableau() Dim LIBELLES(), LIBELLE As Variant, COL% LIBELLES = Array("TEST", "MESSAGE", "SOMME", "BOOP", "MSG", "TXT") For Each LIBELLE In LIBELLES COL = Worksheets("Feuil1").Rows(1).Find(LIBELLE).Column 'Nom de la feuille à adapter Worksheets("Feuil1").Columns(COL).EntireColumn.Hidden = True 'Nom de la feuille à adapter Next End Sub
Bonjour Ergotamine, merci de ta réponse!
C'est une très bonne idée d'utiliser le .find , en plus je connaissais mais je n'y ai juste pas pensé et j'ai commencé à faire des boucles par réflexe ^-^
Ton code fonctionne très bien, j'ai ajouté une petite ligne pour gérer les erreurs si un libellé change et n'apparait plus, voici le code final :
Sub MacroTableau2()
Dim LIBELLES(), LIBELLE As Variant, COL%
LIBELLES = Array("BOOP3", "TestErreur", "BOOP4", "BOOP7", "BOOP9", "Erreur2")
For Each LIBELLE In LIBELLES
On Error Resume Next 'Gestion des erreurs
COL = Worksheets("Base").Rows(1).Find(LIBELLE).Column 'Nom de la feuille à adapter
Worksheets("Base").Columns(COL).EntireColumn.Hidden = True 'Nom de la feuille à adapter
Next
End Sub
Voilà une petite macro bien pratique qui pourra sans doutes resservir à d'autres!
Un grand merci encore, vous pouvez clore le sujet!
Azounet ;p