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 :

Module de classe sur SpinButton et LabelBox [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut Module de classe sur SpinButton et LabelBox
    Bonjour au Forum,

    je viens ici, car je souhaiterais généraliser une fonctionnalité sur du spinbutton associé à du labelbox.

    voici comment se présente ma userform1
    Nom : spinbutton.jpg
Affichages : 193
Taille : 19,7 Ko

    je créée en dynamique des spinbutton à droite d'une listbox (à peine visible sur l'image)
    (et à droite des spinbutton je créée des labelbox pour le moment 2 mais passons ce détail)

    manière de base:
    l'idée est lorsque je choisis un élément de la listbox alors le spinbutton est actif
    Ce spinbutton une fois actif en cliquant dessus me permet d'incrémenter un nombre allant de 1 à 20 à afficher dans le labelbox lui correspondant.
    si je déselectionne mon élément de la listbox alors le spinbutton est inactif et le labelbox correspondant devient sans texte
    lorsque je dis spinbutton correspondant à la sélection de l'item de la listbox et que le labelbox correspondant au spinbutton est qu'ils sont tous le même numéro

    ex: item N°5 de la listbox correspond au spinbutton5 et au labelbox5

    manière généralisée:
    Maintenant comme ma listbox est à choix multiple, il faudrait que pour chaque spinbutton correspond au choix de la listbox réagissent de la même manière que celle de base

    Je sais qu'un module de classe permet de gérer le comportement mais c'est hyper trop dur pour mon niveau.
    Quelqu'un aurait-il la gentillesse de m'amener sur la voie (sans me renvoyer vers un tuto), SVP ?

    Merci pour l'aide précieuse

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Salut,

    Le principe de base est qu'il te faut une classe encapsulant un contrôle pour capturer les évènements de ce dernier.

    Dans sa forme la plus naïve, c'est la classe qui devra s'occuper des évènements des contrôles (et non le formulaire), de plus, pour un évènement donné, un gestionnaire commun est utilisé pour tous les contrôles.
    A ta charge de mettre en place une mecanique pour les distinguer, par exemple la propriété Tag:
    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
    '// Class CustomSpinButton
    Option Explicit
     
    Public WithEvent mSpinButton As MsForms.SpinButton
     
    Private mSpinButton_SpinDown()
        Select Case mSpinButton.Tag
        Case "1"
        Case "2"
        Case "3"
        End Select
    End Sub
     
    Private mSpinButton_SpinUp()
        Select Case mSpinButton.Tag
        Case "1"
        Case "2"
        Case "3"
        End Select
    End Sub
    Coté formulaire, ce dernier se contente d'instancier les contrôles, et les classes.
    Il doit cependant garder les instances des classes "en vie" dans un conteneur de ton choix.
    Par exemple:
    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
    OptionExplicit
     
    Private mSpinButtons As Collection
     
    Private Sub UserForm_Initialize()
            '// Conteneur memorisant les instances de classes
        Set mSpinButtons = New Collection
     
        Dim i As Long
        For i = 1 to 20
                '// Creation du contrôle
            Dim Sb As MsForms.SpinButton
            Set Sb = Me.Controls.Add("Forms.SpinButton.1")
            Sb.Tag = i
     
                '// Instanciation et initialisation d'un objet de type CustomSpinButton
            Dim CustomSpinButton As CustomSpinButton
            Set CustomSpinButton = New CustomSpinButton
            Set CustomSpinButton.mSpinButton = Sb    '// Initialisation du contrôle interne
     
               '// Ajout de l'instance dans le conteneur
            mSpinButtons.Add CustomSpinButtons
        Next
    End Sub

  3. #3
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut
    bonsoir deedolith

    Dans le module de classe, je remplace les "case" par ceci (ce à quoi je veux tendre)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub mSpinButton_SpinUp()
       If mSpinButton.Value > 10 Then Exit Sub
       MSForms.Label("" & mSpinButton.Tag & "").Caption = mSpinButton.Value
    End Sub
    hélas ma notation n'est pas reconnue

  4. #4
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut rectification
    Ceci passe mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     UserForm1.Controls("Label" & mSpinButton.Tag).Caption = CStr(mSpinButton.Value)

  5. #5
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juin 2016
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juin 2016
    Messages : 306
    Par défaut problème résolut
    Bonjour au Forum,

    j'effectue bien mon idée. Encore merci Deedolith pour la bonne partie du code qui m'a fait gagné du temps

    dans le module de classe j'ai ceci pour la gestion du comportement

    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
    Option Explicit
     
    Public WithEvents mSpinButton As MSForms.SpinButton
     
    Private Sub mSpinButton_SpinDown()
       If mSpinButton.Value < 1 Then Exit Sub
            If UserForm1.ListBox1.Selected(CInt(mSpinButton.Tag)) = True Then
            UserForm1.Controls("Label" & mSpinButton.Tag).Caption = CStr(mSpinButton.Value)
            Else
            mSpinButton.Value = mSpinButton.Value + 1
            End If
    End Sub
     
    Private Sub mSpinButton_SpinUp()
       If mSpinButton.Value > 10 Then Exit Sub
     
            If UserForm1.ListBox1.Selected(CInt(mSpinButton.Tag)) = True Then
            UserForm1.Controls("Label" & mSpinButton.Tag).Caption = CStr(mSpinButton.Value)
            Else
            mSpinButton.Value = mSpinButton.Value - 1
            End If
    End Sub
    dans le userform j'ai à la fois ceci

    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 Spin()
     
    Dim CustomSpinButton As CustomSpinButton
    Dim Sb As MSForms.SpinButton
    Dim i As Long
     
            '// Conteneur memorisant les instances de classes
        Set mSpinButtons = New Collection
     
        For i = LBound(TF) To UBound(TF) '- 1
                '// Creation du contrôle
            Set Sb = Me.Controls.Add("Forms.SpinButton.1")
            With Sb
                .Name = "SpinButton" & i 'nom de ta textbox (toto1, toto2, toto3, ...)
                .Left = 228 'position par rapport au rebord gauche de l'UserForm
                .Top = 13 + i * 9.56 'position par rapport au haut de l'UserForm
                .Width = 24 'largeur de la zone d'écriture
                .Height = 9.56 'hauteur de la zone d'écriture
                .Min = 1
                .Max = 10
                .Tag = i
            End With
            'Sb.Tag = i
     
                '// Instanciation et initialisation d'un objet de type CustomSpinButton
            Set CustomSpinButton = New CustomSpinButton
            Set CustomSpinButton.mSpinButton = Sb    '// Initialisation du contrôle interne
     
               '// Ajout de l'instance dans le conteneur
            mSpinButtons.Add CustomSpinButton
        Next
    End Sub
    et également ceci pour un comportement de la listbox influence les spinbutton associés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub listbox1_change()
     
    If UserForm1.ListBox1.Selected(UserForm1.ListBox1.ListIndex) = False Then
    UserForm1.Controls("Label" & UserForm1.ListBox1.ListIndex).Caption = "1"
    UserForm1.Controls("SpinButton" & UserForm1.ListBox1.ListIndex).Value = 1
    End If
     
    'MsgBox UserForm1.ListBox1.ListIndex
    End Sub

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

Discussions similaires

  1. Module de classe sur modèle
    Par nicus88 dans le forum VBA Word
    Réponses: 4
    Dernier message: 25/08/2013, 10h54
  2. [XL-2007] Groupe de Checkbox sur feuille et module de classe pour macro unique
    Par seb360 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/04/2012, 11h30
  3. [XL-2003] Modules de classe événement click sur OLEObjects
    Par pijaku dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 01/08/2011, 08h25
  4. Diagramme des classes sur les plugins, modules, etc.
    Par dd_angel dans le forum Diagrammes de Classes
    Réponses: 1
    Dernier message: 25/03/2011, 13h43
  5. Votre avis sur ce module de classe perso
    Par borislotte dans le forum Access
    Réponses: 2
    Dernier message: 06/12/2006, 12h20

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