Créer une macro qui crée un bouton et y affecte une autre maccro [Résolu]

Messages postés
5
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
21 décembre 2010
- - Dernière réponse : Jeremy45380
Messages postés
5
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
21 décembre 2010
- 21 déc. 2010 à 15:22
Bonjour à toutes et à tous!

Le problème que je rencontre est, je pense, plus simple qu'il ne m'en donne l'impression.
J'ai créé un code vb qui permet d'exécuter une recherchev sur une base de données. Cette recherchev est créée sur une nouvelle feuille de mon classeur. Sur cette feuille je crée un bouton.
Là où je bloque, c'est au moment d'affecter une macro à ce bouton.
La macro est déjà prête dans un module il me suffit de l'affecter.

Le but étant de pouvoir créer autant de fois que nécessaire cette feuille et ce bouton puisque le bouton inséré permettra avec sa macro de fermer(supprimer) cette feuille.

Merci de m'avoir accordé un peu de temps de lecture et je l'espère de réponse.
Bonne journée
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
6357
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
19 novembre 2019
88
3
Merci
Bonjour,
Voir ceci:
http://frederic.sigonneau.free.fr/code/VBE/CreerDetruireUnBoutonEtSonCode.txt

@+ Le Pivert

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 209 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Le Pivert
Messages postés
5
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
21 décembre 2010
3
Merci
Bonjour Monsieur,

Merci beaucoup pour votre réponse. J'ai compris globalement le code que vous me proposez cependant je ne parvient pas à régler le(s) problème(s).
Voici comment j'ai aménagé ce code:

'Attribute VB_Name = "CreerDetruireUnBoutonEtSonCode" J'ai mis cette ligne en commentaire à cause d'un message d'erreur (erreur de syntaxe)
'Public Const NomBouton$ = "MonBouton" J'ai mis cette ligne en commentaire à cause d'une erreur (attribut incorrect dans un Sub ou Function)
Dim Btn As OLEObject, VbCodeMod As Object
Dim i&, Code$

'le bouton
Set Btn = ActiveSheet.OLEObjects.Add _
(ClassType:="Forms.CommandButton.1") '
i = ActiveSheet.OLEObjects.Count
With Btn
.Object.Caption = "Test bouton " & i
.Object.Font.Bold = True
.Top = ActiveCell(1, 2).Top
.Left = ActiveCell(1, 2).Left
.Name = NomBouton & i
.Visible = True
End With

'son code
Set VbCodeMod = ActiveWorkbook.VBProject. _
VBComponents(Btn.Parent.Sortie_tableau) Le nom de ma macro.Module8 Le module dans lequel elle se trouve
Code = "Private Sub " & Btn.Name & "_Click()" & vbLf
Code = Code & " MsgBox ""Test réussi : " & Btn.Name & "" & vbLf
Code = Code & " ActiveCell.Select" & vbLf
Code = Code & "End Sub"

VbCodeMod.AddFromString Code



Lorsque je déroule le programme, celui-ci va jusqu'à la création du bouton nommé "bouton test 1" mais je ne sais pas pourquoi cela s'arrête et aucune maccro n'est affectée au bouton.

Merci d'avance pour votre aide.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 209 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Jeremy45380
Messages postés
6357
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
19 novembre 2019
88
3
Merci
Avant de soumettre ce code je l'ai vérifié, il fonctionne. Voici la marche à suivre:
Ouvrir un nouveau classeur aller dans la partie code insérer un module où vous mettez ce code:
Public Const NomBouton$ = "MonBouton"

Sub CreeBoutonFeuilleEtCode()
Dim Btn As OLEObject, VbCodeMod As Object
Dim i&, Code$
  
  'le bouton
  Set Btn = ActiveSheet.OLEObjects.Add _
                      (ClassType:="Forms.CommandButton.1") '
  i = ActiveSheet.OLEObjects.Count
  With Btn
    .Object.Caption = "Test bouton " & i
    .Object.Font.Bold = True
    .Top = ActiveCell(1, 2).Top
    .Left = ActiveCell(1, 2).Left
    .Name = NomBouton & i
    .Visible = True
  End With
  
  'son code
  Set VbCodeMod = ActiveWorkbook.VBProject. _
                  VBComponents(Btn.Parent.CodeName).CodeModule
               
  Code = "Private Sub " & Btn.Name & "_Click()" & vbLf
  Code = Code & "  MsgBox ""Test réussi : " & Btn.Name & "" & vbLf
  Code = Code & "  ActiveCell.Select" & vbLf
  Code = Code & "End Sub"
  
  VbCodeMod.AddFromString Code
  
End Sub 'fs

Sub NettoieBoutonEtCode()
Dim NomBtn$, Shp As OLEObject, Sht As Worksheet
  For Each Sht In ActiveWorkbook.Sheets
    For Each Shp In Sht.OLEObjects
      NomBtn = Shp.Name
      If Left(NomBtn, 9) = NomBouton Then
        Shp.Delete
        With ActiveWorkbook.VBProject. _
              VBComponents(Sht.CodeName).CodeModule
          Deb = .ProcStartLine(NomBtn & "_Click", 0)
          NbLi = .ProcCountLines(NomBtn & "_Click", 0)
          .DeleteLines Deb, NbLi
        End With
      End If
    Next Shp
  Next Sht
End Sub


Ensuite mettre dans ThisWorkBook ce code:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
NettoieBoutonEtCode
End Sub
Private Sub Workbook_Open()
CreeBoutonFeuilleEtCode
End Sub


On ferme en enregistrant, c'est tout.
Pour l'adapter à votre projet il faut que j'ai plus d'élément.


@+ Le Pivert

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 209 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Le Pivert
Messages postés
5
Date d'inscription
jeudi 16 décembre 2010
Statut
Membre
Dernière intervention
21 décembre 2010
3
Merci
Effectivement le code marche bien tel quel. J'ai essayé de l'adapter directement à mon projet, voilà pourquoi cela ne marchait pas.

J'ai commencé à écrire des explications à n'en plus finir mais finalement j'ai réussi à adapter votre code à mon besoin.

Je vous en suis très reconnaissant. Merci beaucoup.

Bonne continuation à vous

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 209 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Jeremy45380