Créer une macro qui crée un bouton et y affecte une autre maccro

Résolu
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 à 09:44
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

4 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
21 déc. 2010 à 10:47
3
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 à 12:11
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.
3
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
21 déc. 2010 à 12:55
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
3
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
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
3
Rejoignez-nous