XL 2010 Affecter une macro à un bouton automatiquement

DMT

XLDnaute Nouveau
Bonjour à tous,

J'ai créé un fichier qui a une feuille principale (Menu) qui ouvre à la demande une autre feuille avec des données précises demandées par le menu.

Cette feuille s'ouvre bien avec les renseignements demandés, pas de problème.

Par contre, sur cette nouvelle feuille, (dans mon programme VBA) je lui demande d'insérer un bouton en haut à gauche qui s'appelle "Fermer et retour Menu". Peeas de problème non plus jusque là, ça insère bien mon bouton.

Là où je butte, c'es au niveau de l'affectation de la fonction qui referme la feuille pour retourner au menu.

Mon code VBA :

Sub Ouverture()

' Ouverture Macro

Sheets.Add After:=Sheets(Sheets.Count)
Rows("1:1").Select
Selection.RowHeight = 75
Range("A1").Select
ActiveSheet.Pictures.Insert( _
"C:\Users\BD\Desktop\Dossier Département\Blasons\Button.jpg").Select
Range("A1").Select
End Sub


Il me faut juste trouver le moyen de refermer cette nouvelle feuille à l'aide du bouton créé pour le retour au Menu.

Je vous met un fichier "Exemple" qui reflète (à peu prêt) ce que je veux.

Je suis compliqué, mais je butte sur cette fonction.

Bonne journée à tous, DMT.
 

Fichiers joints

Staple1600

XLDnaute Barbatruc
Bonjour le fil

DMT
Une petit exemple (sorti de la poussière)
En espérant que cela pourra t'inspirer
NB: Si tu testes plusieurs fois, il faudra supprimer du classeur de test, la feuille nommée Test entre chaque éxécution
(ou améliorer le code qui écrase la feuille Test si elle existe ou ajouter un inputbox qui demande à l'utilisateur de le nom pour la nouvelle feuille)
VB:
Sub Test()
Dim Nshp$
'ajout feuille et nommage de celle-ci
Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Test"
'récupération du nom de la forme de la feuille Données
'NB: En situation de test, il n'y avait qu'une forme, d'ou le 1
Nshp = Sheets("Données").Shapes(1).Name
'recopie de la forme sur la nouvelle feuille
CopierShape Sheets("Données"), Sheets("Test"), Nshp
'attribution d'une macro (stockée dans le module 1) à la forme recopiée
Sheets("Test").Shapes(1).OnAction = ThisWorkbook.Name & "!Module1.Menu"
Sheets("Test").Range("A1").Select
End Sub
Private Sub CopierShape(ws1 As Worksheet, ws2 As Worksheet, shpNom As String)
'recyclage d'un bout de code que je pondis jadis
'https://www.excel-downloads.com/threads/macro-pour-copier-coller-une-shape-vers-une-autre-feuille.20031190/post-20230425
Dim shp As Shape
Set shp = ws1.Shapes(shpNom).Duplicate
shp.Cut: ws2.Paste
ws2.Shapes(shpNom).Name = shpNom & "_Copie"
End Sub
Et le code présent dans le Module1
VB:
Sub Menu()
Sheets("Feuil1").Activate
End Sub
PS: Test OK sur mon PC avec ton fichier exemple.

EDITION: Bonjour Bébére ;)
 
Dernière édition:

Bebere

XLDnaute Barbatruc
bonjour
Dmt bienvenue
un exemple,si c'est ce que tu veux faire
il est possible de fermer un classeur,pas une feuille
VB:
Option Explicit
Public Ws As Worksheet

Sub Fermeture()

    Application.DisplayAlerts = False
    Ws.Delete
    Application.DisplayAlerts = True
    Sheets("Feuil1").Select
    Range("A1").Select
   
End Sub
Sub Ouverture()

    Set Ws = Sheets.Add(After:=Sheets(Sheets.Count))
    Ws.Rows("1:1").RowHeight = 75
    Ws.Range("A1").Select
    Fermeture
   
End Sub
edit bonjour Staple
 

Staple1600

XLDnaute Barbatruc
Re

Donc pour suivre ce que je disais dans le message#2
Une petite amélioration interactive ;)
VB:
Sub Test_II()
Dim Nshp$, NomF
'ajout feuille et nommage de celle-ci
NomF = InputBox("Nom de la feuille à créer?", "Création Feuille", "Feuil" & Sheets.Count + 1)
Sheets.Add(After:=Sheets(Sheets.Count)).Name = CStr(NomF)
'récupération du nom de la forme de la feuille Données
'NB: En situation de test, il n'y avait qu'une forme, d'ou le 1
Nshp = Sheets("Données").Shapes(1).Name
'recopie de la forme sur la nouvelle feuille
CopierShape Sheets("Données"), Sheets(NomF), Nshp
'attribution d'une macro (stockée dans le module 1) à la forme recopiée
Sheets(NomF).Shapes(1).OnAction = ThisWorkbook.Name & "!Module1.Menu"
Sheets(NomF).Range("A1").Select
End Sub
Private Sub CopierShape(ws1 As Worksheet, ws2 As Worksheet, shpNom As String)
Dim shp As Shape
Set shp = ws1.Shapes(shpNom).Duplicate
shp.Cut: ws2.Paste
ws2.Shapes(shpNom).Name = shpNom & "_Copie"
End Sub
 

DMT

XLDnaute Nouveau
Bonjour le fil

DMT
Une petit exemple (sorti de la poussière)
En espérant que cela pourra t'inspirer
NB: Si tu testes plusieurs fois, il faudra supprimer du classeur de test, la feuille nommée Test entre chaque éxécution
(ou améliorer le code qui écrase la feuille Test si elle existe ou ajouter un inputbox qui demande à l'utilisateur de le nom pour la nouvelle feuille)
VB:
Sub Test()
Dim Nshp$
'ajout feuille et nommage de celle-ci
Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Test"
'récupération du nom de la forme de la feuille Données
'NB: En situation de test, il n'y avait qu'une forme, d'ou le 1
Nshp = Sheets("Données").Shapes(1).Name
'recopie de la forme sur la nouvelle feuille
CopierShape Sheets("Données"), Sheets("Test"), Nshp
'attribution d'une macro (stockée dans le module 1) à la forme recopiée
Sheets("Test").Shapes(1).OnAction = ThisWorkbook.Name & "!Module1.Menu"
Sheets("Test").Range("A1").Select
End Sub
Private Sub CopierShape(ws1 As Worksheet, ws2 As Worksheet, shpNom As String)
'recyclage d'un bout de code que je pondis jadis
'https://www.excel-downloads.com/threads/macro-pour-copier-coller-une-shape-vers-une-autre-feuille.20031190/post-20230425
Dim shp As Shape
Set shp = ws1.Shapes(shpNom).Duplicate
shp.Cut: ws2.Paste
ws2.Shapes(shpNom).Name = shpNom & "_Copie"
End Sub
Et le code présent dans le Module1
VB:
Sub Menu()
Sheets("Feuil1").Activate
End Sub
PS: Test OK sur mon PC avec ton fichier exemple.

EDITION: Bonjour Bébére ;)
Bonjour Staple et bébére,

Je vous remercie de vos propositions, en faisant des essais, mon ordi à planté en erreur fatale (écran bleu et redémarrage permanent). J’ai réussi à rétablir la situation, mais il est vieux l'ancien (comme son maître).

Ceci dit, il me faut juste trouver le moyen de fermer ce nouvel onglet (ouvert par le menu) et donc, revenir au menu.
L'ouverture d'une nouvelle page ne me pose pas de problème, c'est la fermeture avec le bouton comme dans mon fichier exemple. Si vous pouvez, mettez-moi mon fichier "exemple" à jour avec le code adéquat, ce serait sympa.

Merci de votre patience.
 

Bebere

XLDnaute Barbatruc
DMT je me pose une question,quelle est l'utilité de créer une nouvelle feuille
puisque la destination est Feuil1
Peut être ai je mal compris,peut être du à mon âge;)
 

Staple1600

XLDnaute Barbatruc
Re

DMT
Désolé, mais aucun plantage ici
(et actuellement, j'utilise surement un PC plus vieux ainsi qu'un Excel (Windows XP et Excel 2003)

Et j'ai utlisé ton fichier exemple
Tu as bien la macro Menu dans un module standard nommé Module1

Et mon code VBA fait ce qu'indique le titre de ta discussion
Copier une forme sur une autre feuille et lui attribuer une macro.

Testes la seconde macro, il devrait déjà avoir moins de risque d'erreur avec celle-ci.

Bébère
Puisque je te vois passer dans le fil, tu peux confirmer que mes code fonctionnent
et que normalement il n'y aucune raison que surgisse un vilan BSoD ;)
Merci d'avance. ;)
 
Dernière édition:

DMT

XLDnaute Nouveau
DMT je me pose une question,quelle est l'utilité de créer une nouvelle feuille
puisque la destination est Feuil1
Peut être ai je mal compris,peut être du à mon âge;)
Pas question d'âge, je sais ce que c'est (73...) je pense que je m'exprime mal, c'est tout.
J'ai un fichier qui comporte des données dans une feuille. je veux extraire certaines de ces données à l'aide d'un unserform (déjà créé et qui fonctionne) c'est cette action qui ouvre un nouvel onglet avec lesdites données et que je veux refermer avec un bouton (qui se place en haut à gauche de ma feuille automatiquement, ça, ça fonctionne !) plutôt que de faire le clic droit sur l'onglet puis supprimer. Je ne sais pas si je suis plus clair.
 

DMT

XLDnaute Nouveau
Re

DMT
Désolé, mais aucun plantage ici
(et actuellement, j'utilise surement un PC plus vieux ainsi qu'un Excel (Windows XP et Excel 2003)

Et j'ai utlisé ton fichier exemple
Tu as bien la macro Menu dans un module standard nommé Module1

Et mon code VBA fait ce qu'indique le titre de ta discussion
Copier une forme sur une autre feuille et lui attribuer une macro.

Testes la seconde macro, il devrait déjà avoir moins de risque d'erreur avec celle-ci.

Bébère
Puisque je te vois passer dans le fil, tu peux confirmer que mes code fonctionnent
et que normalement il n'y aucune raison que surgisse un vilan BSoD ;)
Merci d'avance. ;)
Je te rassure Staple, ce n'est pas ton fichier qui a provoqué le plantage de ma machine ...

Je vais essayer ton code.
 

Staple1600

XLDnaute Barbatruc
Re

C'est sûr que cela ne peut pas être mon fichier (vu que je n'en ai pas posté)
;)

Depuis le début, j'ai axé mes réponses sur le titre de ta discussion
Affecter une macro à un bouton automatiquement
Tu parles de copier une forme (qui te sert de bouton) et lui attribuer une macro automatiquement
C'est ce que se bornent à faire les deux macros que je t'ai proposé. ;)
(et que j'ai testé avec succès sur le fichier exemple que tu as joins dans ta discussion)
 

DMT

XLDnaute Nouveau
Re

C'est sûr que cela ne peut pas être mon fichier (vu que je n'en ai pas posté)
;)

Depuis le début, j'ai axé mes réponses sur le titre de ta discussion
Affecter une macro à un bouton automatiquement
Tu parles de copier une forme (qui te sert de bouton) et lui attribuer une macro automatiquement
C'est ce que se bornent à faire les deux macros que je t'ai proposé. ;)
(et que j'ai testé avec succès sur le fichier exemple que tu as joins dans ta discussion)
Pardon, pas fichier, mais code ...

Bon, j'ai refait l'essai, ça plante au niveau de la ligne en rouge (qui est jaune dans VBA)

Private Sub CopierShape(ws1 As Worksheet, ws2 As Worksheet, shpNom As String)
Dim shp As Shape
Set shp = ws1.Shapes(shpNom).Duplicate
shp.Cut: ws2.Paste
ws2.Shapes(shpNom).Name = shpNom & "_Copie"
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

Fais le test en renommant le bouton au préalable
Mode opératoire (sur le fichier exemple de cette discussion)
ETAPE 1
VB:
Sub renommer()
MsgBox Sheets("Données").Shapes(1).Name
Sheets("Données").Shapes(1).Name = "Bouton"
MsgBox Sheets("Données").Shapes(1).Name
End Sub
ETAPE 2
Lance la macro Test_II

NB: On est bien d'accord qu'il existe un module nommé Module1 dans le classeur ?
Dans lequel, tu as copié la macro nommée Menu
1) Lancer cette macro
 

DMT

XLDnaute Nouveau
Re

Fais le test en renommant le bouton au préalable
Mode opératoire (sur le fichier exemple de cette discussion)
ETAPE 1
VB:
Sub renommer()
MsgBox Sheets("Données").Shapes(1).Name
Sheets("Données").Shapes(1).Name = "Bouton"
MsgBox Sheets("Données").Shapes(1).Name
End Sub
ETAPE 2
Lance la macro Test_II

NB: On est bien d'accord qu'il existe un module nommé Module1 dans le classeur ?
Dans lequel, tu as copié la macro nommée Menu
1) Lancer cette macro
Pardonne moi, je suis obligé de m'absenter, j'ai un rdv je reviens vers 16 h je pense.

A tout à l'heure et merci de la réponse, je teste dès mon retour, il faut que je mange vite fait ...
 

Bebere

XLDnaute Barbatruc
Staple plante sur la même ligne, message élément portant ce nom introuvable
edit : ds le fichier pas de code menu
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Bébére
La macro Menu était dans le message#2
Mais effectivement c'est moi qui ajouté cette macro pour faire le test.
Donc je reposte tout le code (pour plus de commodité, mettre tout dans le module 1)
C'est la macro Test_III qu'il faut lancer.
VB:
Option Explicit
Sub Test_III()
Dim Nshp$, NomF
'ajout feuille et nommage de celle-ci
NomF = InputBox("Nom de la feuille à créer?", "Création Feuille", "Feuil" & Sheets.Count + 1)
Sheets.Add(After:=Sheets(Sheets.Count)).Name = CStr(NomF)
'récupération du nom de la forme de la feuille Données
'NB: En situation de test, il n'y avait qu'une forme, d'ou le 1
Sheets("Données").Shapes(1).Name = "Bouton"
Nshp = Sheets("Données").Shapes(1).Name
'recopie de la forme sur la nouvelle feuille
CopierShape Sheets("Données"), Sheets(NomF), Nshp
'attribution d'une macro (stockée dans le module 1) à la forme recopiée
Sheets(NomF).Shapes(1).OnAction = ThisWorkbook.Name & "!Module1.Menu"
Sheets(NomF).Range("A1").Select
End Sub
Private Sub CopierShape(ws1 As Worksheet, ws2 As Worksheet, shpNom As String)
Dim shp As Shape
Set shp = ws1.Shapes(shpNom).Duplicate
shp.Cut: ws2.Paste
ws2.Shapes(shpNom).Name = shpNom & "_Copie"
End Sub
Sub Menu()
Sheets("Feuil1").Activate
End Sub
 

DMT

XLDnaute Nouveau
Re

Bébére
La macro Menu était dans le message#2
Mais effectivement c'est moi qui ajouté cette macro pour faire le test.
Donc je reposte tout le code (pour plus de commodité, mettre tout dans le module 1)
C'est la macro Test_III qu'il faut lancer.
VB:
Option Explicit
Sub Test_III()
Dim Nshp$, NomF
'ajout feuille et nommage de celle-ci
NomF = InputBox("Nom de la feuille à créer?", "Création Feuille", "Feuil" & Sheets.Count + 1)
Sheets.Add(After:=Sheets(Sheets.Count)).Name = CStr(NomF)
'récupération du nom de la forme de la feuille Données
'NB: En situation de test, il n'y avait qu'une forme, d'ou le 1
Sheets("Données").Shapes(1).Name = "Bouton"
Nshp = Sheets("Données").Shapes(1).Name
'recopie de la forme sur la nouvelle feuille
CopierShape Sheets("Données"), Sheets(NomF), Nshp
'attribution d'une macro (stockée dans le module 1) à la forme recopiée
Sheets(NomF).Shapes(1).OnAction = ThisWorkbook.Name & "!Module1.Menu"
Sheets(NomF).Range("A1").Select
End Sub
Private Sub CopierShape(ws1 As Worksheet, ws2 As Worksheet, shpNom As String)
Dim shp As Shape
Set shp = ws1.Shapes(shpNom).Duplicate
shp.Cut: ws2.Paste
ws2.Shapes(shpNom).Name = shpNom & "_Copie"
End Sub
Sub Menu()
Sheets("Feuil1").Activate
End Sub

Coucou, me revoilà.

Je viens de rentrer le prg VBA dans mon fichier "Exemple" module1 et ça à l'air de fonctionner, Merci à toi.

Cependant je dois fermer cette page en même temps que le retour au menu ...

Merci de ton aide.
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas