E
Emeric
Guest
Bonjour à tous,
Novice du VBA, j'utilise Excel version 2002 et je tente désespérément de créer des checkbox et leur événement "click" associé de façon dynamique dans une macro VBA. En effet selon les cas je peux avoir besoin d'une jusqu'à N checkbox.
J’ai donc inséré dans un module du code qui génère des chekbox et leur événement click sur une feuille excel. Les checkbox se créent bien mais je bute sur les événements.
Excel semble créer automatiquement un événement click lié à une check box générée dynamiquement (voir list box au dessus du code qui répertorie les fonctions d’une worksheet). J'ai donc utilisé une première méthode :
-Méthode 1
ActiveWorkbook.VBProject.VBComponents("Feuil1").CodeModule.ProcBodyLine("CB" & i & "_Click", vbext_pk_Proc)
Cette fonction est sensée me retourner la ligne de l’occurrence de la fonction « CB_click() » (histoire d’insérer mon code ensuite). Cette fonctionne me retourne rien au premier lancement de la macro. Elle me retourne quelque chose uniquement si je vais dans la fameuse listbox, sélectionne par ex CB1_click() pour la faire apparaître en dessous dans le code et relance la macro. Pour 100 check box ça risque d’être long !
-Méthode 2 (Plan B) ActiveWorkbook.VBProject.VBComponents("Feuil1").CodeModule.CreateEventProc("CB" & i & "_Click", Obj1.Name)
Cette fonction crée un événement lié à un objet. Je génère une erreur « 440, gestionnaire d’événement non valide ».
Désolé d’avance si mes explications sont longues et confuses. Je n’hésiterai pas à clarifier les points obscurs.
Grand merci d’avance à tous ceux qui peuvent m’aider : une solution, une fonction, une piste, ou même un encouragement car là j’en peux plus !
Mais surtout s’il vous plait dites moi que c‘est possible ! ;-)
Code :
ActiveSheet.OLEObjects.Delete
Dim i As Integer
Dim DebutCode As Integer
For i = 1 To 10
Dim Obj1 As OLEObject
L = Range("C" & i).Left + 3
T = Range("C" & i).Top + 3
W = 10
H = 10
Set Obj1 = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False, Left:=L, Top:=T, Width:=W, Height:=H)
Obj1.Name = "CB" & i
Obj1.Object.Value = True
DebutCode = ActiveWorkbook.VBProject.VBComponents("Feuil1").CodeModule.CreateEventProc("CB" & i & "_Click", Obj1.Name)
'DebutCode = ActiveWorkbook.VBProject.VBComponents("Feuil1").CodeModule.ProcBodyLine("CB" & i & "_Click", vbext_pk_Proc)
ActiveWorkbook.VBProject.VBComponents("Feuil1").CodeModule.InsertLines DebutCode + 1, "MsgBox ""YO!"""
Next i
Novice du VBA, j'utilise Excel version 2002 et je tente désespérément de créer des checkbox et leur événement "click" associé de façon dynamique dans une macro VBA. En effet selon les cas je peux avoir besoin d'une jusqu'à N checkbox.
J’ai donc inséré dans un module du code qui génère des chekbox et leur événement click sur une feuille excel. Les checkbox se créent bien mais je bute sur les événements.
Excel semble créer automatiquement un événement click lié à une check box générée dynamiquement (voir list box au dessus du code qui répertorie les fonctions d’une worksheet). J'ai donc utilisé une première méthode :
-Méthode 1
ActiveWorkbook.VBProject.VBComponents("Feuil1").CodeModule.ProcBodyLine("CB" & i & "_Click", vbext_pk_Proc)
Cette fonction est sensée me retourner la ligne de l’occurrence de la fonction « CB_click() » (histoire d’insérer mon code ensuite). Cette fonctionne me retourne rien au premier lancement de la macro. Elle me retourne quelque chose uniquement si je vais dans la fameuse listbox, sélectionne par ex CB1_click() pour la faire apparaître en dessous dans le code et relance la macro. Pour 100 check box ça risque d’être long !
-Méthode 2 (Plan B) ActiveWorkbook.VBProject.VBComponents("Feuil1").CodeModule.CreateEventProc("CB" & i & "_Click", Obj1.Name)
Cette fonction crée un événement lié à un objet. Je génère une erreur « 440, gestionnaire d’événement non valide ».
Désolé d’avance si mes explications sont longues et confuses. Je n’hésiterai pas à clarifier les points obscurs.
Grand merci d’avance à tous ceux qui peuvent m’aider : une solution, une fonction, une piste, ou même un encouragement car là j’en peux plus !
Mais surtout s’il vous plait dites moi que c‘est possible ! ;-)
Code :
ActiveSheet.OLEObjects.Delete
Dim i As Integer
Dim DebutCode As Integer
For i = 1 To 10
Dim Obj1 As OLEObject
L = Range("C" & i).Left + 3
T = Range("C" & i).Top + 3
W = 10
H = 10
Set Obj1 = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False, Left:=L, Top:=T, Width:=W, Height:=H)
Obj1.Name = "CB" & i
Obj1.Object.Value = True
DebutCode = ActiveWorkbook.VBProject.VBComponents("Feuil1").CodeModule.CreateEventProc("CB" & i & "_Click", Obj1.Name)
'DebutCode = ActiveWorkbook.VBProject.VBComponents("Feuil1").CodeModule.ProcBodyLine("CB" & i & "_Click", vbext_pk_Proc)
ActiveWorkbook.VBProject.VBComponents("Feuil1").CodeModule.InsertLines DebutCode + 1, "MsgBox ""YO!"""
Next i