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 :

Comment déterminer quel OptionButton créé dynamiquement est coché ? [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut
    Bonjour,

    J'ai créé une UserForm qui s'incrémente automatiquement d'un nombre variable d'OptionButton en fonction de valeurs stockées dans une feuille Excel (ici en colonne G). Aucun problème, ça fonctionne. Pour info, cette UserForm comporte également deux CommandButton pour validation et annulation.
    En revanche je tourne en rond pour récupérer le contrôle qui est coché par l'utilisateur Je suis certain que c'est bête comme chou, mais je ne suis pas un pro du VBA, soyez donc indulgeants
    Voici le code sachant que les variables VHeight et VTop sont publiques.

    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
    Private Sub UserForm_Initialize()
        Dim obCibles As msforms.OptionButton
        VHeight = 77
        VTop = 10
    '   Récupération du n° de ligne de la dernière cellule non vide, colonne G
        DerniereLigneG = ThisWorkbook.Worksheets(2).Range("G" & Rows.Count).End(xlUp).Row
        For i = 6 To DerniereLigneG
    '       Paramétrage de la UserForm fmCiblesChoix
            With fmCiblesChoix
                .Height = VHeight
    '           Création du bouton d'option
                Set obCibles = .Controls.Add("Forms.OptionButton.1", "obCibles" & i, True)
    '           Paramétrages du bouton d'option ajouté
                With obCibles
                    .Height = 18
                    .Width = 250
                    .Top = VTop
                    .Left = 12
                    .Caption = ThisWorkbook.Worksheets(2).Range("G" & i).Value
                End With
            End With
    '       Nouvelles valeurs pour le positionnement des boutons de commande
    '       23 = 18 (hauteur obCibles) + 5 (interligne)
            cmdOK.Top = VTop + 23
            cmdAnnuler.Top = VTop + 23
    '       Nouvelle hauteur ajustée de la UserForm
            VHeight = VHeight + 23
    '       Nouvelle valeur pour le positionnement du nouveau bouton d'option
            VTop = VTop + 23
        Next
    End Sub
    Merci d'avance pour votre aide.
    Bruno

    Bonjour,

    Après de nouvelles recherches, il se pourrait que ce ne soit pas aussi simple que ça et que la solution puisse se trouver avec l'utilisation d'un module de classe.
    Quelqu'un pourrait m'aider à trouver cette solution ? En attendant, je suis en train de bûcher ça.

    Bruno

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Crée un module de classe (par défaut nommé Classe1)
    Y insère ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
     
    Public WithEvents OB As MSForms.OptionButton
     
    Private Sub OB_Click()
     
    MsgBox OB.Caption & " est le bouton option activé"
    End Sub
    Dans le module de ton 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
    33
    34
    35
    36
    37
    38
    39
    Dim TbOb() As New Classe1
     
    Private Sub UserForm_Initialize()
    Dim DerniereLigneG As Long, i As Long
    Dim obCibles As MSForms.OptionButton
    Dim Sh As Worksheet
     
    VHeight = 77
    VTop = 10
     
    Set Sh = ThisWorkbook.Worksheets(2)
    DerniereLigneG = Sh.Cells(Sh.Rows.Count, "G").End(xlUp).Row
    For i = 6 To DerniereLigneG
        With Me
            Set obCibles = .Controls.Add("Forms.OptionButton.1", "obCibles" & i, True)
            With obCibles
                .Height = 18
                .Width = 250
                .Top = VTop
                .Left = 12
                .Caption = Sh.Range("G" & i).Value
            End With
        End With
     
        VHeight = VHeight + 23
        VTop = VTop + 23
     
        'Instancier l'OptionButton dans la classe crée
        ReDim Preserve TbOb(6 To i)
        Set TbOb(i).OB = obCibles
        Set obCibles = Nothing
     
    Next i
    Set Sh = Nothing
     
    Me.Height = VHeight + 23
    cmdOK.Top = VTop + 23
    cmdAnnuler.Top = VTop + 23
    End Sub
    Fais le test

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut
    Bonjour Mercatog,

    Je viens de tester et d'analyser ta réponse. C'est parfait merci beaucoup
    Il y a cependant une ligne que je ne comprends pas totalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set TbOb(i).OB = obCibles
    Avec ce code, si j'ai bien compris, tu insères le nouvel OptionButton dans la matrice TbOB, mais je ne comprends pas la "combinaison" Bruno

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Dans le lien que tu as signalé dans ton poste regarde
    II-A. Classe et instance

    Et
    II-E. Utiliser un module de classe

    N'oublie pas que TbOB est variable de type Classe1

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut
    Bonjour mercatog,

    Si j'ai bien compris, tu affectes une valeur (en l’occurrence celle de la variable obCibles) à TbOb(i).OB.
    Est-ce que le ".OB" signifie que la valeur affectée donne ses propriétés, méthodes et évènements à l'objet OB dans la matrice TbOb ?

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

Discussions similaires

  1. Comment déterminer son tarif quand on est Freelance ?
    Par nolwenn dans le forum Freelance
    Réponses: 21
    Dernier message: 12/06/2025, 20h06
  2. Réponses: 1
    Dernier message: 12/11/2009, 20h19
  3. Déterminer quel générateur d'état est utilisé
    Par pi_hellz dans le forum Autres outils décisionnels
    Réponses: 3
    Dernier message: 22/08/2007, 17h20
  4. Réponses: 5
    Dernier message: 24/04/2007, 11h17
  5. Comment savoir si dans Listview Checkbox est coché
    Par Ardely dans le forum Delphi
    Réponses: 8
    Dernier message: 16/01/2007, 10h51

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