Créer un bouton dynamiquement excel via VBA

Fermé
jot59 Messages postés 22 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 2 décembre 2009 - 31 mars 2006 à 16:56
 -- - 12 août 2010 à 16:39
Bonjour ,
je souhaite créer un bouton par macro et affecter une macro également à ce bouton créé, sachant que le code lié à la macro qui doit affecter doit pouvoir être changé dynamiquement en fonction du contenu de certaines cellules.
j'ai écrit le code suivant :
Dim X As Byte
Dim Code As String
Dim NextLine As String
Dim oOLE As OLEObject
Sheets("Menu").Select
Range("A1").Select
i = 1
Do While Cells(i, 1) <> "XXX"
i = i + 1
Loop
i = i + 1
BU_number = Cells(i, 1)

Workbooks.Add 'creer classeur
Set oOLE = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=340, Top:=30, Width:=100, Height:=30)
'Left position bouton par rapport au bord gauche de la feuille
'Top position bouton par rapport au haut de la feuille
'Width largeur bouton
'Height hauteur bouton

X = ActiveSheet.OLEObjects.Count 'compter le nombre de boutons existants dans la feuille

'option nommer l'objet
oOLE.Name = "CommandButton" & X
'texte sur le bouton
ActiveSheet.OLEObjects(X).Object.Caption = "BU " & X
Code = "Sub CommandButton" & X & "_Click()" & vbCrLf
Code = Code & "Sheets(""feuil2"").select" & vbCrLf
Code = Code & "End Sub"

With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
NextLine = .CountOfLines + 1
.insertlines NextLine, Code
End With
End Sub

ce code fonctionne très bien lorsqu'on crée une nouvelle feuille "Workbooks.Add 'creer classeur" après la boucle.
Le fait d'appuyer sur le bouton me fait aller sur la feuille "feuil2"

par contre dès qu'on supprime la ligne "Workbooks.Add 'creer classeur "
qui permet donc de créer le bouton sur la feuille active cane marche plus j'ai le message suivant :
"Impossible d'entrer en mode arrêt maintenant"
puis si je fais continuer : message : l'indice n'appartient à la sélection"

Quelqu'un peut m'aider sur le sujet
merci d'avance
A voir également:

20 réponses

Utilisateur anonyme
31 mars 2006 à 21:37
Bonjour,

J'ai apporté quelque modif pour que cela fonctionne chez moi !

Sub CreerMenu()

    Dim X As Byte
    Dim i, BU_number As Long
    Dim Code As String
    Dim NextLine As String
    Dim oOLE As OLEObject
    
    Sheets("Menu").Select
    Range("A1").Select
    i = 1
    Do While Cells(i, 1).Value <> "XXX"
        i = i + 1
    Loop
    i = i + 1
    BU_number = Cells(i, 1)

    'Workbooks.Add 'creer classeur
    Set oOLE = ActiveWorkbook.ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
        Link:=False, DisplayAsIcon:=False, Left:=340, Top:=30, Width:=100, Height:=30)

    'Left position bouton par rapport au bord gauche de la feuille
    'Top position bouton par rapport au haut de la feuille
    'Width largeur bouton
    'Height hauteur bouton

    X = ActiveSheet.OLEObjects.Count 'compter le nombre de boutons existants dans la feuille

    'option nommer l'objet
    oOLE.Name = "CommandButton" & X
    'texte sur le bouton
    ActiveSheet.OLEObjects(X).Object.Caption = "BU " & X
    Code = "Sub CommandButton" & X & "_Click()" & vbCrLf
    Code = Code & "Sheets(""feuil2"").select" & vbCrLf
    Code = Code & "End Sub"

    With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
        NextLine = .CountOfLines + 1
        .insertlines NextLine, Code
    End With

End Sub



Lupin
4
jot59 Messages postés 22 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 2 décembre 2009 2
3 avril 2006 à 10:01
Bonjour Lupin,

merci d'avoir regarder la macro, j'ai pris la macro de la réponse j'ai le meme problème lorsque je veux travailler sur la feuille courante (ligne 'Workbooks.Add 'creer classeur en commentaires)

impossible d'entrer en mode arrêt maintenant

il y a peut être un pb d'options de Excel ou Visual basic

merci d'avance
jot59
0
Utilisateur anonyme
4 avril 2006 à 14:46
re:

C'est tout a fait possible qu'il y ait des paramètres de sécurité!

Pour ce qui est du point d'arret, c'est normal je crois, la ligne
[ Set oOLE ... ] contient une méthode [ Add ] et l'on ne peut
traverser cette ligne lors d'un déboggage, ça m'arrive très
souvent.

Pour les paramètres de sécurité Excel, chez moi la sécurité
est au minimum et j'ai coché la case [ Faire confiance aux
projet VBA ] du deuxième onglet dans les paramètres de
sécurité.

Autre point, pour utiliser cet objet [ActiveWorkbook.VBProject.VBComponents], il te
faut charger la référence :
Microsoft Visual Basic for Applications Extensibility

Pour débogger place des point d'arret devant et après
la ligne du [ Set oOLE ... ].

Bon courage !

Lupin
0
jot59 Messages postés 22 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 2 décembre 2009 2 > Utilisateur anonyme
4 avril 2006 à 17:36
Bonjour Lupin,

en fait tu as raison, lorsque je lance la macro hors VB donc depuis Excel , ca fonctionne.

ok merci de ton aide

a bientot
0
Naya > Utilisateur anonyme
14 nov. 2006 à 15:33
Bonjour,

je sais que ce post a ete resolu il y a longtemps mais vous pourrez surement m'aider.

je ne fais pas tout à fait la même chose que dans le message initial mais ca s'en rapproche.
je crée dynamiquement un certain nombre de boutons avec le code suivant et je crée le code qui va avec en utilisant ce que vous avez mis plus haut :
dim myCommandButtonDetail  as Control

Set myCommandButtonDetail = GestionMeuleForm.MultiPage1.Pages(4).CalculBesoinFrame.Controls.Add _
        ("Forms.CommandButton.1", "CommandButtonDetail_" & iNbReappro)
    
With myCommandButtonDetail
               .Name = "CommandButtonDetail_" & iNbReappro
            '-- le reste des param
End With


strCode = "Public Sub CommandButtonDetail_" & iNbReappro & "_Click()" & Chr(13) & Chr(13)
strCode = strCode & "Load DetailReapproForm" & Chr(13) & "GestionMeuleForm.Hide" & Chr(13) & "DetailReapproForm.Show" & Chr(13) & Chr(13)
strCode = strCode & "End Sub" & Chr(13)
    
With ThisWorkbook.VBProject.VBComponents("GestionMeuleForm").CodeModule
        NextLine = .CountOfLines + 1
        .InsertLines NextLine, strCode
End With


cependant quand on clic sur un de ces boutons rien ne se passe alors que le code est bien ajouté a la fin du code de GestionMeuleForm.
je ne m'y connais pas assez en vba pour savoir pourquoi ca ne fonctionne pas.

merci d'avance de votre aide
0