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 :

Question sur la gestion d'évènement de contrôle dynamque [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 35
    Par défaut Question sur la gestion d'évènement de contrôle dynamque
    Bonjour,

    Je vais relancer ma question comme je n'ai pas eu de réponse la première fois, alors voila dans mon projet, j'ai créé des contrôles de manière dynamique. Néanmoins, je n'arrive pas à gérer les évènements de ces contrôles.
    Par exemple, je voudrais que lorsque ma checkbox dynamique est cliqué, je voudrais que ma textbox apparaisse.

    J'ai lu le cours de silkyroad sur la gestion d'évènement : https://silkyroad.developpez.com/VBA...icEditor/#LV-A
    Code sur silkyroad
    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
     
     
    Option Explicit
     
    Private Sub CommandButton1_Click()
    Dim Obj As Control
    Dim Cl As Classe1
    Dim i As Integer
     
    Set Collect = New Collection
     
    For i = 1 To 3 'boucle pour la création des CheckBox
        Set Obj = Me.Controls.Add("forms.Checkbox.1")
        With Obj
            .Name = "moncheckbox" & i
            .Object.Caption = "le texte" & i
            .Left = 140
            .Top = 30 * i + 10
            .Width = 50
            .Height = 20
        End With
     
        'ajout de l'objet dans la classe
        Set Cl = New Classe1
        Set Cl.ChkBx = Obj 'A quoi correspond l'objet Cl.Chkbox?
        Collect.Add Cl 'Je ne comprends toujours pas pourquoi faut il placer les contrôles dynamiques dans une collection.
    Next i
     
    End Sub

    Si quelqu'un pouvait vraiment m'aider sur ce problème qui commence à perdurer...

  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 re
    Bonjour
    ET ou est le code de ta "classe1" ?????????????
    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 averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 35
    Par défaut
    ah oui pardon!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Option Explicit
     
    Public WithEvents ChkBx As MSForms.CheckBox
     
    'Exemple pour gérer l'évènement clic sur les objets type CheckBox
    Private Sub ChkBx_Click()
        'cet exemple affiche le nom et la valeur de l'objet cliqué
        MsgBox ChkBx.Name & ": " & ChkBx.Value
    End Sub
    '--------------------------------------
    C'est le code que l'on trouve sur silkyroad pour créer des contrôles dynamiquement en faite
    Je ne comprends pas aussi à quel moment la routine du bouton click appelle l'évènement dans le module classe :"(

  4. #4
    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
    re
    deja d'une part pour faire un "set collect = new collection" faut il encore que collection soit reconnu
    et pour cela il faut la declarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim collect As Collection
        Set collect = New Collection
    ensuite pour etre honete moi aussi j'ai testé de nombreuse fois ce tutoriel a la lettre pres !!!et ca n'a jamais fonctionner malgré que ca devrait

    plutot que de collectionner les classes je les instancie directement ce qui en terme de nombre d'instances de classe revient au meme
    je te fait un exemple facon patrick
    mais d'abors j'ai cru comprendre que tu voulais faire apparaitre un textbox associer a chaque checkbox :tu confirme?????
    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

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 35
    Par défaut
    Oui c'est cela, je te mets mon code pour la création des mes contrôles:
    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
    Dim i As Integer
     
        Set tube = MultiPage1.Pages(2)
     
        For i = 0 To 11
            With tube
                Set Vtube = .Controls.Add("forms.Checkbox.1")
                Set Ttube = .Controls.Add("forms.Textbox.1")
            End With
     
            With Vtube
                .Name = "Vtube" & i
                .Left = 90
                .Height = 18
                .Top = 30 + i * 29
                .Width = 24
                .Caption = ""
                .Value = False
            End With
     
            With Ttube
                .Name = "Ttube" & i
                .Left = 156
                .Top = 30 + i * 29
                .Height = 18
                .Width = 40
                .TextAlign = 2
                .Visible = False
            End With
        Next
    Les variables Vtube et ttube sont déclarées en têtes de modules pour pouvoir être réutiliser par les sous-routines.

    Et voici ce que j'ai pensé faire pour gérer les évènements de mes contrôles checkbox et textbox dynamiques (toujours dans le module de mon userform).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim i As Integer
    Dim tube As Object
     
        Set tube = MultiPage1.Pages(2)
        For i = 0 To 11
            If tube.Controls("Vtube" & i).Value = True Then
                tube.Controls("Ttube" & i).Visible = True
            Else
                tube.Controls("Ttube" & i).Visible = False
            End If
        Next
    Mais hé hé, j'avais zappé que mes checkbox n'avaient pas d'évènements click ou change

    ça fait des semaines que je lis des tutos et cours sur les modules de classes et leur gestion d'évènement et je ne te caches pas que je nage encore sur ce sujet. Du coup j'ai réussi à contourner plusieurs fois mes problèmes pour éviter de les utiliser mais sur ce coup la je crois que je n'ai plus trop le choix x)

  6. #6
    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
    je n'ai pas besoins de ton code
    voici un exemple tres simple j'ai commenté autant que possible afin de t'en faire comprendre le fonctionnement

    pour etre tranquille tu va faire ca dans un fichier vierge
    dans ce fichier tu vas ajouter un userform et un module classe qui se nomme "Classe1"
    dans l'userform en haut a droite tu va ajouter ton bouton
    voila on a la structure
    maintenant les codes

    dans le code du userform tu va mettre simplement ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim cl As New Classe1
    Private Sub CommandButton1_Click()
    cl.initiate Me
    End Sub
    jusque la rien de bien compliqué

    maintenant dans le module classe tu va mettre ce code
    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
    Option Explicit
    Public WithEvents ChkBx As MSForms.CheckBox
    Public WithEvents TxTB As MSForms.TextBox
    Dim cls() As New Classe1
    Function initiate(uf)
        Dim i&, chx As Object, txt As Object
        For i = 1 To 3    'boucle pour la création des CheckBox
            ReDim Preserve cls(1 To i)
            Set chx = uf.Controls.Add("forms.Checkbox.1")    'on ajoute dynamiquement le checkbox
            Set txt = uf.Controls.Add("forms.TextBox.1")    ' on ajoute dynamiquement le textbox qui va etre associé a ce checkbox
            'on les place et dimentionne
            With chx: .Name = "moncheckbox" & i: .Object.Caption = "le texte" & i: .Left = 140: .Top = 30 * i + 10: .Width = 50: .Height = 20: End With
            With txt: .Name = "montextbox" & i: .Object.Value = "le texte" & i: .Left = 40: .Top = 30 * i + 10: .Width = 80: .Height = 20: .Visible = False: End With
            'ajout de l'objet dans la classe
            Set cls(i).ChkBx = chx: Set cls(i).TxTB = txt    'en les mettant dans la meme classe il seront associés(voir explication dans l'evenement)
        Next i
    End Function
    'Exemple pour gérer l'évènement clic sur les objets type CheckBox
    Private Sub ChkBx_Click()
    'cet exemple affiche le nom et la valeur de l'objet cliqué
        If ChkBx = True Then TxTB.Visible = True Else TxTB.Visible = False ' si le checkbox est true le textbox est visible sinon invisible
       'comment il sont associé chacun par paire(checkbox/textbox)???????
    'et bien c'est tout simple
    'en mettant le txt et le chx dans la meme instance de la classe  dans la boucle dans initiate
    'dans l'evenement TxTB c'est le textbox qui a été placé dans la meme instance
    'autrement dit l' instance(1) de la classe1  il y a moncheckbox1 avec montextbox1
    'dans l' instance(2) de la classe1  il y a moncheckbox2 avec montextbox2
    'etc.....
    'autrement dit aussi si tu clique sur monchexbox1 TxTB sera monTextbox1 car ce textbox est seul avec moncheckbox1 dans l'instance de la classe
    ' ca veux dire  par exemple que quand tu clique sur "moncheckbox2 tu declanche l'evenement de l'instance(2) de la classe1
    End Sub
    '--------------------------------------
    comme tu peut le voir il y a beaucoup de commentaires je ne peux etre plus clair et il n'y a rien de plus simple a comprendre
    surtout quand tu va lire les commentaires dans l'evenement de ChkBx

    demonstration
    Nom : demo.gif
Affichages : 238
Taille : 192,4 Ko
    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

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsoir lackam,Patrick et mercatog,

    Pour les novices les modules de classe ne sont pas évident à appréhender.

    Non pas que ce soit compliqué, mais parce que la méthode de raisonner est au antipode de celle qu'on pratique habituellement.

    Un module de classe,et Patrick la souligné, est un modèle d'objet. Tout comme une voiture est construite sur la base d'un modèle.

    Une instance est une photocopie de ce modèle et il est chargé en mémoire {New MyClasse}

    Le principe de création de contrôle via module de classe consiste à superposer des feuilles de papier calque {instance de la classes} et de voire par transparence tous les contrôles ainsi créés.

    Une classe dispose de propriétés et des méthodes qui lui sont propres et unique pour chaque instances.

    Si ton voisin à le même modèle de voiture que toi, ce sont bien ses lunettes de soleils dans la boite à gans.

    Personnellement, je réserve mes modules de classe au stricte minimum utile.

    Je ne lui confis pas initiative d'exécuter un code qui briderait l'utilisation de mon programme et me demanderai une redéfinition de la classe en ca d'évolution.

    Pas de boucle pour créer mes contrôles mais un méthode public Add la boucle étant dans le programme principal et Add dans ma classe !

  8. #8
    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
    Citation Envoyé par patricktoulon Voir le message
    ensuite pour etre honete moi aussi j'ai testé de nombreuse fois ce tutoriel a la lettre pres !!!et ca n'a jamais fonctionner malgré que ca devrait
    Contre exemple

    Module de classe Classe1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public WithEvents ChkBx As MSForms.CheckBox
     
    Private Sub ChkBx_Click()
    Dim Tmp As String
     
    Tmp = Replace(ChkBx.Name, "Vt", "Tt")
     
    UserForm1.Controls(Tmp).Visible = ChkBx.Value
    End Sub
    Module de l'userform Userform1
    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
    42
    43
    44
    45
    46
    47
    48
    49
    Option Explicit
     
    Dim ColC As Collection
     
    Private Sub UserForm_Initialize()
    Dim vTube As msforms.CheckBox
    Dim tTube As msforms.TextBox
    Dim Tube As msforms.Page
    Dim Clas As New Classe1
    Dim i As Integer
     
    Set ColC = New Collection
    Set Tube = Me.MultiPage1.Pages(2)
     
    For i = 0 To 11
        With Tube
            Set vTube = .Controls.Add("forms.Checkbox.1")
     
            With vTube
                .Name = "Vtube" & i
                .Left = 90
                .Height = 18
                .Top = 30 + i * 29
                .Width = 24
                .Caption = ""
                .Value = False
     
            End With
            Set Clas = New Classe1
            Set Clas.ChkBx = vTube
            ColC.Add Clas
     
            Set vTube = Nothing
            Set tTube = .Controls.Add("forms.Textbox.1")
            With tTube
                .Name = "Ttube" & i
                .Left = 156
                .Top = 30 + i * 29
                .Height = 18
                .Width = 40
                .TextAlign = 2
                .Visible = False
            End With
            Set tTube = Nothing
     
        End With
    Next i
    Set Tube = Nothing
    End Sub

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 35
    Par défaut
    Citation Envoyé par mercatog Voir le message
    Contre exemple

    Module de classe Classe1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public WithEvents ChkBx As MSForms.CheckBox
     
    Private Sub ChkBx_Click()
    Dim Tmp As String
     
    Tmp = Replace(ChkBx.Name, "Vt", "Tt")
     
    UserForm1.Controls(Tmp).Visible = ChkBx.Value
    End Sub
    Module de l'userform Userform1
    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
    42
    43
    44
    45
    46
    47
    48
    49
    Option Explicit
     
    Dim ColC As Collection
     
    Private Sub UserForm_Initialize()
    Dim vTube As msforms.CheckBox
    Dim tTube As msforms.TextBox
    Dim Tube As msforms.Page
    Dim Clas As New Classe1
    Dim i As Integer
     
    Set ColC = New Collection
    Set Tube = Me.MultiPage1.Pages(2)
     
    For i = 0 To 11
        With Tube
            Set vTube = .Controls.Add("forms.Checkbox.1")
     
            With vTube
                .Name = "Vtube" & i
                .Left = 90
                .Height = 18
                .Top = 30 + i * 29
                .Width = 24
                .Caption = ""
                .Value = False
     
            End With
            Set Clas = New Classe1
            Set Clas.ChkBx = vTube
            ColC.Add Clas
     
            Set vTube = Nothing
            Set tTube = .Controls.Add("forms.Textbox.1")
            With tTube
                .Name = "Ttube" & i
                .Left = 156
                .Top = 30 + i * 29
                .Height = 18
                .Width = 40
                .TextAlign = 2
                .Visible = False
            End With
            Set tTube = Nothing
     
        End With
    Next i
    Set Tube = Nothing
    End Sub
    Je voulais juste te demander, pourquoi faut-il détruire l'objet à chaque fois?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Set tTube = .Controls.Add("forms.Textbox.1")
            With tTube
                .Name = "Ttube" & i
                .Left = 156
                .Top = 30 + i * 29
                .Height = 18
                .Width = 40
                .TextAlign = 2
                .Visible = False
            End With
            Set tTube = Nothing

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/09/2015, 22h28
  2. question sur la gestion des css
    Par boustor dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 31/07/2006, 16h57
  3. Question sur la gestion de l'affichage en VBA
    Par papilou86 dans le forum Access
    Réponses: 5
    Dernier message: 29/05/2006, 10h26
  4. Quelques questions sur la gestion des droits
    Par sylsau dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/03/2006, 14h11
  5. Question sur la gestion des fenetres MDI
    Par RémiONERA dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/07/2005, 07h58

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