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

Contribuez Discussion :

Avoir la classe avec des TextBox numériques


Sujet :

Contribuez

  1. #1
    Membre émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut Avoir la classe avec des TextBox numériques
    Comment avoir la classe avec des TextBox numériques ?

    TextBoxNum

    Forcer la saisie d'une valeur numérique dans une TextBox.

    Il peut être très utile de mettre des zones de texte ne pouvant prendre que des valeurs numériques dans nos formulaires (montant de facture, pourcentage à appliquer, …).
    Malheureusement le control TextBox ne possède pas de paramètre permettant cela.

    Alors nous allons créer notre propre TextBoxNum !

    Une première solution

    Une solution qui est souvent employer est d’utiliser l’évènement KeyPress d’une TextBox afin de contrôler la saisie que fait l’utilisateur et de la valider ou non.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If KeyAscii = 44 Then
            KeyAscii = 46
        ElseIf (KeyAscii < vbKey0 Or KeyAscii > vbKey9) And KeyAscii <> vbKeyBack And KeyAscii <> vbKeyDelete Then
            KeyAscii = 0
        End If
    End Sub
    Ici lors de la saisie d’un caractère dans la zone de texte nommée TextBox1, le code Ascii du caractère est renvoyé sous forme de nombre dans la variable KeyAscii.
    Dans la première partie du bloc IF KeyAscii = 44 correspond au cas où une virgule est saisie. Dans ce cas KeyAscii est remplacé par 46 qui est le point (séparateur décimal en VB).
    Dans la seconde partie les caractères autres que les nombres de 0 à 9, le retour ou Suppr sont remplacés par 0 ce qui a pour effet de rien renvoyer dans le TextBox1.


    L’utilisation de cette méthode nous oblige à écrire ce morceau de code autant de fois qu’il y a de TextBox devant être numérique.



    Nous allons donc créer notre propre TextBoxNum.


    Création d'une classe TextBoxNum et d'une classe pour la collection des TextBoxNum

    Commencons par créer deux modules de classe que nous nommons TextBoxNum et TextBoxNums.
    Le premier va servir à gérer l’objet TextBoxNum et le second la collection des objets TextBoxNum.

    Code du module TextBoxNum :
    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
     
    Public WithEvents ZoneTextNum As MSForms.TextBox
     
    Private mParent As TextBoxNums
     
    Property Set Parent(ByRef objTBNs As TextBoxNums)
        If objTBNs Is Nothing Then
            mParent = objTBNs
        End If
    End Property
     
    Property Get Parent() As TextBoxNum
        Parent = mParent
    End Property
     
    Private Sub ZoneTextNum_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If KeyAscii = 44 Then
            KeyAscii = 46
        ElseIf (KeyAscii < vbKey0 Or KeyAscii > vbKey9) And KeyAscii <> vbKeyBack And KeyAscii <> vbKeyDelete Then
            KeyAscii = 0
        End If
    End Sub
     
    Private Sub ZoneTextNum_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If (Shift = 2 And KeyCode = 86) Or (Shift = 1 And KeyCode = 45) Then
            KeyCode = 0
        End If
    End Sub
    Code du module TextBoxNums :
    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
    Option Explicit
     
    Private mTextBoxNums As Collection
    Private iKey As Long
    Private Const TypeNum = "Num"
     
    Private Sub class_Initialize()
        Set mTextBoxNums = New Collection
        iKey = 0
    End Sub
     
    Private Sub class_Terminate()
        If Not (mTextBoxNums Is Nothing) Then _
            Set mTextBoxNums = Nothing
    End Sub
     
    Public Sub Add(ByRef objTBN As TextBoxNum)
        Dim key As String
            iKey = iKey + 1
            key = "TextBoxNum" & iKey
            mTextBoxNums.Add objTBN, key
        Set objTBN.Parent = Me
        Set objTBN = Nothing
    End Sub
     
    Public Function CreateTBN(ctrl As MSForms.TextBox) As TextBoxNum
        Dim objTBN As TextBoxNum
            Set objTBN = New TextBoxNum
            Set objTBN.ZoneTextNum = ctrl
     
            Set CreateTBN = objTBN
     
            If Not (objTBN Is Nothing) Then _
                Set objTBN = Nothing
    End Function 
     
    Sub InitCollectionTBN(ByRef UF As UserForm, ByRef TBNs As TextBoxNums)
        Dim ctrl As Control
            With TBNs
                For Each ctrl In UF.Controls
                    If TypeName(ctrl) = "TextBox" And ctrl.Tag = TypeNum Then _
                        .Add .CreateTBN(ctrl)
                Next
            End With
    End Sub
    Je passe les explications du code des deux modules de classes car tout est déjà expliquer dans des tutoriels DVP. Vous les retrouverez en lien plus bas.
    Je vais seulement m'attarder sur ce code ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub ZoneTextNum_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If (Shift = 2 And KeyCode = 86) Or (Shift = 1 And KeyCode = 45) Then
            KeyCode = 0
        End If
    End Sub
    Shift = 2 correspond au fait que la touche Ctrl soit enfoncée et KeyCode = 86 correspond au fait que la touche v soit frappée. Nous détectons en fait une tentative de Ctrl + v. hors le contenu du presse-papier n'étant pas obligatoirement numérique nous décidons ici de ne rien renvoyer.
    Shift = 1 And KeyCode = 45 correspond à MAJ + Inser donc même principe.

    Ce bout de code peut donc être améliorer en testant le contenu du presse-papier par exemple.



    Nous avons donc maintenant deux modules de classe pour gérer nos TextBox. Il ne reste plus qu’à instancier les TextBoxNum qui doivent être numérique à l’ouverture du formulaire.

    Vous pouvez remarquer que dans la procédure InitCollectionTBN tous les contrôles du formulaire passé en premier paramètre sont parcourus et les TextBox qui ont la valeur Num dans leur propriété Tag sont ajoutés à la collection passée en second paramètre.

    Vous devait donc indiquer Num dans la propriété Tag des TextBox devant être numériques et ajouter le code ci-dessous au code du formulaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
     
    Dim TBNs As New TextBoxNums
     
    Private Sub UserForm_Activate()
        Call TBNs.InitCollectionTBN(Me, TBNs)
    End Sub
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        Set TBNs = Nothing
    End Sub
    Vous avez maintenant tout ce qu'il faut pour avoir vos propre TextBoxNum seulement en ajoutant Num dans la propriété Tag d'un TextBox.
    C'est pas la classe ça ?


    En espérant que toutes mes explications soient claires et que ce petit tuto vous soit utile

    Merci d'avoir pris le temps de me lire et un surtout un grand merci à tous les membres de DVP grâce a qui ce site est une mine d'or pour ceux comme moi qui veulent apprendre

    Antony

    Liens utiles :
    Antony

    Mieux vaut ne rien dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
    Gustave Parking


    Si le post vous est utile un petit fait toujours plaisir et pensez à passer en

    Et surtout -> Balise CODE

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 256
    Points
    34 256
    Par défaut
    Salut,

    je me permets d'ajouter a tes sources le tuto de 2010
    http://didier-gonard.developpez.com/...e-dans-texbox/
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re une autre methode encore plus simple pour classer des controls
    re
    Bonjour Antoni
    c'est joli comme code mais pour classer 3 lignes suffisent dans le init

    code du module 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Option Explicit
    Public WithEvents TextNum As MSForms.TextBox
    Public WithEvents userf As UserForm
    Dim txt() As New Classe1
     
     
    Function init(usf)
        Dim ctrl, i As Long
        For Each ctrl In usf.Controls
            If ctrl.Tag = "num" Then i = i + 1: ReDim Preserve txt(1 To i): Set txt(i).TextNum = ctrl: Set txt(i).userf = usf
        Next
    End Function
    '
    '
    'evenement textbox
    Private Sub TextNum_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If (Shift = 2 And KeyCode = 86) Or (Shift = 1 And KeyCode = 45) Then KeyCode = 0
    End Sub
    '
    Private Sub TextNum_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If KeyAscii < 46 Or KeyAscii > 56 Then KeyAscii = 0
    userf.Caption = TextNum.Name & "utilsé!!!"
    End Sub
    et dans le userform

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim ttt As New Classe1
    Private Sub UserForm_Activate()
    ttt.init Me
    End Sub
    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

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    +1 pour l'idée (et la réalisation bien sur )
    eric

  5. #5
    Membre émérite Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Points : 2 439
    Points
    2 439
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    re
    Bonjour Antoni
    c'est joli comme code mais pour classer 3 lignes suffisent dans le init
    Je suis d'accord avec toi si on veut juste des TextBox numériques.
    Mais là c'est une collection de TextBox que je crée. Ainsi je peux libérer la collection à la fermeture de l'UF. J'utilise ici des TB num mais des Boutons avec effet in / out serait possible aussi (enfin si tu vois de quoi je veux dire )

    Certes c'est beaucoup plus compliqué que ton code et pour pas grand-chose au final mais j'avais envie de faire une telle réalisation pour me tester et apprendre la création de collection

    @eriiic Merci
    Antony

    Mieux vaut ne rien dire et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.
    Gustave Parking


    Si le post vous est utile un petit fait toujours plaisir et pensez à passer en

    Et surtout -> Balise CODE

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut Re
    Bonjoir Antony
    Ok ke comprends pour le besoins d apprendre a manipuler les collections mais pour une classe de controls je vois pas trop
    Le terminate libere la. Memoire si je. Me. Trompe pas ca peut effectivement te faciliter la tache pour les fermer toute en un coup si. Je comprends bien ta demarche
    Au quel cas tu ajoute une ligne au miens
    Collection add txt(i), '' ''
    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

Discussions similaires

  1. Réponses: 8
    Dernier message: 02/11/2007, 07h24
  2. Comment avoir un DBGrid avec des Combos et Boutons
    Par soror dans le forum Composants VCL
    Réponses: 17
    Dernier message: 31/07/2007, 09h49
  3. Réponses: 2
    Dernier message: 10/08/2006, 09h03
  4. [VB6] Scrollbar dans une frame avec des textbox
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 44
    Dernier message: 01/03/2006, 08h16
  5. Trier une colonne avec des valeurs numériques ou textes
    Par jfc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/02/2006, 11h15

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