Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 VBA - Comment intercepter un évènement sur un Control Active X créé dynamiquement

Dudu2

XLDnaute Barbatruc
Bonjour,

Je créé dynamiquement une ComboBox (code ci-dessous)
Je voudrais intercepter un ComboBox_Click().

Faut que je créé un classe ?

VB:
Sub a()
    Dim OLEObj As OLEObject
    Dim ComboBox As msforms.ComboBox
   
    Set OLEObj = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
                                            DisplayAsIcon:=False, Left:=700, Top:=100, Width:=328, Height:=16)
    Set ComboBox = ActiveSheet.ComboBox1
End Sub
 
Solution
Bonsoir.
En tout cas il faut que la ComboBox soit globale et WithEvents dans le module objet qui prend en charge l'évènement. Un module de classe serait utile s'il y en a plusieurs.
Si leurs listes doivent être construite automatiquement d'après différentes colonnes d'un même tableau je vous conseille d'utiliser ma classe ComboBoxLiées, elle s'occupe aussi de toute la gestion des choix, et renvoie à son détenteur le ou les numéros de lignes concernés via des évènements.

Dranreb

XLDnaute Barbatruc
Bonsoir.
En tout cas il faut que la ComboBox soit globale et WithEvents dans le module objet qui prend en charge l'évènement. Un module de classe serait utile s'il y en a plusieurs.
Si leurs listes doivent être construite automatiquement d'après différentes colonnes d'un même tableau je vous conseille d'utiliser ma classe ComboBoxLiées, elle s'occupe aussi de toute la gestion des choix, et renvoie à son détenteur le ou les numéros de lignes concernés via des évènements.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Merci @Dranreb.
J'ai finalement fait une petite classe.

Module1
VB:
Private ComboBoxEvents As Classe_ComboBoxEvents

Sub a()
    Dim OLEObj As OLEObject
    Dim ComboBox As MSForms.ComboBox
  
    'Create ActiveX ComboBox
    Set OLEObj = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, _
                                            DisplayAsIcon:=False, Left:=700, Top:=100, Width:=328, Height:=16)
    Set ComboBox = ActiveSheet.ComboBox1
  
    Set ComboBoxEvents = New Classe_ComboBoxEvents
    Set ComboBoxEvents.ComboBox = ComboBox
End Sub

Classe_ComboBoxEvents
VB:
Public WithEvents ComboBox As MSForms.ComboBox
Private Sub ComboBox_click()
    Call MultiColumnComboBox_Click(ComboBox)
End Sub
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Ce que je ne sais pas faire avec ces Active X tordus (entre les Shape, les Object, les OLEObject), c'est assigner la ComboBox créé.
Je fais:
Set ComboBox = ActiveSheet.ComboBox1
Mais c'est juste pas bon car je présuppose ComboBox1
 

Dudu2

XLDnaute Barbatruc
Parce que je n'ai pas affecté l'OLEObj.Object dans une vrai ComboBox (ou ListBox).
Je suis passé par une variable Object qui fonctionnait avant mais qui foire le truc maintenant.
Je pense que dans l'assignation Set ComboBox = OLEObj.Object il se passe des trucs !
 

Dudu2

XLDnaute Barbatruc
Il faut bien passer d'abord par le vrai Control:
Set ListBox = OLEObj.Object
Set ComboBox = OLEObj.Object

Avant de pouvoir généraliser avec un Variant ControlBox:
Set ControlBox = ListBox
Set ControlBox = ComboBox

Et là le ControlBox.Parent passe bien.

En affectation directe ça ne passe pas:
Set ControlBox = OLEObj.Object
Il n'a pas toutes les billes et le ControlBox.Parent plante
 

Dudu2

XLDnaute Barbatruc
Et maintenant je rame sur autre chose.
Je créé une Label ActiveX
VB:
Dim Label As Variant

Set Label = ActiveSheet.OLEObjects.Add(ClassType:="Forms.Label.1", Link:=False, DisplayAsIcon:=False, _
                                       Left:=0, Top:=0, Width:=0, Height:=0)
ll faut que je lui donne un nom et que je le retrouve ultérieurement pour en valoriser le .Caption

En UserForm c'est simple mais en Active X...
 

Staple1600

XLDnaute Barbatruc
Bonsoir

@Dudu2
Comme ceci ?
VB:
Sub test()
Dim Label As OLEObject

Set Label = ActiveSheet.OLEObjects.Add(ClassType:="Forms.Label.1", Link:=False, DisplayAsIcon:=False, _
                                       Left:=0, Top:=0, Width:=0, Height:=0)
Label.Name = "toto"
End Sub
ou comme cela
Code:
Sub testB()
With ActiveSheet.OLEObjects.Add("Forms.Label.1", , , 0, 0, 0, 0)
.Name = "toto"
End With
End Sub
 

Discussions similaires

Réponses
16
Affichages
2 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…