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 :

Valeur d'un controle dynamique (OPTBUTTON) et Supprimer controle associé à un objet [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Points : 220
    Points
    220
    Par défaut Valeur d'un controle dynamique (OPTBUTTON) et Supprimer controle associé à un objet
    Bonjour a tous,

    Après avoir réussi mon code en "séquentiel", je tente de le refaire en partant de 0 mais en programmant en objet.

    Alors en tant que débutant, j'ai déjà un problème, je veux créer une classe graphe qui a :

    • une variable fichier de type string qui permettra d'importer le fichier csv associé.
    • une méthode qui créer un listbox et l'insérer


    Alors voici ce que j'ai commencer à faire:

    J'ai créer un Module de classe nommé graphe qui contient:
    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
     
    Public Nom As String
    Public PositionHaut As Boolean
     
    Sub UHF_VHF()
     
    Dim Obj As Control
     
    Set Obj = IHM.Controls.Add("forms.Checkbox.1")
     
    With Obj
        .Name = "CheckBoxHaut"
        .Object.Caption = Nom
        .Left = 642
        .Top = 36
        .Width = 114
        .Height = 18
    End With
     
    End Sub
    Dans mon Userform:
    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
    Private Sub ComboBox1_Change()
     
    Dim GrapheHaut As New cGraphe
     
    Select Case IHM.ComboBox1.Value
     
        Case "graphe1":
            With GrapheHaut
                .Nom = "graphe1"
                .PositionHaut = True
                .UHF_VHF
            End With
     
        Case "graphe2":
            With GrapheHaut
                .Nom = "graphe2"
                .PositionHaut = True
            End With
     
    End Select
     
    End Sub
     
    Private Sub CommandButton1_Click()
     
    If CheckBoxHaut = True Then
        MsgBox "case cochée"
    Else
        MsgBox "case NON cochée"
    End If
     
    End Sub
    Cependant meme si je coche la case rien toujours vu comme non coché!

    De plus je voudrais supprimer un élément ainsi que tous ses controles associé comment faire?



    Merci pour votre aide et si vous connaissez un bon tuto pour coder en objet en vba n'hésitez pas je cherche partout je lis tout ce que je trouve

    Bastien

  2. #2
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 272
    Points
    11 272

  3. #3
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Une petite recherche sur l'ami google
    http://silkyroad.developpez.com/VBA/...icEditor/#LV-A
    ++
    Qwaz

  4. #4
    Membre actif Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Points : 220
    Points
    220
    Par défaut
    Merci Qwazerty pour le liens mais c'est pile ce que j'ai suivi en enlevant la classe et la méthode car pour moi je ne veux pas les envent, juste les valeurs et même avec sa marche pas

  5. #5
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Ok, j'avais pas vu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Me.Controls("CheckBoxHaut").value Then
        MsgBox "case cochée"
    Else
        MsgBox "case NON cochée"
    End If
    Essai comme ça.
    Pour comprendre, rajoute "Option Explicit" au début de ton module. Ça te force a déclarer tes variables. Vu qu'au lancement CheckBoxHaut n'existe pas, il faut faire appel a lui par controls(...).

    ++
    Qwaz

  6. #6
    Membre actif Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Points : 220
    Points
    220
    Par défaut
    Merci beaucoup Qwaz je test cela

    Juste si je peux abuser, tu saurais comment faire si je crée une classe qui crée plusieurs controle dynamique lorsque j'efface un objet de cette classe pour effacer tous les controles associé?

  7. #7
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Je dirais que dans le Terminate de ta class, tu détruis te composant en faisant un truc comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserForm.Controls.Remove("NomDuControl")
    A tester

    Si tu crées une boucle (collection ou itération de Controls), ce qui est probable, attention de bien parcourir la liste à l'inverse, en partant du dernier contrôle.

    ++
    Qwaz

  8. #8
    Membre actif Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Points : 220
    Points
    220
    Par défaut
    Merci pour le code

    Par contre niveau conception ca serait top si il y avait un moyen de connaitre quel controle à été créer avec un Objet
    pour être plus claire:

    j'ai une classe Design dont je crée un objet associé comme ceci:



    et ma classe Design possède une méthode DisplayControl


    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
    Private Sub DisplayControl()
     
    If ChoiceFreq = True Then
     
        Dim OptUHF As Control
        Dim OptVHF As Control
     
        Set OptUHF = IHM.Controls.Add("forms.OptionButton.1")
        Set OptVHF = IHM.Controls.Add("forms.OptionButton.1")
     
        With OptUHF
            .Name = "OptUHF"
            .Object.Caption = "UHF"
            .Left = 576
            .Top = 24
            .Width = 63
            .Height = 23
        End With
     
        With OptVHF
            .Name = "OptVHF"
            .Object.Caption = "VHF"
            .Left = 648
            .Top = 24
            .Width = 63
            .Height = 23
        End With
    End If
     
    End Sub
    en gros si j'ai bien compris en supprimant mon objet Design comme ceci:
    Cependant tous mes controles reste ...
    En gros je voudrais au moment ou je supprime l'objet design savoir combien de control on été créer et les supprimer mais seulement ceux qui sont issu de Design1


    Merci de votre aide

    N'hésitez pas si vous voyez des truc pas très bien optimiser VBA ou objet dans mon code car je débute l'objet je ne fais que du C pour les micro procc

  9. #9
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut

    Lorsque tu fais
    cela déclenche l’évènement Terminate de ta class Design1.
    Il te suffit donc d’implémenter ici la destruction de tes composants comme je te l'ai montré sur mon message précédent.

    En gros je voudrais au moment ou je supprime l'objet design savoir combien de control on été créer et les supprimer mais seulement ceux qui sont issu de Design1
    Etant donné la structure de ton code, en particulier ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        With OptUHF
            .Name = "OptUHF"
            .....
    Tu ne peux créer qu'un seul composant bouton et tu ne peux générer qu'une seule instance de ta class. En effet il n'est pas possible d'avoir 2 composants ayant le même nom. Donc soit tu laisses vba choisir un nom pour toi, soit tu fais en sorte de généré un nom unique.

    Le code de ta class manque de flexibilité, regarde la position de tes boutons, elle est figé dans le marbre, ainsi ta class (toutes les instances de ta class) placeront le(s) bouton(s) au même endroit (une fois le problème du nom résolu bien sur ). Tu perd ainsi tout l'interet d'une classe.

    Un conseil, relis bien les tutos cités plus haut, plutôt que de déclarer tes variables, défini plutôt des propriétés Set/Let/Get. L'avantage, c'est par exemple, au lieu de renseigner Nom puis de lancer DisplayControl, autant Executer DisplayControl directement quand l'utilisateur renseigne Nom (c'est un exemple, peut être pas forcement applicable tel quel). Tu pourrais aussi mettre des paramètre à DisplayControle(Nom, Left,Top,...)

    Avant de te lancer dans le codage de ta classe, commence par définir ce que tu veux faire et ce qu'elle doit réaliser.

    ++
    Qwaz

  10. #10
    Membre actif Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Points : 220
    Points
    220
    Par défaut
    Je te remercie beaucoup tu m’éclaircis pas mal la

    Pour ce qui est de générer plusieurs controle, je suis en train de me servir d'un tableau.

    Un conseil, relis bien les tutos cités plus haut, plutôt que de déclarer tes variables, défini plutôt des propriétés Set/Let/Get.
    Je connais un peu ces fonctions dans le peu de java que j'ai fais mais pourrais tu en 2 mots me dire la différente entre un:

    et
    dans la logique

    ? Merci d'avance je vais bachoté un peu plus les liens car je n'avais pas vus d'intérêt encore a mon cas des Set Get mais réflexion faite a voir

    Merci en tout cas

    Bonne soirée

  11. #11
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut

    Pour les Get, ils te permettent de mettre des propriétés en lecture seule.

    ++
    Qwaz

  12. #12
    Membre actif Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Points : 220
    Points
    220
    Par défaut
    Bonjour,

    Je décoche le résolu, car après avoir voulu m'approprier un peu plus le code vu les liens, j'ai un problème avec l'évènement Change().

    En effet, lors de la création de mon élément, je rentre dans Change() donc tout va bien puisque je lui force un index.
    Cependant un fois l'interface lancée, j'ai beau changé la valeur RIEN je ne rentre plus dedans...

    Si vous voyez ce que c'est...

    Méthode Comboboxdynamic

    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
    Public Collect As New Collection    'Collection de combobox qui permettent le choix du graphe à afficher.
     
    Public Sub AddCombo()
     
    'Déclaration
    Dim Obj As Control
    Dim C1 As cComboBoxDynamic
    Dim i As Integer
    Dim j As Integer
     
    'Création de l'objet de type Combobox
    Set Obj = IHM.Controls.Add("forms.Combobox.1")
     
    'Paramètrage du contrôle
    With Obj
        .Name = "ComboBox" & Collect.Count
        .Left = 264
        .Top = 12 + 300 * Collect.Count
        .Width = 198
        .Height = 18
    End With
     
    'Indique la classe pour donner l'accès au combobox dynamique à ses évenements ainsi que l'ajout dans la classe.
    Set C1 = New cComboBoxDynamic
    Set C1.ComboB = Obj
    Collect.Add C1
     
    'Ajoute les différents numéros de graphe dans les choix possible du combobox
    For j = 1 To 7
        IHM.Controls("ComboBox" & Collect.Count-1).AddItem "Graphe" & j
    Next j
    IHM.Controls("ComboBox" & Collect.Count-1).ListIndex = 0
     
    End Sub
    Classe cComboBoxDynamic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'Classe ComboBoxDynamic
    'Cette classe permet d'avoir accès aux évènements excel traditionnels à partir d'un combobox créé dynamiquement.
    Public WithEvents ComboB As MSForms.ComboBox
     
    'Méthode Change qui est exécuté à chaque changement de valeur du combobox
    Private Sub ComboB_Change()
     
    FactoryGraph.Create ComboB.ListIndex + 1, ComboB.Name '
     
    End Sub
    Voila pour créer un combo, je fais juste AddCombo dans une classe.

    Merci a tous

    Bastien

  13. #13
    Membre actif Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Points : 220
    Points
    220
    Par défaut
    Bonjour a tous,
    Le problème est resolu, je viens de voir que je rejoute l'objet a la collection à la fin donc mon collect.count doit etre soustrait de 1.

    j'ai edit mon code si sa peut servir

    Merci encore

    Bastien

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

Discussions similaires

  1. [VB6]comment supprimer dynamiquement un controle dynamique?
    Par totor le troll dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 06/07/2011, 21h10
  2. [VB.NET] Contrôle dynamique et évènements
    Par johann.C dans le forum ASP.NET
    Réponses: 4
    Dernier message: 30/11/2009, 10h45
  3. Récupérer Valeur d'un controle dynamique
    Par moumoune65 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 18/12/2007, 09h02
  4. [C#]control dynamique
    Par inferno dans le forum ASP.NET
    Réponses: 5
    Dernier message: 25/08/2006, 12h08
  5. [VB6] creation et gestion de contrôle dynamique
    Par olivierx dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 23/04/2004, 00h09

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