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 :

Création dynamique de combobox -> j'en perds ma variable ! [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Points : 0
    Points
    0
    Par défaut Création dynamique de combobox -> j'en perds ma variable !
    Bonjour,

    Il y a quelques temps sur un autre topic (hier en fait) j'ai exposé un soucis de destruction d'objet. Le soucis est similaire : tout marche bien, je clique sur mes boutons, les attributs ont les bonnes valeurs...

    Je dé-passive ma création de combobox et c'est le drame.

    Le bouton 1 affiche bien les valeurs des attributs (dans un MsgBox)
    mais le bouton 2 me sort du "" (i.e null).

    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
    Dim CBox As OLEObject
     
     
    Do While (i_feuille < Sheets.Count + 1)
     
            If (Sheets(i_feuille).Name <> "MENU" And Sheets(i_feuille).Name <> "Courbes") Then
                Worksheets("MENU").Range("D" & i_ligne) = Sheets(i_feuille).Name
                Worksheets("MENU").Range("E" & i_ligne) = "n"
     
                'Set CBox = Sheets(1).OLEObjects.Add(ClassType:="Forms.Combobox.1", Link:=False, DisplayAsIcon:=False, Left:=Worksheets("MENU").Range("F" & i_ligne).Left, Top:=Worksheets("MENU").Range("F" & i_ligne).Top, Width:=Worksheets("MENU").Range("F" & i_ligne).Width, Height:=Worksheets("MENU").Range("F" & i_ligne).Height)
                'CBox.Name = Sheets(i_feuille).Name
     
     
     
                'Dim Template_control As Object
                'Set Template_control = ActiveSheet.OLEObjects.Add(ClassType:="Forms.Combobox.1", Link:=False, DisplayAsIcon:=False, Left:=Worksheets("MENU").Range("F" & i_ligne).Left, Top:=Worksheets("MENU").Range("F" & i_ligne).Top, Width:=Worksheets("MENU").Range("F" & i_ligne).Width, Height:=Worksheets("MENU").Range("F" & i_ligne).Height)
                'ActiveSheet.OLEObjects(ActiveSheet.OLEObjects.Count).Name = Sheets(i_feuille).Name '
     
     
     
     
                Dim i_fichier As Single
                i_fichier = 1
     
                Do While i_fichier <= Actual_ListFichier.Count
                '    ActiveSheet.OLEObjects(ActiveSheet.OLEObjects.Count).Object.AddItem Actual_ListFichier.Item(i_fichier)
                    i_fichier = i_fichier + 1
                Loop
     
     
     
                i_ligne = i_ligne + 1
            End If
     
            i_feuille = i_feuille + 1
        Loop
    Je n'ai pas représenté les boutons. Mais ceux ci font appel aux
    attributs public (des strings) du module qui contient le code ci-dessus.


    Comment feriez vous pour garder vos valeurs dans vos attributs ET créer/effacer dynamiquement vos combobox ? (grosso modo est-ce
    un problème de nom et de pointeurs ?)

  2. #2
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Citation Envoyé par Julien12 Voir le message
    Je n'ai pas représenté les boutons. Mais ceux ci font appel aux attributs public (des strings) du module qui contient le code ci-dessus.

    Et ils sont où ces "attributs" ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Points : 0
    Points
    0
    Par défaut
    Je n'ai copié que la partie du code qui déconne (et ça m'a demandé
    pas mal de tests pour l'identifier). Je ferais une copie plus exhaustive
    mardi matin

    mais grosso modo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public mavar As string 
     
    sub bouton_A()
    mavar = "toto"
    msgbox mavar
    end sub
     
    sub bouton_B()
    ...voir la partie en balise dans les posts precédents...
    msgbox mavar
    end sub
    En mettant l'espion VBE ça me confirme bien le truc.
    Si j’appuie sur A j'ai bien toto qui s'affiche. Quand
    j'appuie sur B mavar passe à "".

    Si je passive les élements relatifs aux OLEObjects dans mon
    sub bouton_B() y'a plus de soucis. Mavar reste à "toto" sauf
    que mes beaux combobox dynamique ne sont plus créés pour
    le coup (car passivés)

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    bonsoir,

    il vas falloir que tu poste le code exact de tes deux boutons ainsi que tu nous dise ou est comment tu déclare ta variable ..

    pense aussi à rajouter la ligne Option Explicit en haut de toutes tes pages de codes ..

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Points : 0
    Points
    0
    Par défaut
    J'ai reproduit mon probleme sur classeur test voila ce que ça
    donne :

    Feuille 1 : deux boutons A et B appellant les procédures qui vont bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
     
    Sub bouton_A()
        Module1.sub_A
        MsgBox Module1.mavar
    End Sub
     
    Sub bouton_B()
        Module1.sub_B
        MsgBox Module1.mavar
    End Sub

    Module 1 :
    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
    Public mavar As String
     
    Sub sub_A()
        Module1.mavar = "toto"
     
        For i = 1 To 4
            Dim myObj As OLEObject
            Set myObj = Sheets(1).OLEObjects.Add(ClassType:="Forms.Combobox.1", Link:=False, DisplayAsIcon:=False, Left:=20, Top:=(20 + i * 20), Width:=40, Height:=20)
            myObj.Name = "cb_" & i
        Next
     
        'MsgBox Module1.mavar
    End Sub
     
    Sub sub_B()
     
        'MsgBox Module1.mavar
     
    End Sub


    Un appui sur A me créer mes combbox et m'affiche toto.
    Un appui sur B m'affiche "" (null)

    Pourtant mavar est publique...

  6. #6
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Pour tes boutons, tu as utilisé un contrôle ActiveX ou un contrôle de formulaire ? (Je penche pour le deuxième cas vu qu'il n'y a pas le _click dans tes procédures.)

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Points : 0
    Points
    0
    Par défaut
    Controles formulaires effectivement.

    L'idée étant, à terme, de pouvoir faire un nettoyage (remove) de
    tout mes OLEObjects (i.e. toutes mes combo box) et ensuite un
    ajout dynamique afin de reinitialisé le tout.

    Tu penses que ce serait un problème entre les OLE et les controles
    formulaires ?

  8. #8
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Non, en fait, j'ai fait des tests de mon coté, puis quelques recherches. Et c'est un bug connu d'Excel. On perd les variables globales quand on touche aux OLEObjects dans le code. Et ce même si tu assignes ces variables globales après le OLEObjects.Add.
    Malheureusement, je ne vois pas de solution. Par contre, as-tu vraiment besoin de les enlever et les remettre à chaque fois ? Un clear ne suffit pas ? Avec éventuellement la précision visible ou pas.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Points : 0
    Points
    0
    Par défaut
    Merci de ta réponse.

    J'ai finalement contourné le problème : une listebox et un event sur le doubleclick me permet de remplir des cellules vides avec les valeurs que je veux. C'est...moins classe et moins propre mais bon ça à le mérite de pallier au soucis.

    Je vais me mettre en chasse de tes sources pour les OLE, histoire d'être moins bête ce soir. Si tu as toujours les URL sous la main, fais signe.


    Par contre...je passe le sujet en résolu ? ou en abandonné ? :/

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 29/09/2019, 14h54
  2. Création d'une combobox dynamique
    Par lou87 dans le forum ASP
    Réponses: 1
    Dernier message: 14/01/2011, 20h32
  3. Création d'un combobox dynamiquement
    Par namstou3 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 11/03/2008, 12h40
  4. TWebBrowser et création dynamique
    Par BakaOnigiri dans le forum Web & réseau
    Réponses: 2
    Dernier message: 01/09/2002, 10h53
  5. Création dynamique de TImages
    Par Dric dans le forum C++Builder
    Réponses: 10
    Dernier message: 08/07/2002, 12h36

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