Afficher/cacher des colonnes avec un bouton en fonction de l'emplacement de ce bouton

papajer

XLDnaute Nouveau
Bonjour à tous.

Est-il possible de créer UNE SEULE macro à affecter à plusieurs boutons différents qui cachent certaines colonnes en fonction de la colonne dans laquelle sont placés ces boutons.

Exemple : un bouton carré situé dans la colonne P masque/affiche la colonne juste avant (la O) ainsi que la colonne deux rangs derrière (la M). Un autre bouton situé dans la colonne Z avec la MÊME macro affectée masque/affiche les colonnes Y et W soit RELATIVEMENT les mêmes par rapport à l'emplacement du bouton.

Pour l'instant, je ne m'y connais pas trop en VBA. Je fais des macros qui sont toujours "absolues". Donc à moins de faire 30 macros (une pour chaque bouton...) je ne vois pas comment m'en sortir.

Merci d'avance pour votre aide.
 
G

Guest

Guest
Re : Afficher/cacher des colonnes avec un bouton en fonction de l'emplacement de ce b

Bonjour,

Avec des boutons contrôle de formulaire ou des Formes (shapes) cela pourrait ressembler à ça:

Code:
Sub MasquerAfficher()
If TypeName(Application.Caller) <> "String" Then Exit Sub
With ActiveSheet.Shapes(Application.Caller).TopLeftCell
    ActiveSheet.Columns(.Column - 1).Hidden = Not ActiveSheet.Columns(.Column - 1).Hidden
    ActiveSheet.Columns(.Column - 3).Hidden = Not ActiveSheet.Columns(.Column - 3).Hidden
End With
End Sub

A+
 

Paritec

XLDnaute Barbatruc
Re : Afficher/cacher des colonnes avec un bouton en fonction de l'emplacement de ce b

Bonjour Papajer le forum
oui c'est possible avec une seule macro enfin il faut voir ton fichier mais normalement pas de soucis, et comme tu n'as pas mis un petit fichier exemple avec les explications dedans bah c'est donc fini
a+
Papou:eek:

EDIT Bonjour Hasco
EDIT Bonjour Philippe
 
Dernière édition:

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Afficher/cacher des colonnes avec un bouton en fonction de l'emplacement de ce b

Bonjour,

...............avec la MÊME macro affectée masque/affiche les colonnes Y et W soit RELATIVEMENT les mêmes par rapport à l'emplacement du bouton...............

le mot "MEME macro" n'est pas compatible avec "RELATIVEMENT les mêmes"

à+
Philippe

Edit:Bonjour Hasco
Edit2: Bonjour Paritec
 
Dernière édition:

papajer

XLDnaute Nouveau
Re : Afficher/cacher des colonnes avec un bouton en fonction de l'emplacement de ce b

Bonjour Hasco,

Ton code marche parfaitement et répond entièrement à ma question.

Peux-tu si cela ne te dérange pas m'expliquer à quoi servent ces deux lignes ?

If TypeName(Application.Caller) <> "String" Then Exit Sub
With ActiveSheet.Shapes(Application.Caller).TopLeftCell

J'aimerais bien comprendre pour essayer de me débrouiller seul la prochaine fois.
 
G

Guest

Guest
Re : Afficher/cacher des colonnes avec un bouton en fonction de l'emplacement de ce b

Re,

utilises l'aide vba excel en appuyant sur F1, le curseur étant sur un mot clef ou une expression sélectionnée Application.Call, TopLeftCell, With, TypeName etc...

Ensuite si tu ne comprends toujours pas, revient avec une question plus précise.
Commentaires que j'aurais pu ajouter:

'Si l'appelant de la macro n'est pas du type chaine de caractère, sortir
'Travailler à partir de la cellule HautGauche de l'objet Shape.

A+
 

papajer

XLDnaute Nouveau
Re : Afficher/cacher des colonnes avec un bouton en fonction de l'emplacement de ce b

Bonjour Paritec,

Je n'ai pas envoyé mon fichier original car il est gros, (très gros) et contient quelques données sensibles.
Je m’apprêtais à envoyer une classeur vide avec seulement les éléments nécessaires à ma question mais Hasco a trouvé la solution plus vite que moi.

J'y penserai la prochaine fois que je posterai une question.
 

papajer

XLDnaute Nouveau
Re : Afficher/cacher des colonnes avec un bouton en fonction de l'emplacement de ce b

Merci Hasco,
j'ai compris la signification de chaque élément mais je ne comprend pas pourquoi tu as besoin de vérifier le type de "l'appelant de la macro" qui est une notion que je ne comprends pas bien.
 
G

Guest

Guest
Re : Afficher/cacher des colonnes avec un bouton en fonction de l'emplacement de ce b

Re,

j'ai compris la signification de chaque élément mais je ne comprend pas pourquoi tu as besoin de vérifier le type de "l'appelant de la macro" qui est une notion que je ne comprends pas bien.

Là la question est plus précise;). Il s'agit d'une vieille habitude...d'essayer d'éviter les possibilités d' erreurs, et dans la macros données, il y en a plusieurs.
Extrait de l'aide sur Application.Caller

Fonction personnalisée tapée dans une cellule uniqueObjet Range spécifiant cette cellule
Fonction personnalisée appartenant à une formule matricielle dans une plage
de cellules
Objet Range spécifiant cette plage de cellules
Macro Auto_Open, Auto_Close, Auto_Activate, ou Auto_DeactivateNom du document sous forme de texte
Macro activée par la propriété OnDoubleClick ou OnEntryNom de l'identificateur de l'objet graphique ou, le cas échéant, de la
référence de cellule auquel la macro s'applique
Boîte de dialogue Macro (menu Outils),
ou tout autre demandeur non décrit ci-dessus
Erreur #REF!


Ce qu'on veut éviter se sont les objets Range, ou une valeur d'erreur #Ref!, on ne veut retenir que les Type String.

Donc je demande de sortir si Application.Caller n'est pas 'String'.
il faudrait encore vérifier que ce String n'est pas un nom de document Ou par défaut controler que nous avons bien à faire à un des noms de Shapes présents dans la feuille, soit par un boucle sur tous les shapes soit en provoquant une erreur comme ci-dessous:

Code:
Sub MasquerAfficher()
Dim shp As Shape
    If TypeName(Application.Caller) <> "String" Then Exit Sub
    On Error Resume Next
    Set shp = ActiveSheet.Shapes(Application.Caller)
    On Error GoTo 0 'pour laisser d'éventuelle autres erreurs se lever
    If Err <> 0 Then
        MsgBox "le shape n'existe pas sur la feuille active"
    Else
        With shp.TopLeftCell
            ActiveSheet.Columns(.Column - 1).Hidden = Not ActiveSheet.Columns(.Column - 1).Hidden
            ActiveSheet.Columns(.Column - 3).Hidden = Not ActiveSheet.Columns(.Column - 3).Hidden
        End With
    End If
End Sub



A+
 

papajer

XLDnaute Nouveau
Re : Afficher/cacher des colonnes avec un bouton en fonction de l'emplacement de ce b

Ok. Je ne voyais quel était le String qui appellait la macro.

Maintenant j'ai compris pourquoi il faut retenir uniquement le String.

Superbe explication.

Je comprends bien le principe d'éviter toute erreur :D
C'est juste que j'en suis pas encore là... (J'attends que l'erreur arrive pour la corriger.)

Merci beaucoup, ce code me fait bien progresser notamment avec la fonction With que je ne connaissais pas.
 

Discussions similaires

Statistiques des forums

Discussions
312 201
Messages
2 086 171
Membres
103 151
dernier inscrit
nassim