Ecrire le code du commandButton lors de sa créatio [Résolu]

Signaler
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
-
taj88
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
-
Bonjour, 
j'ai écris une macro qui crée un Command bouton "automatiquement" avec des caractéristiques spécifique :

Sub Créer_bouton

    ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
    , DisplayAsIcon:=False, Left:=0 + 18.5 * j, Top:=18.5 * i, Width:=18.5, Height:=18.5). _
    Select
    'Selection.ShapeRange.ZOrder msoSendToBack
    Selection.Object.BackStyle = 0 - fmBackStyleTransparent
    Selection.Object.BackColor = &H8000000B
    Selection.Object.Caption = " "
    Selection.ShapeRange.Fill.Visible = msoFalse
    Selection.ShapeRange.PictureFormat.Contrast = 1#
 
End Sub

Mais j'aimerais que lorsque que ce CommandButton se créer, on associe une formule (ou copie une formule) dans le code du CommandButton

un truc du genre : Copy : "aaa", &Selection.Object.Name

Pour avoir comme résultat dans le code du CommandButton :

Private Sub CommandButton1_Click()
aaa CommandButton1
End Sub

aaa étant un sous programme du genre

Sub aaa(Bouton As CommandButton)
...
...
End Sub

Voilà, si quelqu'un a une idée qu'il n'hésite pas.

@+

Je viens de découvrir le bonheur de programmer et le VB me le rend bien

7 réponses

Messages postés
201
Date d'inscription
mardi 7 octobre 2003
Statut
Membre
Dernière intervention
10 mai 2016

Très simple, mais dangereux, car cela t'oblige à ouvrir la protection de l'éxécution du code VBA

sinon : dans ton Créer_bouton, tu colles :

   ' tu crée un nouveau module nommé "coucou"
    Set num = ThisWorkbook.VBProject.VBComponents.Add(1)
    num.Name = "coucou"
    
  ' tu y colles une nouvelle routine :
    txt = "Sub collage()" + vbCrLf + "Copy : ""aaa"", &Selection.Object.Name" + vbCrLf + "End Sub"
    num.CodeModule.InsertLines 1, txt

et pour supprimer le module

With ThisWorkbook.VBProject.VBComponents
        On Error Resume Next
        .Remove .Item("coucou")
End With

coïto ergo sum
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007

Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007

Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007

Re,
je suis débutant avec une expériance de 5 jours de code sous VBA, et je n'ai donc pas tout compris à ta réponse.

 tu crée un nouveau module nommé "coucou"
    Set num = ThisWorkbook.VBProject.VBComponents.Add(1)
    num.Name = "coucou"
apparament cela permet de créer un nouveau module (mais apparament, il faut enlever la protection de VBA)

 tu y colles une nouvelle routine :
    txt = "Sub collage()" + vbCrLf + "Copy : ""aaa"", &Selection.Object.Name" + vbCrLf + "End Sub"
    num.CodeModule.InsertLines 1, txt
ici, cette partie j'ai pas tout compris
Sub collage est une fonction que je doit créee? et que veu dire vbCrLf

Merci d'avance

Je viens de découvrir le bonheur de programmer et le VB me le rend bien
Messages postés
443
Date d'inscription
mardi 27 mars 2007
Statut
Membre
Dernière intervention
1 mars 2011
1
Alors pourquoi avoir accepté la réponse !!!

N'existe-t-il pas un : Selection.Object..OnAction = "NomMacro_A_Exécuter"
Si cela existe, il suffit de créer le code de la macro à exécuter par le bouton et l'association bouton/macro se fera via OnAction
JML
Messages postés
201
Date d'inscription
mardi 7 octobre 2003
Statut
Membre
Dernière intervention
10 mai 2016

ce n'est pas contradictoire :  le .onaction appelle une fonction qui existe déjà ... mais que tu ne peux créer dynamiquement

sinon :

Set num = ThisWorkbook.VBProject.VBComponents.Add(1) : définit la variable objet num comme étant un composant vba (module ...que j'ajoute à ceux existant )
    num.Name = "coucou" : lui donne un nom (autre que celui par défaut)

    txt = "Sub collage()" + vbCrLf + "Copy : ""aaa"", &Selection.Object.Name" + vbCrLf + "End Sub"
    num.CodeModule.InsertLines 1, txt

txt (avec dim txt as string) définit une variable de type string (chaine de caractères)
"   " : entre quillemet le teste
& : opérateur de concatenation (oups, j'ai mis +, qui est une erreur d'écriture)
vbcrlf : pour sauter une ligne (!! vblf et vbcr !! pour faire la distinction entre fin de ligne et fin de paragraphe)
insertlines 1, txt :
- le 1 pour dire où dans le module (ligne 1 dans mon cas, mais on pourrait connaitre la taille du fichier et écrire à la fin)
- txt : ce que l'on colle à partir du numéro de ligne définit

coïto ergo sum
Messages postés
113
Date d'inscription
mercredi 9 mai 2007
Statut
Membre
Dernière intervention
28 août 2007

Slt, apparemment VBA n'accepte pas la méthode que tu préconise.


De plus, comme je crée mon CommandButton, je n'ai pas besoin de créer un module num, mais par contre à l'intérieur de mon code de création du command button, je peux peut-^tre indiquer qqc comme cela  (ligne en rouge):

Sub Créer_bouton

    ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
    , DisplayAsIcon:=False, Left:=0 + 18.5 * j, Top:=18.5 * i, Width:=18.5, Height:=18.5). _
    Select

txt = "aaa",&Selection.Object.Name

Select.CodeObject.Insert, txt

Voilà, ceci n'est pas coorect mais est ce quelqu'un connait peut être la commande correcte.

Merci d'avance
@+

Je viens de découvrir le bonheur de programmer et le VB me le rend bien