création d'un bouton à partir d'un userform + code

  • Initiateur de la discussion Xavier
  • Date de début
X

Xavier

Guest
Bonjour,

Je sais que ce poste ressemble à d'autres mais voilà dans mon état, le ridicule ne tue plus...

Je souhaiterais qu'à partir d'un macro lancé par un userform pouvoir créer un bouton dans un nouveau fichier et d'assigner à ce nouveau bouton un macro ... je pensais que ca suffisait de faire sub commandbutton1_click() mais non rien ne se passe ...le problème repose selon moi dans l'assignation du bouton 1 ( le rendre actif ou un truc du genre)

Donc si ca vous dis quelque chose merci bcp

Xa

ps: Je mets ci-joint la création du bouton (ca vient d'un autre poste je vous rassure)

Dim oOLE As OLEObject
Dim X As Byte
Dim Code As String
Dim NextLine As String

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

X = ActiveSheet.OLEObjects.Count existants dans la feuille
With CommandButton1
.Default = True
End With
'option nommer l'objet
oOLE.Name = "CommandButton1"
'texte sur le bouton
ActiveSheet.OLEObjects(X).Object.Caption = "Global Top25"

==)) Probleme comment assigner mon macro suivant Globaltop à ce nouveau bouton créé par un userform
 
Z

Zon

Guest
Salut,

Il faut créer le code à la voléé aussi :

dim Code$
Set oOLE = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=340, Top:=30, Width:=100, Height:=30)
with oole
.Name = "CommandButton1"
.Object.Caption = "Global Top25"
end with

Code = "Sub CommandButton1_Click()" & vbCrLf
Code = Code & "MsgBox ""Coucou XLD""" & vbCrLf
Code = Code & "End Sub"

With ActiveWorkbook.VBProject.VBComponents(NewSheet.Name).CodeModule
.InsertLines + 1, Code
End With

'ou 2 eme méthode
With ActiveWorkbook.VBProject.VBComponents(NewSheet.Name).CodeModule
.InsertLines .CreateEventProc("Click", "Commandbutton1") + 1,"Lenomdelamacroàéxécuter"
end with

A+++
 
X

Xavier

Guest
Bonjour,

Merci bcp pour les codes mais hélas ca ne marche pas ... j'ai toujours le meme probleme que lors d'un poste précédent. Le programme marche pour autant qu'il est placé directement sur la feuille qui crée le bouton or dans mon cas jutilise un userform ... Ainsi mon userform crée bien mon bouton mais il semble etre inactif ...

Comme je n'ai toujours pas trouvé le moyen de contourner le problème, je reste persuadé (mais là je rejoins mon ancien poste) que le blocage se trouve dans la ligne suivante
With ActiveWorkbook.VBProject.VBComponents(NewSheet.Name).CodeModule

En effet, d'une part le macro se bloque tout le temps à cet endroit avec un bon vieux subscipt out of range et d'autre part, le activeworkook me parait bizard mais parait seulement

Voilà ou j'en suis pour l'instant si quelqu'un voit une solution je suis preneur

Amicalement
Xa
 
Z

Zon

Guest
Salut,

Un bel exemple quand on utilise pas Option Explicit, newsheet.name à la compilation n'aurait pas été reconnue comme variable déclarée...

En effet activeworkbook ne va pas passer puisque j'avais omis que c'était dans un nouveau fichier.

Voilà un exemple dans un classeur existant et ouvert (c'est ton cas ?) où dans la 1 ére feuille on crée le bouton et son code associé(ici une boucle pour remplir la plage A1:A10.

Sub Test()
Dim Classeur As Workbook
Dim oOLE As OLEObject
Dim X As Byte
Dim Code$
'On crée le code associé
Code = " dim I&" & vbCrLf
Code = Code & " for i=1 to 10" & vbCrLf
Code = Code & " range(""A"" & i)=i" & vbCrLf
Code = Code & " next i"

Set Classeur = Workbooks("Lenomduclasseur") 'à adapter, ou workbooks.add si on crée le fichier
With Classeur
With .Worksheets(1)
X = .OLEObjects.Count
Set oOLE = .OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=340, Top:=30, Width:=100, Height:=30)
End With

With oOLE
.Name = "CommandButton" & X + 1
.Object.Caption = "Global Top25"
End With

With .VBProject.VBComponents(Worksheets(1).Name).CodeModule
.InsertLines .CreateEventProc("Click", "Commandbutton" & X + 1) + 1, Code
End With
End With
End Sub


A+++
 
R

Robert

Guest
Salut Xavier, salut Zon, salut le forum,

Je me permets de m'immiscer dans ce fil. Je ne vous dis pas le temps que j'ai passé à essayer de résoudre ce problème sans y arriver ! J'y étais presque remarquez. Sauf que mon code, au lieu de s'écrire entre les lignes du CommandbuttonX_Click() / End Sub, il s'écrivait juste au dessus le c... Enfin le c... c’est moi.
Mais grâce à Zon, j'ai appris que l'on peut placer le CreateEventProc après le InsertLines.

Merci mille fois à toi Zon, tu es trop Zon. Heu ! trop bon.

À plus,

Robert
 
A

Aldo

Guest
Bonjour,

j'ai un autre problème!

J'ai créé un macro "MacroPC" pour un bouton dans un nouveau SHEET (Destination) et d'assigner à ce nouveau sheet un bouton avec son macro!

Il fonctionne seulement lorsque j'ai un seul sheet dans la fichier excel.

Tout le fois que je lance la macro pour créer le bouton sur le sheet destination je reçois un message d'erreur!
Merci bcp
Aldo

Ici le code:

Sub Test()

Dim oOLE As OLEObject
Dim X As Byte

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


X = ActiveSheet.OLEObjects.Count

With oOLE
.Name = "CommandButton" & X + 1
.Object.Caption = "PC"
End With

With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
.InsertLines .CreateEventProc("Click", "Commandbutton" & Button & X + 1) + 1, "MacroPC"
End With
End Sub
 
Z

Zon

Guest
Salut,

Bienvenue Aldo (serais-tu comme mes ancêtres Italiens ?) , pour que cela fonctionne tout le temps, il faut mettre ta procédure Test et MacroPC dans un module standard (Insertion/ Module dans VBE). Le bouton sera créé sur la feuille active (Activesheet).

Pour le faire unquement sur la feuille dénommée "Destination".
Sub Test()

Dim oOLE As OLEObject
Dim X As Byte
dim F as worksheet

set f=worksheets("Destination") ' à adapter
Set oOLE = f.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=340, Top:=30, Width:=100, Height:=30)


X = f.OLEObjects.Count

With oOLE
.Name = "CommandButton" & X + 1
.Object.Caption = "PC"
End With

With ActiveWorkbook.VBProject.VBComponents(f.Name).CodeModule
.InsertLines .CreateEventProc("Click", "Commandbutton" & Button & X + 1) + 1, "MacroPC"
End With
End Sub


A+++
 
G

Guillaume

Guest
Bonjour et merci pour ces infos, mais ça ne marche pas chez moi: sur les codes donnés je me prends l'erreur "l'accès par programme au projet Visual Basic n'est pas fiable".

Quid?

Merci d'avance.

Guillaume
 
M

myDearFriend

Guest
Bonsoir Guillaume, le Forum.


Pour que ça puisse fonctionner :
Outils / Macro / Sécurité... / Onglet "Sources Fiables", sélectionne "Faire confiance au projet Visual Basic"



Cordialement,
Didier_mDF

myDearFriend-3.gif
 
G

Guillaume

Guest
Bonjour le forum,

Merci encore pour cette information, j'aurais pu chercher longtemps...

Je suis très pénible, mais ça ne marche toujours pas. Enfin, presque:
Je veux créer un nouveau bouton dans UserFormEssai et lui faire afficher "coucou" quand on clique dessus.
Je crée le bouton dans la macro (non dans la partie code du userform):

' Create the CommandButton
Set Ctrl = UserFormEssai.Controls.Add("Forms.CommandButton.1")
With Ctrl
.Name = "OKButton"
.Caption = "OK"
End With

Puis je suis vos infos pour créer le code associé (à insérer dans la partie code du userform):
' Create the associated code
Code = "Sub OKButton_Click()" & vbCrLf
Code = Code & "MsgBox ""Coucou XLD""" & vbCrLf
Code = Code & "End Sub"
' Copy the code in the sheet
With ActiveWorkbook.VBProject.VBComponents("UserFormEssai").codeModule
.InsertLines 5, Code ' 5 parce que après "option explicit"
End With

Puis affichage du userform
UserFormEssai.show

Pas de problème à l'éxécution, mais le click sur le boutton OK créé ne fait rien. Sous VBE, quand on fait afficher le code de UserFormEssai, la procédure d'event OKButton_click() y est! Raaah, pourquoi n'est elle pas éxécutée?!

La deuxième solution avec createEventProc :
With ActiveWorkbook.VBProject.VBComponents("UserFormEssai").codeModule
.InsertLines .CreateEventProc("Click", "OKButton") + 1, "MacroMsgBox"
End With
ne marche pas: erreur "gestionnaire d'événements non valide". Est ce à voir avec les objets (createEventProc attend un objet en argument et je lui passe un control)?

Merci à tous qui m'ont déjà répondu et d'avance encore pour la résolution de ce pb. J'ai trop l'impression de toucher au but, c'est frustrant!
Bonne journée à tous. Il fait beau ici :)

Guillaume
 
M

myDearFriend

Guest
Bonsoir Guillaume, le Forum.


Guillaume, tu trouveras ci-joint un exemple simple de la création d'un bouton dynamiquement dans un UserForm existant.

Le code utilisé est le suivant :
Public Sub AfficherUSF()
Dim USF
Dim Ctrl As CommandButton
Dim Code As String
'Créer le nouveau bouton
Set USF = ThisWorkbook.VBProject.VBComponents("UserForm1")
Set Ctrl = USF.Designer.Controls.Add("forms.CommandButton.1")
With Ctrl
.Name = "OKButton"
.Caption = "OK"
End With
' Créer le code associé au nouveau bouton
Code = "Private Sub OKButton_Click()" & vbCrLf
Code = Code & "MsgBox ""Coucou XLD""" & vbCrLf
Code = Code & "End Sub"
With USF.CodeModule
.InsertLines .CountOfLines + 1, Code
End With
'Affiche le USF
VBA.UserForms.Add(USF.Name).Show
'Supprime le bouton créé dynamiquement
USF.Designer.Controls.Remove "OKButton"
With USF.CodeModule
.deleteLines 2, 3
End With
End Sub


Cet exemple, suppose que tu n'as aucune ligne de code lié au UserForm pour l'instant (exceptée la ligne "Option Explicit"). Dans le cas contraire, il te faudra adapter la partie suppression du code lié au bouton...


Cordialement,
Didier_mDF

myDearFriend-3.gif
 

Pièces jointes

  • PourGuillaume.zip
    11.2 KB · Affichages: 117
G

Guillaume

Guest
Bonjour David et tout le monde.

Merci de ton aide, cela fonctionne effectivement, pourvu que je mette ça dans un module. Si je le place (comme je le souhaitais) dans la partie code du userform (celui modifié ou un autre), cela ne marche pas :-(. Il y a un truc de portée de variable ou d'environnement que je n'ai donc basiquement pas compris. Pas grave: je vais adapter mon code pour tout mettre dans mon module "main" (qui ne contient pour l'instant que load userform, userform.show, unload userform ;-) )
Merci encore. :*

Guillaume
 

Discussions similaires

Statistiques des forums

Discussions
312 226
Messages
2 086 414
Membres
103 204
dernier inscrit
alaa20dine01