Creation "onEvent" par vba

L

Ludo

Guest
Bonjour a tous,

je bloque bien comme il faut sur le probleme suivant:
J'ai 10 celulles renseignées sur une feuill excel.
Quand je lance une macro, je cree dans un formulaire un Label pour chaque cellule.
Donc de label i a i+10, les label sont nommes 'label' & i

Jusque la ca va.

je voudrais, pour chaque label crée, pouvoir assigner un truc du genre:

labeli_click()
msgbox('label Numero' & i)
end sub

Et ce, de maniere automatique lors de la creation du form, comme ca quand le forme apparait et que je clique sur un label, le petit msgbox apparait :)

J'y arrive pas. Mais est ce possible??


J'espere que le probleme est clair (..) et vous remercie 10000 fois pour votre precieuse aide..


Ludo
 

_Thierry

XLDnaute Barbatruc
Bonjour Ludo, le Forum

Ce genre de code WithEvents est ce que je suis en train d'appronfondir sur des Modules de Class, mais de là à le générer automatiquement, je ne me suis en fait jamais encore retrouvé à un tel besoin...

La difficulté majeure dans cette éventualité sera d'écrire dans deux endroit bien distincts du VBProject, le Module du UserForm lui-même mais aussi et surtout dans un Module de Class... Tout en synchronisant les Informations...

Dans un premier temps, quoique que l'idée soit interressante, je vais t'orienter vers une solution basic plus facile et plus rapide (pour moi aussi !! lol)

Donc une fois ton UserForm généré, si tu ne l'as pas nommé autrement il devrait se nommer UserForm1. Comme tu dis savoir générer tes 10 Labels nommés 'Label1, Label2, Label3, ... etc Label10' donc il te suffira d'enchainer cette procédure :

Sub MyLabelClicks()
Dim x As Integer
Dim L As Byte

   
With ThisWorkbook.VBProject.VBComponents('UserForm1').CodeModule
       
For L = 1 To 10
            x = .CountOfLines
            .InsertLines x + 1, 'Sub Label' & L & '_Click()'
            .InsertLines x + 2, 'MsgBox ''Label Numero ' & L & ''
            .InsertLines x + 3, 'End Sub'
       
Next
   
End With

End Sub


Bonne Fin de Journée
[ol]@+Thierry[/ol]
 
L

Ludo

Guest
Thierry,

merci beaucoup pour la röponse ca a l'air de fonctionner :)

Mais ca fonctionne seulement si les labels sont crées manuellement dans le formulaire.

En fait, n'etant point du tout un expert en vb, je me demande un truc:
les labels crées dynamiquement, peut on les enregistrer 'reelement' dans le formulaire, c'est a dire que si je le ferme et que je le re ouvre, les labels crees soient encore la?

le code de l'event est bien ecrit mais rien ne se passe quand je clique sur mes labels, comme si les labels n'existaient pas vraiment :)

Pauvres petits labels....


Aurait tu (vous) une astuce pour ce probleme??


Merci d'avance


Ludo
 

_Thierry

XLDnaute Barbatruc
=> DEMO AutoGeneration UserForm par Programmation

Bonjour Ludo, le Forum

Arf oui les Pauvres petits Labels....

Pour ton sas, sans le code je ne sais pas trop dans quoi tu 'farfouilles' mais si, admettons, j'avais à générer un UserForm avec 40 TextBoxs accompagnées de 40 Labels le tout alligné en collonne de 10 en 10

Ceci avec ces 40 Labels qui devraient donc réagir au Click avec un MsgBox... Tout en conservant le UserForm ainsi généré avec tous ses Controls ActiveX, voici comme je procèderai :

Option Explicit

'================================R E A D - M E======================================
'
'        NB Nécessite la Réference VB à Microsoft Form 2.0 Object Library
'          Paramétrage Sécurité 'Faire Confiance au Projet Visual Basic'
'===================================================================================

Const Sign As String = '@+Thierry 's Truc sur www.Excel-Downloads.com, Aug 2005'
Const USFName As String = 'USF_Auto_Thierry'

Const TxbWidth As Integer = 65
Const TxbHeigth As Integer = 15
Const TxbLeft As Integer = 90
Const TxbTop As Integer = 15

Const LblWidth As Integer = 70
Const LblHeigth As Integer = 15
Const LblLeft As Integer = 10
Const LblTop As Integer = 15

Sub MyUserFormAutoBuilder()
Dim ObjUSF As Object
Dim ObjTextBox As Object, ObjLabel As Object, CmdB As Object, LstB As Object
Dim TopPlusHeight As Integer
Dim x As Byte
Dim VLblLeft As Integer
Dim VTxbLeft As Integer

 
 
Set ObjUSF = ThisWorkbook.VBProject.VBComponents.Add(3)
 
With ObjUSF
    .Properties('Caption') = Sign
    .Properties('Width') = 660
    .Properties('Height') = 195
    .Properties('ShowModal') =
True
'    .Properties('Name') = USFName 'Si on veut forcer un Nom de UserForm...
 
End With
 
   
For x = 1 To 40
       
     
Set ObjTextBox = ObjUSF.Designer.Controls.Add('Forms.TextBox.1')
     
Set ObjLabel = ObjUSF.Designer.Controls.Add('Forms.Label.1')
     
         
Select Case x
           
Case 1 To 10
             
If x = 1 Then TopPlusHeight = LblTop
              VLblLeft = LblLeft
              VTxbLeft = TxbLeft
           
Case 11 To 20
             
If x = 11 Then TopPlusHeight = LblTop
              VLblLeft = LblLeft + 160
              VTxbLeft = TxbLeft + 160
           
Case 21 To 30
             
If x = 21 Then TopPlusHeight = LblTop
              VLblLeft = LblLeft + 320
              VTxbLeft = TxbLeft + 320
           
Case 31 To 40
             
If x = 31 Then TopPlusHeight = LblTop
              VLblLeft = LblLeft + 480
              VTxbLeft = TxbLeft + 480
         
End Select
             
         
         
With ObjLabel
            .Caption = 'Label TextBox ' & x
            .Left = VLblLeft: .Top = TopPlusHeight: .Width = LblWidth: .Height = LblHeigth
            .Tag = 'Thierry
's Demo'
            .Name = 'LblDemo' & x
         
End With
         
With ObjTextBox
            .Left = VTxbLeft: .Top = TopPlusHeight: .Width = TxbWidth: .Height = TxbHeigth
            .Tag = 'Thierry
's Demo'
            .Name = 'TxbDemo' & x
            .TextAlign = fmTextAlignRight
         
End With
         
        TopPlusHeight = TopPlusHeight + 15
   
Next

MyLabelClicks ObjUSF.Name

VBA.UserForms.Add(ObjUSF.Name).Show
 
Set ObjUSF = Nothing
Set ObjTextBox = Nothing
Set ObjLabel = Nothing

End Sub

Sub MyLabelClicks(MyUsf As String)
Dim x As Integer
Dim L As Byte

   
With ThisWorkbook.VBProject.VBComponents(MyUsf).CodeModule
       
For L = 1 To 40
            x = .CountOfLines
            .InsertLines x + 1, 'Sub LblDemo' & L & '_Click()'
            .InsertLines x + 2, 'MsgBox ''Je suis la Label Numero ' & L & ''
            .InsertLines x + 3, 'End Sub'
       
Next
   
End With

End Sub


Bonne Journée
[ol]@+Thierry[/ol]
 
L

Ludo

Guest
Op op op :)

Je viens de touver une solution qui est pas trop mal est qui fonctionne bien donc je me permet de l'ecrire, au cas ou qulequ'un s'interresse au sujet ..

Donc, j'ai utilisé un module de class.
Sur Userform_initialize, je lance ma procedure qui rajoute mes 10 petits labels, de label i a i+10.

Puis, a la suite de ce 'lancement',2 choses:
- Dans un modul de class, pour les Labels lui appartenant, il faut afficher msgbox 'label'i sur un click.
- Dans mon userform_initialize, je fait l'inventaire des labels presants, je 'lie' les labels crées au modul de class.

De ce fait, le 'groupe' de label apaprtenant au modul de class se voit 'infliger' une msgbox chacun!!


Merci en tout cas pour l'aide, bien cool le forum :)


A bientot pour de nouvelles aventures !


Ludo
 
L

Ludo

Guest
Thierry,

Desole, nos messages se sont croisés!!

Je vais lire attentivement ton code puis essayer de le comprendre :)

merci en tout cas pour tes reponses bein sympa :)
J’ai mis mon (debut) de fichier en piece jointe.

En fait j’essaye de créer dynamiquement un « menu déroulant ».
L’arborescence est dans des cellules avec la forme « tree ».

C’est juste pour le challenge et pour apprendre un peu le VB, ça n’a pas grande utilité pour l’instant.
Mon but final etant de gerer Visible pour les labels sur mousemouve, pour vraiment donner l’impressiont du déroulant….


Merci encore pour les reponses, et si ca t’interesse, je te tiendrais au courrant de mon avancée !!!

Merci

Ludo
[file name=menu_20050830110610.zip size=21592]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/menu_20050830110610.zip[/file]
 

Pièces jointes

  • menu_20050830110610.zip
    21.1 KB · Affichages: 42

Discussions similaires

Réponses
8
Affichages
148

Statistiques des forums

Discussions
299 878
Messages
1 979 749
Membres
206 856
dernier inscrit
Proux