crétion dynamique bouton VBA

remi5485

XLDnaute Nouveau
Bonjour à tous
je suis actuellement en stage de fin d'études et je sollicite votre aide afin de terminer une macro que j'ai à réaliser sous VBA avec Excel.
Je vous expose mon problème:

je dois créer dynamiquement des boutons dans une feuille Excel: des combobox et des check box.
Mon problème vient du nom que j'attribue dynamiquement aux boutons:
voici un bout de code:

Dim Chekbox As OLEObject
Dim ComboBox As OLEObject
Dim Check As CheckBox
Dim Combo As ComboBox

For i = 1 To nb_ligne
Set Target = ActiveSheet.Range("C" & 10 + i)

Set Chekbox = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=Target.Left, Top:=Target.Top, Width:=Target.Width, Height:=Target.Height)
Set Check = Chekbox.Object
Check.name = "CheckBox" & i

Set ComboBox = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=Target.Left, Top:=Target.Top, Width:=Target.Width, Height:=Target.Height)
Set Combo = ComboBox.Object
Combo.name = "ComboBox" & i
next i

le problème est que l'objet Check de type Checkbox n'est pas reconnu qd on fait Set Check = Chekbox.Object alors que ça marche très bien pour les combobox

J'ai une erreur de type incompatibilité de type et je ne peux pas avoir accès aux propriétes de l'objet checkbox dont le nom a changer.

Avant j'avais juste:
Set Chekbox = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=Target.Left, Top:=Target.Top, Width:=Target.Width, Height:=Target.Height)
With Checkbox
.name="xxxxx"
.object.value=true
.......
EndWith
le problème est que .name ne fait pas référence a l'objet checkbox(j'ai essayé.object.name mais ca ne marche pas
et donc lorsque je génère les boutons parfois les boutons n'ont pas le nom souhaité. il arrive même que deux checkbox aiant le même nom et donc ça plante.

Si quelqu'un peut m'aider je le remercie d'avance.

Bonne journée

Rémi
 

Pierrot93

XLDnaute Barbatruc
Re : crétion dynamique bouton VBA

Bonjour Rémi

pas sur d'avoir tout compris, mais regarde peut être le code ci dessous, à placer dans le module de la feuille concerné, créé des "checkbox" au changement de sélection :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim c As OLEObject
Set c = Me.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=Target.Left, Top:=Target.Top, Width:=Target.Width, Height:=Target.Height)
With c
.Name = Target.Address(0, 0) & "xx"
.Object.Value = True
End With
End Sub

ensuite pour faire référence à l'objet, tu utilises la variable, comme par exemple :

Code:
c.Select

A priori dans ton code tu figeais le nom de l'objet(xxxxx), alors que celui ci doit être unique.

bonne fin d'après midi
@+
 

remi5485

XLDnaute Nouveau
Re : crétion dynamique bouton VBA

oui tu as toute a fait raison c'est d'ailleurs ce que je faisais au départ.

Mais j'ai en fait été amené à ce problème car j'avais l'impression que la construction n'était pas stable. Je m'explique.

Quand je lance ma macro cela construit les checkbox et les combobox par contre si je relance la meme macro théoriquement je fais appel à une fonction qui supprime tous les boutons commençant par checkbox et combobox puis je reconstruis les boutons.

Alors ça marche mais le problème c'est que des fois les check box on des noms bizarres d'où la non stabilité. Je te mets le code en ligne et ce que tu pourrais me dire si tu y vois des anomalies.
Merci par avance

Private Sub Worksheet_checkbox(ByVal Target As Range)
Dim c As OLEObject
Set c = Me.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=Target.Left, Top:=Target.Top, Width:=Target.Width, Height:=Target.Height)
With c
.name = "CheckBox_" & Target.Address(0, 0)
.Object.Value = True
End With
End Sub

Private Sub Worksheet_combobox(ByVal Target As Range)
Dim c As OLEObject
Set c = Me.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=Target.Left, Top:=Target.Top, Width:=Target.Width, Height:=Target.Height)
With c
.name = "ComboBox_" & Target.Address(0, 0)
End With
End Sub

Private Sub CommandButton4_Click()
Supprimer_Bouton
For i = 1 To 5
Set Target = ActiveSheet.Range("C" & 10 + i)
Worksheet_checkbox (Target)

Set Target = ActiveSheet.Range("D" & 10 + i)
Worksheet_combobox (Target)
Next
End Sub

Sub Supprimer_Bouton()
Dim Obj As OLEObject

For Each Obj In ActiveSheet.OLEObjects
If Mid(Obj.name, 1, 8) = "ComboBox" Or Mid(Obj.name, 1, 8) = "CheckBox" Then
Obj.Delete
End If
Next Obj
End Sub
 

Pierrot93

XLDnaute Barbatruc
Re : crétion dynamique bouton VBA

Re,

je ne comprends pas trop tes déclarations de procédures, cela correspond à quoi ???

Code:
Private Sub Worksheet_checkbox(ByVal Target As Range)

Sinon mets peut être un petit fichier exemple en pièce jointe, sans données confidentielles, mais reproduisant le cas.

@+
 

Pierrot93

XLDnaute Barbatruc
Re : crétion dynamique bouton VBA

Re,

bon, problème avec le passage d'argument... le code ci dessous à priori fonctionne... a voir si cela peut te convenir :

Code:
Option Explicit
Private Sub CommandButton4_Click()
Dim i As Byte, c As OLEObject
Supprimer_Bouton
For i = 1 To 5
    With ActiveSheet.Range("C" & 10 + i)
        Set c = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
        c.Name = "CheckBox_" & .Value & i
    End With
    With ActiveSheet.Range("D" & 10 + i)
        Set c = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
        c.Name = "ComboBox" & .Value & i
    End With
Next
End Sub
Sub Supprimer_Bouton()
Dim Obj As OLEObject
For Each Obj In ActiveSheet.OLEObjects
If Obj.Name Like "ComboBox*" Or Obj.Name Like "CheckBox*" Then
Obj.Delete
End If
Next Obj
End Sub
 

remi5485

XLDnaute Nouveau
Re : crétion dynamique bouton VBA

salut pierrot
Tout d'abord je te remercie d'avoir prêté attention à mon problème.

J'ai bien compris ton code qui est en fait ce que j'avais fait auparavant mais j'avoue que c'est mieux écrit et plus condensé.

Cependant ça n'a pas résolu mon erreur.

Dans certains cas les boutons ne prennent pas les bons noms ce qui est problématique pour moi vu que pour chaque bouton, du code à été associé dynamiquement dans le codeModule de la feuille Excel. Si ces boutons n'ont pas les noms voulu, les évènements (dû à un click sur un checkbox par exemple) ne seront pas déclenché. J'ai trouvé le problème mais je n'ai pas la solution:


J'ai un bouton qui permet de génerer les boutons avec ce code:
Private Sub Générer_Bouton()

Dim bi As Byte, c As OLEObject
Dim by_end As Byte
Dim combo As ComboBox
Supprimer_Bouton
by_end = Cells(13, 1)
For bi = 1 To by_end
With ActiveSheet.Range("C" & 10 + bi)
Set c = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
c.name = "CheckBox" & bi
End With
With ActiveSheet.Range("D" & 10 + bi)
Set c = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
'Set combo = c.Object
c.name = "ComboBox" & bi
End With
Next
End Sub

Lors de la première génération des boutons, c'est vrai que ça a l'air de marcher. Par contre si on rappuie directement sur le bouton( la plupart du temps) les boutons n'ont plus le bon nom. Pourtant dans cette fonction il y a bien la fonction supprimer_bouton.

J'ai alors essayer de créer un nouveau bouton supprimer bouton que je lance avant d'appuyer sur le bouton Générer bouton. Ce bouton Suprimer reprend exactement la fonction Supprimer_Bouton.

Lorsque que j'appuie sur supprimer_Bouton puis sur GGénérer_Bouton tout marche a chaque fois alors que lorsque j'appuie juste sur Générer_bouton ça plante.

J'essaye d etre le plus clair possible.

Si tu as une idée Fais moi signe.

Merci par avance
 

Pierrot93

XLDnaute Barbatruc
Re : crétion dynamique bouton VBA

Bonjour Rémi

regarde le fichier joint, j'ai utilisé ton code original en changeant le nom des objets.

J'ai eus un peu de mal, cela me faisait planté Excel, et je comprenais pas trop pourquoi... Je pense, mais pas certain, que cela venait du fait que la référence "Microsoft Forms 2.0 Object Library" n'était pas activée au lancement de la procédure. En activant cette référence, ca à l'air de fonctionner chez moi, même plusieurs fois de suite, sans problème (Excel2003).

Pour activer la référence, dans l'éditeur vba => barre de men= => outils => référence.

Testes et adaptes à ton projet, et dis moi si cela convient.

Bon après midi
@+
 

Pièces jointes

  • classeur1.zip
    18.6 KB · Affichages: 138
  • classeur1.zip
    18.6 KB · Affichages: 137
  • classeur1.zip
    18.6 KB · Affichages: 129

remi5485

XLDnaute Nouveau
Re : crétion dynamique bouton VBA

oui bien sur je l'ai testé et adapté à mon problème. J'ai trouvé comment le faire planter mais je ne comprends pas pourquoi.
Tu appui sur le bouton
tu double clique sur checkbox 1 par exemple => ça va t amener dans VBE
tu ne fais rien. Tu retourne dans ton classeur. Tu appui sur le bouton_commande(OK ca marche)
Tu rappui sur une autre checkbox => ça va t amener dans VBE.
(encore)tu ne fais rien. Tu retourne dans ton classeur. Tu appui sur le bouton(OK ca marche)

Si tu vas dans VBE tu supprime tout les fonctions attaché au bouton(checkbox1_Click(),CheckBox2_Click())

Si tu appui sur le bouton_commande Boum c fini les checkbox sont mal initialisé

C très bizare ce qui m amène a penser que la création dynamique est loin d être stable et que beaucoup de choses se passe derrière.
 

Pièces jointes

  • classeur1.xls
    42 KB · Affichages: 138
  • classeur1.xls
    42 KB · Affichages: 144
  • classeur1.xls
    42 KB · Affichages: 142

Pierrot93

XLDnaute Barbatruc
Re : crétion dynamique bouton VBA

Re,

si tu double click sur un objet, et que cela t'amènes dans l'éditeur vba, c'est que tu dois être en mode création. Un click sur l'equerre bleu de la barre d'outils visual basic te permets de désactiver ce mode.

Dans ce cas c'est normal, la procédure lié à l'événement par défaut de l'objet se créée (Private Sub CheckBox1_Click()). Je pense que le plantage qui suit est lié à cet événement lors de la re création de l'objet. Maintenant ce n'est pas non plus une certitude.

Je viens de tester ton fichier, mode création désactivé, sans procédure "Private Sub CheckBox1_Click" dans le module et il me plante excel au 3ème déclenchement.... Alors que le mien fonctionne... Vois pas d'où cela peut venir, quelque chose doit m'échapper...

@+
 

Pierrot93

XLDnaute Barbatruc
Re : crétion dynamique bouton VBA

Re

si tu double click sur un objet, et que cela t'amènes dans l'éditeur vba, c'est que tu dois être en mode création. Un click sur l'equerre bleu de la barre d'outils visual basic te permets de désactiver ce mode.

Dans ce cas c'est normal, la procédure lié à l'événement par défaut de l'objet se créée (Private Sub CheckBox1_Click()). Je pense que le plantage qui suit est lié à cet événement lors de la re création de l'objet. Maintenant ce n'est pas non plus une certitude.

Je viens de tester ton fichier, mode création désactivé, sans procédure "Private Sub CheckBox1_Click" dans le module et il me plante excel au 3ème déclenchement.... Alors que le mien fonctionne... Vois pas d'où cela peut venir, quelque chose doit m'échapper... Pas de solution sur ce coup la.

Bonne fin d'après midi
@+

Edition : aarf j'ai doublé l'envoi du post....
 

Statistiques des forums

Discussions
312 392
Messages
2 088 004
Membres
103 693
dernier inscrit
vincs