Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

créer un bouton avec affectation dynamique par VBA

2 réponses
Avatar
Jot59
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

2 réponses

Avatar
michdenis
Bonjour Jot59,

Tu aurais intérêt à définir explicitement ce que tu désires faire...
il n'est pas toujours évident de comprendre ce que la procédure
doit faire si cette dernère n'est pas au point.

Voici un début d'explication :

Lorsque tu lances ta macro pour la première fois, le classeur qui est actif
est le classeur contenant ta macro. À cet effet, la procédure n'a pas
de difficulté à identifier à feuille Sheets("Menu").Select puisqu'elle fait
parti du classeur actif ...

Cependant, si tu lances une deuxième fois, le classeur actif n'est plus
celui qui contient la macro ... mais l'autre classeur qui a été créé par ta procédure
Résultat : la procédure ne trouve plus la feuille "Menu" car elle n'appartient pas
au classeur actif.

Une façon de corriger cela, est d'ajouter ceci avant cette ligne de code :
ThisWorkbook.Activate
Sheets("Menu").Select


Salutations!




"Jot59" a écrit dans le message de news:
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:úlse, DisplayAsIcon:úlse, Left:40, Top:0, Width:0,
Height:0)
'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
Avatar
Jot59
Bonjour,

tout d'abord merci d'avoir pris un peu de temps pour étudier mon pb.

Ce que je veux faire exactement c'est créer un bouton dans le classeur actif
"Menu" donc je ne change pas de classeur.

la ligne Workbooks.Add 'creer classeur était pour faire un essai et ca
marche par contre qd je reste dans le classeur actif du début à savoir Menu
j'ai l'erreur "Impossible d'entrer en mode arrêt maintenant".
l'objectif est de pouvoir créer des boutons dynamiquement et lui associer
également dynamiquement une macro qui elle aussi peut être modifier par le
code.

merci d'avance
jot59


Bonjour Jot59,

Tu aurais intérêt à définir explicitement ce que tu désires faire...
il n'est pas toujours évident de comprendre ce que la procédure
doit faire si cette dernère n'est pas au point.

Voici un début d'explication :

Lorsque tu lances ta macro pour la première fois, le classeur qui est actif
est le classeur contenant ta macro. À cet effet, la procédure n'a pas
de difficulté à identifier à feuille Sheets("Menu").Select puisqu'elle fait
parti du classeur actif ...

Cependant, si tu lances une deuxième fois, le classeur actif n'est plus
celui qui contient la macro ... mais l'autre classeur qui a été créé par ta procédure
Résultat : la procédure ne trouve plus la feuille "Menu" car elle n'appartient pas
au classeur actif.

Une façon de corriger cela, est d'ajouter ceci avant cette ligne de code :
ThisWorkbook.Activate
Sheets("Menu").Select


Salutations!




"Jot59" a écrit dans le message de news:
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:úlse, DisplayAsIcon:úlse, Left:40, Top:0, Width:0,
Height:0)
'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