Code après un bouton en VBA

  • Initiateur de la discussion Initiateur de la discussion lmc71
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

lmc71

XLDnaute Occasionnel
Bonjour le forum,
J'ai récupéré un bout de code VBA me permettant de créer un bouton et un code allant avec. La partie création est bonne mais la partie exécution n'est pas opérante.
Je joins un petit fichier explicatif.
Je n'arrive pas à trouver mon bonheur.
Merci d'avance.
Cordialement
 

Pièces jointes

Re : Code après un bouton en VBA

Bonjour lmc71,

Un essai dans le fichier joint qui ne correspond pas à votre méthode mais qui atteint un but similaire. Je n'aime pas trop manipuler directement le code quand il n'y a pas d'autre solution qui fait le même boulot.

Le principe:
  • j'ai créé une forme de référence sur la feuille "Menu"
  • j'y ai appliqué la mise en forme qui me convient
  • j'ai nommé manuellement cette forme "VersLeRetour"
  • je rends visible ou invisible cette forme avec la macro "BoutonVisibleOuPas"

La macro "CreerFeuilBouton" crée une nouvelle feuille, la nomme, copie le bouton "VersLeRetour" de la feuille "Menu" vers la nouvelle feuille, attribue au nouveau bouton le lien, positionne le bouton
VB:
Option Explicit
Const NomBouton = "VersLeMenu"
Const ADRlien = "Menu!A1"

Sub CreerFeuilBouton()
Dim c, newsh As Worksheet, shp As Shape, aux$
  'Création nouvelle feuille
  On Error Resume Next
  c = InputBox("Veuillez nommer la feuille...", "Nom de la feuille à copier")
  On Error GoTo 0
    If c <> "" Then
      On Error Resume Next: aux = Sheets(c).Name: On Error GoTo 0
      If aux = "" Then
        Set newsh = ActiveWorkbook.Sheets.Add(After:=Worksheets(Worksheets.Count))
        newsh.Name = c
      Else
        MsgBox "Une feuille de nom <" & c & "> existe déjà -> Echec !": End
      End If
    Else
      MsgBox "Pas de nom pour la feuille à créer -> Echec !": End
  End If
  
  'copie du bouton "Vers Menu" à partir de la la feuille "Menu" vers nouv. feuille
  ' puis lien, position, bouton visible, 'dé-sélection' du bouton
  With newsh
    Sheets("Menu").Shapes(NomBouton).Copy: .Paste
    .Hyperlinks.Add anchor:=newsh.Shapes(NomBouton), Address:="", SubAddress:=ADRlien
    .Shapes(NomBouton).Top = .Range("g3").Top: .Shapes(NomBouton).Left = .Range("g3").Left
    .Shapes(NomBouton).Visible = True: .Range("A1").Select
  End With
End Sub

Sub BoutonVisibleOuPas()
  'Montrer / Cacher le bouton "VersLeMenu" de la feuille "Menu"
  Sheets("menu").Shapes(NomBouton).Visible = Not Sheets("menu").Shapes(NomBouton).Visible
End Sub
 

Pièces jointes

Dernière édition:
Re : Code après un bouton en VBA

Bonjour le forum,
Bonjour MaPomme

Déjà un grand merci pour ta rapidité de réponse.
J'ai testé rapidement l'application : c'est parfait.
Je vais étudier ton code, maintenant.
Encore merci
Cordialement
 
Re : Code après un bouton en VBA

Bonjour MaPomme
J'ai copier/coller tout ton code dans mon application dans module1, c'est à dire le fichier original que j'ai placé dans le forum et lors de l'exécution j'ai cette erreur :
With newsh
Sheets("Menu").Shapes(NomBouton).Copy: .Paste Code d'erreur sur cette ligne au débogage
.Hyperlinks.Add anchor:=newsh.Shapes(NomBouton), Address:="", SubAddress:=ADRlien
.Shapes(NomBouton).Top = .Range("g3").Top: .Shapes(NomBouton).Left = .Range("g3").Left
.Shapes(NomBouton).Visible = True: .Range("A1").Select
End With
End Sub

Cette partie de la ligne " Sheets("Menu").Shapes(NomBouton).Copy "est surligne en jaune

Le nom de la feuille Menu est orthographié à l'identique de la macro. Où dois-je copier cette macro car je voudrais l'utiliser dans d'autre applications.
Le fichier que tu m'as retourner fonctionne très bien.
Je ne saisis pas où est le problème.
Merci
 
Re : Code après un bouton en VBA

Re 🙂,

Une autre manière de faire.

Dans ce cas, on n'affecte aucun lien hypertexte à la forme qu'on vient de créer.

On y affecte une macro "QuoiFaire" qui se déclenche quand on clique sur ce nouveau bouton, par l'intermédiaire la méthode de forme .OnAction.

L'affectation d'une macro au bouton permet bien plus de possibilités qu'un simple lien (on peut même passer des paramètres à la macro).

Le bout de code qui a changé ( + dim s$ dans les déclaration de variables)
VB:
                             [...]

    'copie du bouton "Vers Menu" à partir de la la feuille "Menu" vers nouv. feuille
  ' puis affectation d'une macro au bouton
  With newsh
    Sheets("Menu").Shapes(NomBouton).Copy: .Paste
    ' **** que faire quand on clique sur le nouveau bouton? : on lance la macro QuoiFaire
    'si pas de parramètre à passer, on utilisera simplement s="QuoiFaire"
    
    'sinon on construit une chaine de type : 'nommacro param1,param2,...,paramN'
    'l'apostrophe simple ' au début et en fin sont nécessaires
    'et nommacro, param1, param2, ..., paramN sont du TEXTE
    
    s = "'QuoiFaire """ & ActiveSheet.Name & """,""" & NomBouton & """'"
    newsh.Shapes(NomBouton).OnAction = s
    .Shapes(NomBouton).Top = .Range("g3").Top: .Shapes(NomBouton).Left = .Range("g3").Left
    .Shapes(NomBouton).Visible = True: .Range("A1").Select
  End With
End Sub

Sub QuoiFaire(xfeuille, xnombouton)
  MsgBox "Mais vous m'avez carrément cliqué dessus, moi, le bouton < " & xnombouton & " > " & _
    "de la feuille < " & xfeuille & " > !!!" & vbLf & vbLf & _
    "Pas rancunier, je vous ramène au Menu."
  Application.Goto Sheets("Menu").Range("a1"), True
End Sub



                             [...]

nota: oubié de préciser, que dans la chaine s finale , les paramètres param1, param2, ... sont entourés d'un guillemet double. Cette chaine s commençe par une apostrophe et se termine par une apostrophe.
s -> ' QuoiFaire "param1", "param2", ..., "paramN" '
 

Pièces jointes

Dernière édition:
Re : Code après un bouton en VBA

Re,

Bonjour MaPomme
J'ai copier/coller tout ton code dans mon application dans module1, c'est à dire le fichier original que j'ai placé dans le forum et lors de l'exécution j'ai cette erreur :
With newsh
Sheets("Menu").Shapes(NomBouton).Copy: .Paste Code d'erreur sur cette ligne au débogage
.Hyperlinks.Add anchor:=newsh.Shapes(NomBouton), Address:="", SubAddress:=ADRlien
.Shapes(NomBouton).Top = .Range("g3").Top: .Shapes(NomBouton).Left = .Range("g3").Left
.Shapes(NomBouton).Visible = True: .Range("A1").Select
End With
End Sub

Cette partie de la ligne " Sheets("Menu").Shapes(NomBouton).Copy "est surligne en jaune

Le nom de la feuille Menu est orthographié à l'identique de la macro. Où dois-je copier cette macro car je voudrais l'utiliser dans d'autre applications.
Le fichier que tu m'as retourner fonctionne très bien.
Je ne saisis pas où est le problème.
Merci

Sur la feuille "Menu", y a t il bien une forme nommée "VersLeMenu" ?
En-tête de module, il doit aussi y avoir la ligne Const NomBouton = "VersLeMenu"

sinon, joindre le fichier qui bogue,

A plus...
 
Re : Code après un bouton en VBA

Re MaPomme

Je vois que tu as de l'humour et c'est très bien dans ce monde de brutes..........

Je te remercie de tes explications, qui pour un novice comme moi, sont un peu complexes, mais j'essaie.
Je voudrais, s'il t'est possible de m'éclairer, ou de me donner un site qui explique ce fait, notamment pour l'utilisation du lien qui me paraît très intéressante.
Donc j'ai compris ( dans le fichier Création bouton V2) que dans la feuille Menu tu créées un bouton modèle (Insertion Formes) que tu nommes via Définir Nom " modVersRetour " et également la cellule M28. Jusque là c'est OK. Je ne saisis pas la relation entre Cellule M28 et le bouton modèle.
Où je ne suis plus, c'est ta macro, tu donnes un autre nom " Const NomBouton = "VersLeMenu" " et l'adresse dans Définir Nom c'est Menu!$M$28 et dans la macro c'est " Const ADRlien = "Menu!A1" ". Dans la cellule A1 de la feuille Menu je ne vois rien......
La cellule M28 est de ce fait inutilisable pour tout autre formule ?

Dans la macro : Sub BoutonVisibleOuPas()
'Montrer / Cacher le bouton "VersLeMenu" de la feuille "Menu"
Sheets("menu").Shapes(NomBouton).Visible = Not Sheets("menu").Shapes(NomBouton).Visible
End Sub
quel est le contraire de Not qui permet de rendre visible le bouton......

A mon stade je saisis des bouts de code à droite ou à gauche pour essayer de faire fonctionner l'affaire..... je conçois que ce n'est pas très académique...
Encore merci
Cordialement
 
Re : Code après un bouton en VBA

Bonsoir lmc71,

Concernant le nom "modVersRetour":

En fait, le nom "modVersRetour" qui pointe sur la cellule M28 ne sert à rien. Il peut-être supprimé via le menu "Gestionnaire de noms". C'estsans doute une scorie d'un précédent fichier.


Pour définir le nom de la forme insérée:

  • on sélectionne la forme insérée
  • on se place dans la zone de texte à gauche de la barre de formule. Il doit y apparaître quelque chose du genre " Rectangle à coins arrondis N" si on a bien sûr inséré un rectangle à coin arrondi
  • Dans cette zone, on efface le nom de la forme, on tape son nouveau (VersLeRetour) et on puis la touche 'Entrée'

Attention! Au cas où il existerait déjà une autre forme avec ce nom, la touche entrée ne renomme pas la nouvelle forme mais va sélectionner cette autre forme.

Attention! Si on n' a pas bien sélectionné la forme, on peut donner un nom à autre chose que la forme, c'est ce qui a dû se passer avec le nom inutile "modVersRetour"

Sur la feuille, il existe donc une forme nommé "VersLeRetour".


Concernant le code:
Const NomBouton = "VersLeMenu"

On défini quelque chose qui ressemble à une variable mais qui n'en est pas une . Comme une variable, une constante a un nom mais contrairement à une variable, on ne peut pas en changer la valeur au moyen du code. Cependant, comme une variable, la valeur d'une constante peut-être affectée à une variable ou utilisée dans des calculs ou expressions. En fait, dans le code, partout où se trouve mentionné le nom de la constante, ce nom est remplacé par la valeur de la constante.

On utilise souvent les constantes au niveau du module pour définir des valeurs utilisables par toutes les sub ou function du module.

Ex: si dans le code, on veut utiliser la forme en question, on écrira Shapes("VersLeMenu")
Si, dans le code, on mentionne 100 fois ce bouton, on écrira cent fois Shapes("VersLeMenu")

Imaginons, qu'on change le nom de la forme de "VersLeMenu" par "FormeMenu". Il faudra dans le code changer 100 fois l'expression Shapes("VersLeMenu") par Shapes("FormeMenu") .

Alors qu'avec la constante NomBouton , on aurait écrit une fois pour toute dans le code100 fois Shapes(NomBouton).
Le changement du nom de la forme, revient alors simplement à changer la valeur de la constante.
En remplaçant simplement une fois Const NomBouton = "VersLeMenu" par Const NomBouton = "FormeMenu", la modification est reportée automatiquement dans tout le code.


Sub BoutonVisibleOuPas()
'Montrer / Cacher le bouton "VersLeMenu" de la feuille "Menu"
Sheets("menu").Shapes(NomBouton).Visible = Not Sheets("menu").Shapes(NomBouton).Visible
End Sub

quel est le contraire de Not qui permet de rendre visible le bouton......

Une forme est soit visible soit masquée. Si elle est masquée, la valeur de sa propriété Visible est FALSE. Si elle est visible, la valeur de sa propriété Visible est TRUE.

Si la forme est visible, en exécutant la macro BoutonVisibleOuPas:
On prend la propriété Visible de la forme qui est TRUE
On prend le contraire de la propriété ( NOT ...) TRUE devient donc FALSE
Et on affecte cette nouvelle valeur à la propriété Visible (qui vaut désormais FALSE)
Le bouton devient invisible

Si la forme est INvisible, en exécutant la macro BoutonVisibleOuPas:
On prend la propriété Visible de la forme qui est FALSE (puisque la forme est invisible)
On prend le contraire de la propriété ( NOT ...) FALSE devient donc TRUE
Et on affecte cette nouvelle valeur à la propriété Visible (qui vaut désormais TRUE)
Le bouton devient visible

La macro BoutonVisibleOuPas() agit donc comme un interrupteur. Un coup elle affiche la forme, le coup suivant elle masque la forme, encore un p'ti coup elle ré-affiche la forme, un p'ti dernier pour la route, elle masque à nouveau la forme.



et dans la macro c'est " Const ADRlien = "Menu!A1" ". Dans la cellule A1 de la feuille Menu je ne vois rien......
C'est normal. Cette constante n'est pas utilisée dans le code.
Excusez moi de vous avoir plongé dans un abîme de perplexité injustifiée🙁. En phase de mise au point,on part quelquefois sur une idée qu'on abandonne par la suite sans enlever les éléments devenus inutiles.

Si on voulait l'utiliser (et c'était sans doute mon idée de départ), on pourrait remplacer l'instruction:
Code:
Application.Goto Sheets("Menu").Range("a1"), True
par l'instruction:
Code:
Application.Goto Range(ADRlien), True

En tout cas, vous examinez bien les codes jusqu'à débusquer les incohérences 🙂 🙂. Tout le monde ne le fait pas. Bon courage!

@+
 
Dernière édition:
Re : Code après un bouton en VBA

Bonsoir mapomme

Avant que tu ne répondes je suis arrivé à créer le bouton et à le nommer dans mon fichier initial. Il fonctionne.
Mais à l'heure actuelle, je ne suis pas arrivé à le masquer ou le faire masquer pas la macro.

Dans ta réponse de 13h57 tu a marqué : Dans ce cas, on n'affecte aucun lien hypertexte à la forme qu'on vient de créer. or je n'ai trouvé aucun lien dans le fichier ou mal cherché...... peut-être qu'il n'y en a pas dans le fichier V2 où nous pouvons voir le bouton car dans le fichier V1 nous ne voyons pas le bouton, c'est le but entre autre.
Mais comment fait-on pour le rendre visible ?

Je te remercie pour tes explications, cela te prend du temps.

Je t'ai joins le fichier avec le bouton que j'ai créé. Dis moi où ça pêche !

Bonne nuit
 

Pièces jointes

Re : Code après un bouton en VBA

Re 🙂

Le fichier de votre post #9. Voir les commentaires dans le fichier.

nb: j'ai rédigé le post #8 en plusieurs fois. La dernière partie concerne justement le point d'invisibilité 😱.




[...] Dans ta réponse de 13h57 tu a marqué : Dans ce cas, on n'affecte aucun lien hypertexte à la forme qu'on vient de créer. or je n'ai trouvé aucun lien dans le fichier ou mal cherché...... [...]

Dans la v1, on affecte un lien à la forme copiée dans la feuille nouvellement créée.

Dans la v2, on affecte aucun lien à la forme. On se sert de la Propriété OnAction de la forme au moyen de laquelle on indique la macro à exécuter quand on clique sur cette forme. C'est cette macro qui se charge d'afficher la feuille "Menu"

C'est vrai que, dans la v2, j'ai compliqué inutilement la chose en voulant illustrer le passage de paramètres.
plus simplement, on peut écrire dans la macro principale:
newsh.Shapes(NomBouton).OnAction = "QuoiFaire"

et se contenter pour la macro QuoiFaire:
Sub QuoiFaire()
Application.Goto Sheets("Menu").Range("a1"), True
End Sub


C'est bien plus simple et ça marche tout aussi bien!


@+
 

Pièces jointes

Dernière édition:
Re : Code après un bouton en VBA

Re mapomme

Merci réellement de toute tes explications qui m'ont appris beaucoup de chose. Comme l'on dit : la journée appartient à ceux qui se lèvent tôt, mais il faut mourir le soir car dans la journée nous apprenons toujours quelques chose........

Effectivement la touche F5 remplit son effet, mais quand tu ne le sais pas tu cherches et des fois tu galères.

Je cherche toujours à comprendre quelque soit le moment ou l'action, mais je ne sais pas composer un code en entier et tout seul car je ne connais pas le langage basic.

Je tiens à féliciter toutes les personnes du Forum qui répondent à nos demandes, et toi particulièrement MAPOMME pour tout ce que tu as fait aujourd'hui. M E R C I .......

Cordialement
 
Re : Code après un bouton en VBA

Bonjour mapomme, le forum
Excuses moi de revenir à la charge, mais dans le code du fichier V1 peux-tu me dire où se trouve le bout de code qui permet de revenir vers la page Menu. Je ne l'ai pas décelé.....
La raison de ma question est que je voudrais ajouter un bout de code me permettant de masquer la feuille quand l'on clique sur le bouton.
Merci
Cordialement
 
Re : Code après un bouton en VBA

Bonjour lmc71,

[...] dans le code du fichier V1 peux-tu me dire où se trouve le bout de code qui permet de revenir vers la page Menu. Je ne l'ai pas décelé [...]
L'instruction en question est:
.Hyperlinks.Add anchor:=newsh.Shapes(NomBouton), Address:="", SubAddress:=ADRlien

En fait dans la v1, on attribue directement le lien vers la feuille "Menu" à chaque forme que l'on crée (comme si on faisait un clique-droit sur la forme et si on choisissait le sous-menu "Lien hypertexte"). Cette méthode ne permet pas d'ajouter des instructions quand on clique sur sur la forme.

[...] La raison de ma question est que je voudrais ajouter un bout de code me permettant de masquer la feuille quand l'on clique sur le bouton [...]
Comme dit précédemment, la méthode v1 ne convient pas. Il faut utiliser la méthode v2 qui certes est un peu plus compliquée (en partie par mon fait 🙁). Son principe est non pas d'attribuer directement un lien à la nouvelle forme recopiée mais d'indiquer quelle macro exécuter quand on clique sur cette forme. On utilise une instruction de type instruction: MaForme.OnAction= "nom de la macro à exécuter".



Pour simplifier la chose, utilisez la méthode n° 3 décrite dans le fichier joint. Elle consiste à créer une forme de référence sur la feuille "Menu". On lui attribue le nom "BoutonMenu" et par un clique-droit (sous-menu 'affecter une macro...') on lui attribue la macro: QuoiFaire(). On a donc, en quelque sorte, créé une forme "prête à l'emploi" qui n'attend plus, avec impatience, que d'être dupliquée sur d'autres feuilles.

C'est dans cette macro QuoiFaire() que vous masquerez la feuille où se trouve le bouton cliqué et afficherez la feuille "Menu".

A+
 

Pièces jointes

Re : Code après un bouton en VBA

Bonjour mapomme, le forum
Et 1 et 2 et 3 méthodes, bravo tu es génial, réellement tout est facile quand on connait.
J'utilise l'enregistreur de macro quand je ne sais pas, mais c'est totalement différent de ce que tu m'as appris.
Merci et passe une bonne journée.
Cordialement
 
Re : Code après un bouton en VBA

Bonjour lmc71 🙂,

[...] réellement tout est facile quand on connait [...]
Oui, c'est certain, mais il n'y a aucune fierté à montrer puisqu'on connait ! À vaincre sans péril, on triomphe sans gloire. C'est quand on ne connait pas et que, seul ou à plusieurs, on trouve comment faire qu'on peut s’autoriser quelque peu à être content de soi.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
433
Réponses
32
Affichages
1 K
Réponses
2
Affichages
528
Réponses
10
Affichages
638
Retour