IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème de scope lors de la création d'une Combobox ActiveX [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut Problème de scope lors de la création d'une Combobox ActiveX
    Bonjour,

    Voici le contexte de mon travail:

    J'aimerais utiliser une combo à plusieurs colonnes et plus agréable à utiliser pour sélectionner une valeur de cellule parmi un très grand nombre de valeur (plusieurs centaine).

    Pour cela, je crée une combobox ActiveX dans une fonction et je l'assigne à un objet de classe local qui doit gérer le changement de valeur et cacher la combo une fois que l'utilisateur aura sélectionné la valeur.

    Mon problème:

    Si je créer l'objet ActiveX et l'assigne à mon objet de classe dans la même fonction, alors ma classe est automatiquement détruite à la fin de la fonction, comme si j'avais une variable de scope local... Si je créer l'ActiveX dans une fonction et l'assigne dans une autre (par exemple avec 2 macro boutons), alors tout se passe correctement.

    J'ai aussi un problème avec le debugger car je ne peux plus entrer en mode debuggage dans la fonction dès que l'objet ActiveX a été créé (message "Impossible d'entrer en mode arrêt maintenant").

    Mon code:

    J'arrive à reproduire le problème avec ce code:

    1) Mon module de classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    Option Explicit
    Option Base 1
     
    ' Global objects
    Private WithEvents gMSCombo As MSForms.Combobox ' OLEObject
     
    ' Create combo object
    Public Sub Class_Initialize()
     
        Debug.Print "claSelectionCombo::Class_Initialize"
     
    End Sub
     
    Public Property Let Object(combo As MSForms.Combobox)
     
        Set gMSCombo = combo
     
    End Property
     
     
    Public Property Get value() As String
     
        value = gMSCombo.value
     
    End Property
     
    Public Property Let value(newValue As String)
     
        gMSCombo.value = newValue
     
    End Property
     
    ' Delete combo object
    Public Sub Class_Terminate()
     
        Debug.Print "claSelectionCombo::Class_Terminate"
     
    End Sub

    2) Mon module:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Option Explicit
    Option Base 1
    
    
    ' Objects global to module
    Private gSelectCombo As claSelectionCombo
    
    
    Sub Bouton1_Cliquer()
        Dim obj As MSForms.Combobox
        Set obj = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", _
                                Link:=False, _
                                DisplayAsIcon:=False).Object
        
        ' Problème dès que j'insère ces deux lignes:
        Set gSelectCombo = New claSelectionCombo
        gSelectCombo.Object = obj
        
    End Sub
    
    Sub Bouton2_Cliquer()
    
        Dim value As String
        Dim obj As MSForms.Combobox
        
        If (gSelectCombo Is Nothing) Then
            Debug.Print "Create class object"
            Set gSelectCombo = New claSelectionCombo
            Set obj = ActiveSheet.OLEObjects(1).Object
            gSelectCombo.Object = obj
        Else
            Debug.Print "Use existing class object"
        End If
    
        value = gSelectCombo.value
        
        Debug.Print "Value is: " & value
        MsgBox "Value is: " & value
        
    End Sub
    Si je mets les deux lignes indiquées dans le Bouton1, j'obtiens la sortie suivante sur la console:
    claSelectionCombo::Class_Initialize
    claSelectionCombo::Class_Terminate
    Et un click sur le Bouton2 nécessite de réinitialiser ma classe (message "Create class object")

    Savez-vous pourquoi j'ai ce comportement?
    Comment puis-je assigner directement un objet ActiveX nouvellement créé à ma classe?

    Par ailleurs, j'ai cherché de la documentation de référence sur les combobox ActiveX (pour connaître les événements observables, les propriétés, etc.) mais je n'ai pas trouvé sur le site de Microsoft (j'ai trouvé cette référence https://msdn.microsoft.com/en-us/lib.../ff840691.aspx mais elle n'indique pas les mêmes méthode que dans l'editeur VBA...). Savez-vous où je peux trouver de la documentation?

    Merci par avance pour votre aide :-)

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    Bonjour
    regarde dans les contribution l'effet mouse overin et regarde comment j'ajoute des controls button dans ma classe bouton

    mais je comprend pas bien ce que tu cherche a faire avec tes combo dans le sheets
    il y a peu être un moyen moins lourd d'avoir des liste de choix dynamique pour chaque cellule ou ligne
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Bonjour,

    J'ai cherché dans tes contributions (notamment nouveau effet mouse in out sur les boutons dans un userform sans les apis et fonction mouse over et mouse out pour les boutons de vos userforms) mais je n'ai pas trouvé de création dynamique de bouton: dans tes exemples, tu parcours à chaque fois les objets existant mais tu ne le crées pas.

    J'ai essayé d'utiliser les listes de validations des données mais ça montre une toute petite fenêtre et on ne peut pas commencer à taper la valeur à chercher... Donc je me suis orienté vers une méthode plus agréable pour sélectionner une valeur parmi plus de 800 et pour l'instant je n'ai pas trouvé autre chose. Mais je suis à l'écoute si tu as des idées

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    @ Patrick Seuret

    Pourriez-vous construire un classeur simple de ce que vous voulez obtenir (data à prendre en compte, résultat souhaité, cellule(s) où cela doit s'inscrire) car je n'ai pas trop compris votre demande.
    La création dynamique de ComboBox (ou autre contrôle) est possible sur une feuille en tant qu'OleObject.

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    si les liste de validation ne te conviennent pas j'opterais plutôt vers une commandebarpopup perso avec un listbox a l'interieur et un edit pour taper un indice de recherche
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Bonjour PMO2017,

    Désolé, j'aurais dû le faire tout de suite... Voici mon fichier minimum pour reproduire le problème:

    POC Combobox.xlsm

    Fonctionnement attendu:
    1) Lorsque je clique sur le bouton "Créer": une combobox apparaît avec le contenu "Toto" (sur la cellule actuellement sélectionnée). Cette combo est sauvée dans la variable "gSelectCombo" du module
    2) Lorsque je clique sur le bouton "Valeur": la valeur de la combo box est affiché.

    Fonctionnement réel:
    1) La combobox apparaît bien avec le texte "Toto". Par contre, l'objet global "gSelectCombo" est immédiatement détruit (affichage de "claSelectionCombo::Class_Terminate" dans la console)
    2) L'objet de classe gSelectCombo n'est plus valide (égal à Nothing)...

    En fait, c'est comme si l'événement "Cliquer()" du bouton "Créer" était exécuté dans un scope différent et "rendait" l'objet à la fin... D'ailleurs, j'ai testé: si on ajoute un appel à "Bouton1_Cliquer" au début de "Bouton2_Cliquer()", alors la méthode est correctement exécutée mais l'objet est aussi détruit à la fin... Je ne me l'explique pas.

    Merci pour votre aide!
    Patrick

    @patricktoulon:

    Oui, je peux aussi créer un objet cacher et ne le montrer que quand j'en ai besoin, mais là il y a un truc que je ne comprends pas et je sens que cela va m'embêter pour d'autres choses et j'aimerais bien comprendre avant de chercher un workaround

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème d'encodage lors de la création d'une base
    Par thor76160 dans le forum PostgreSQL
    Réponses: 22
    Dernier message: 04/03/2011, 15h04
  2. problème d'encodage lors de la création d'une base
    Par thor76160 dans le forum PostgreSQL
    Réponses: 11
    Dernier message: 29/01/2010, 19h47
  3. Réponses: 11
    Dernier message: 05/08/2009, 12h30
  4. Problème de charset lors de la création d'une instance 8i
    Par girint dans le forum Administration
    Réponses: 2
    Dernier message: 15/06/2007, 13h50
  5. Réponses: 8
    Dernier message: 06/06/2007, 17h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo