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 pour TextBox [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut Module de classe pour TextBox
    Bonjour à tous,

    J'ai crée un module de classe pour remplacer un traitement répétitif dans l'événement KeyDown des TextBox.

    Mais voila, parfois les événements KeyDown des TextBox, contiennent des valeurs différentes et parfois des lignes de commande en plus l'un par rapport à l'autre.

    Comment unifier le module de classe, tout en gardant les lignes de codes ou les quelques propriétés en plus.

    - Les .Text parfois elle est égal à "", "T" ou "L3-"
    - On trouve parfois Selstart dans des Textbox et pas d’autres
    Merci.

    Les Evenements à remplacer.

    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
    Private Sub tbN_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
            KeyCode = 0
            With tbTr
                .Text = "T"
                .SelStart = Len(.Text)
                .SetFocus
            End With
        End If
    End Sub
     
    Private Sub tbTr_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Dim Texte As String
     
        Texte = tbTr.Text
        If Len(Texte) = 4 Then Texte = Texte & "-"
        tbTr.Text = Texte
     
        If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
            KeyCode = 0
            With tbPr
                .Text = ""
                .SetFocus
            End With
        End If
    End Sub
     
    Private Sub tbPr_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
            With tbL3
                KeyCode = 0
                .Text = "L3-"
                .SelStart = Len(.Text)
                .SetFocus
            End With
        End If
    End Sub
     
    Private Sub tbAD_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
            With tbPt
                KeyCode = 0
                .Text = ""
                .SetFocus
            End With
        End If
    End Sub
    -----
    Classe : KeyControlClass-----

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public WithEvents tbKey As MSForms.TextBox
     
    Private Sub tbKey_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
            KeyCode = 0
            With tbTr
                .Text = "T" ' on trouve parfois .Text="", parfois .Text = "L3-" : Comment traiter ce probleme ?
                .SelStart = Len(.Text)
                .SetFocus
            End With
        End If
     
    End Sub
    -----

    Appel de la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim TBx(1 To 5) As New keyControlClass
     
    Private Sub UserForm_Initialize()
        Dim b As Byte
        Dim Ctl As MSForms.Control
        b = 1
        For Each Ctl In Me.Controls
            If TypeOf Ctl Is MSForms.TextBox Then
     
                TBx(b).tbKey = Ctl.Name
                b = b + 1
            End If
        Next Ctl
    End Sub
    Mais quand j'appel mon userform avec FrmSasie.Show ça bug.

    Une solution ?

    Merci d'avance.

  2. #2
    Expert confirmé
    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
    Par défaut
    Salut, sans savoir si cela pourra t'aider, mais en l'espérant quand même, voir http://www.developpez.net/forums/d11...orm-dynamique/

  3. #3
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Bonsoir kiki29,

    C'était pour la création d'un UserForm dynamique.

    Moi je cherche à crée un module de classe qui fonctionne avec les textBox de mon userform.

  4. #4
    Expert confirmé
    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
    Par défaut
    re, effectivement création dynamique d'une UserForm ainsi que de 12 TextBoxes avec le code correspondant pour les évènements Change et KeyPress, adaptable à ton contexte

    Une version via des modules de classes, à adapter à ton contexte
    Dans 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Option Explicit
     
    Dim TB() As New clsTBox
    Dim CB() As New clsCmdB
     
    Private Sub UserForm_Initialize()
    Dim TxtB As MSForms.TextBox
    Dim cmdB As MSForms.CommandButton
    Dim i As Integer, iLeft As Integer, iTop As Integer
     
        iLeft = 10: iTop = 10
        For i = 1 To 12
            Set TxtB = Me.Controls.Add("Forms.Textbox.1", , True)
            With TxtB
                .Width = 150
                .Height = 20
                .Left = iLeft
                .Top = iTop
                .BorderStyle = fmBorderStyleSingle
                .SpecialEffect = fmSpecialEffectFlat
     
                Select Case i
                    Case 1, 5
                        .BackColor = &HC0E0FF
                    Case Else
                        .BackColor = &HC0FFFF
                End Select
     
                .Tag = i
            End With
     
            iTop = iTop + 25
     
            ReDim Preserve TB(1 To i)
            Set TB(i).GroupeTxtB = TxtB
        Next i
     
        ReDim Preserve CB(1 To i)
        Set cmdB = Me.Controls.Add("Forms.CommandButton.1", , True)
        With cmdB
            .Caption = "Ok"
            .Width = usfTextBoxes.Width \ 4
            .Height = 20
            .Left = usfTextBoxes.Width \ 4 + .Width \ 2
            .Top = iTop + 10
        End With
     
        Set CB(1).cmdB = cmdB
    End Sub
    Dans un module de classe baptisé clsCmdB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Explicit
     
    Public WithEvents cmdB As MSForms.CommandButton
     
    Private Sub cmdB_Click()
        Unload usfTextBoxes
    End Sub
    Dans un module de classe baptisé clsTBox
    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
    Option Explicit
     
    Public WithEvents GroupeTxtB As MSForms.TextBox
     
    Const entrees_decimales_permises = ".,0123456789" & vbCr & vbBack
    Const entrees_alpha_permises = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" & vbCr & vbBack
    Const Point = "."
    Const Virgule = ","
     
    Private Sub GroupeTxtB_Change()
    Dim i As Integer
        i = GroupeTxtB.Tag
        Select Case i
            Case 1, 5
                ShTest.Range("A" & i) = GroupeTxtB.Text
            Case Else
                On Error Resume Next
                ShTest.Range("A" & i) = CDbl(GroupeTxtB.Text)
                Err.Clear
        End Select
    End Sub
     
    Private Sub GroupeTxtB_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        Select Case GroupeTxtB.Tag
            Case 1, 5
                If InStr(entrees_alpha_permises, Chr(KeyAscii)) = 0 Then KeyAscii = 0
            Case Else
                If KeyAscii = Asc(Point) Then
                    If InStr(GroupeTxtB.Text, Virgule) = 0 Then
                        KeyAscii = Asc(Virgule)
                    Else
                        KeyAscii = 0
                    End If
                ElseIf InStr(entrees_decimales_permises, Chr(KeyAscii)) = 0 Then
                    KeyAscii = 0
                ElseIf InStr(GroupeTxtB.Text, Virgule) > 0 And KeyAscii = Asc(Virgule) Then
                    KeyAscii = 0
                End If
        End Select
    End Sub

  5. #5
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Bonjour à tous,

    Ca avance un peu, et voila les evenements KeyDown que je veux remplacer :

    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
    Private Sub tbN_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
            KeyCode = 0
            With tbTr 'Next TextBox
                'un T au début
                .Text = "T"
                .SelStart = Len(.Text)
                .SetFocus
            End With
        End If
    End Sub
    Private Sub tbTr_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
            KeyCode = 0
            With tbPr 'Next TextBox
                'une chaine vide
                .Text = ""
                .SetFocus
            End With
        End If
    End Sub
    Private Sub tbPr_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
            With tbL3 'Next TextBox
                KeyCode = 0
                'un L3- au début
                .Text = "L3-"
                .SelStart = Len(.Text)
                .SetFocus
            End With
        End If
    End Sub
    Private Sub tbAD_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
            With tbPt 'Next TextBox
                KeyCode = 0
                'une chaine vide
                .Text = ""
                .SetFocus
            End With
        End If
    End Sub
    Et les evenements MouseDown :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub tbTr_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    'un T au début
        tbTr.Text = "T"
    End Sub
     
    Private Sub tbPr_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    'une chaine vide
        tbPr.Text = ""
    End Sub
     
    Private Sub tbPt_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    'une chaine vide
        tbPt.Text = ""
    End Sub

    Le module de classe ClsTB qui traite les évenements KeyDown et MouseDown des TextBox :

    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
    Public WithEvents GrpTB As MSForms.TextBox
     
    Private Sub GrpTB_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Dim i As Integer
        Dim Txt As String
     
        i = GrpTB.Tag
     
        Select Case i
        Case 1, 3, 5, 6
            Txt = ""
        Case 2
            Txt = "T"
        Case Else
            Txt = "L3-"
        End Select
     
        If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
            KeyCode = 0
            With GrpTB 'Next TextBox ????
                .Text = Txt
                .SelStart = Len(.Text)
                .SetFocus
            End With
        End If
     
    End Sub
     
    Private Sub GrpTB_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        Dim i As Integer
     
        i = GrpTB.Tag
     
        Select Case i
        Case 1, 3, 5, 6
            GrpTB.Text = ""
        Case 2
            GrpTB.Text = "T"
        Case Else
            GrpTB.Text = "L3-"
        End Select
     
    End Sub

    Seulement j'ai du mal à dire au programme de passer au TextBox suivante dans l'évenement KeyDown dans la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With GrpTB 'Next TextBox ????
    Une piste ?

    Merci d'avance.

  6. #6
    apt
    apt est déconnecté
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    867
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 867
    Par défaut
    Bonsoir,

    Une solution avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With GrpTB.Parent.Controls("TextBox" & I + 1)
    En renomment toutes les TextBox sous leurs noms initiaux :

    tbN en TextBox1
    tbTr en TextBox2
    ...
    tbPt en TextBox6
    Mais j'ai un problème : En vérifiant avec Msgbox (MouseDown) j'ai découvert que la 5éme TextBox s'appel TextBox6 et la dernière (6éme) s'appel TextBox6.

    Pourtant à l'initialisation, l'attribution d'événements de la classe ClsTB ainsi des Tag aux TextBox, se fait normalement dans l'ordre croissant de 1 à 6.

    Alors d'ou vient cette erreur ?

    Merci.

    EDIT :

    Voila la solution (Merci Hasco)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim TBx(1 To 6) As New ClsTB       '---- keyControlClass
    Private Sub UserForm_Initialize()
        Dim b As Byte
        For b = 1 To 6
            Set TBx(b).GrpTB = Me.Controls("Textbox" & b)
            TBx(b).GrpTB.Tag = b
        Next
    End Sub

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

Discussions similaires

  1. [XL-2007] Module de Classe pour controle textbox
    Par RastaBomboclat dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/05/2015, 18h10
  2. [XL-2010] TextBox et Modules de classe pour Excel 2010 et 2013
    Par tyndare36 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/10/2014, 18h36
  3. créer un module de classe pour gérer un textbox
    Par Cybernard dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 21/06/2010, 18h48
  4. Module numérique poussé pour textbox
    Par fred_gaou dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 04/11/2008, 17h33
  5. module de classe et textbox
    Par RemiT dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 20/12/2007, 10h06

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