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 :

Validation automatique d'un Textbox


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 116
    Par défaut Validation automatique d'un Textbox
    Bonjour voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub TextBox10_Change()
    'exemple pour format xx/xx/xxxx
    Dim Valeur As Byte
    TextBox10.MaxLength = 7 'nb caracteres maxi dans textbox
    End Sub
    Je voudrai que le textbox ce valide automatiquement une fois les 7 caractère ecrit, je me casse la tête .

    Merci

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Où se trouve le textbox ? Dans une feuille de calculs ou dans un userform ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 116
    Par défaut
    Dans un Userform pour le moment il est validé avec un Button mais j'aimerai qu'il ce valide tout seul après avoir marqué les 7 caractères

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour valider Textbox1 et limiter la saisie à 7 caractères, il faut qu'il perde le focus.
    Pour perdre le focus, il est nécessaire d'avoir un autre objet à disposition ou de fermer l'userform.
    Pour ça, tu peux tester le nombre de caractères dans TextBox1_KeyUp
    Un exemple avec deux textbox, TextBox1 et TextBox2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If Len(TextBox1) = 7 Then TextBox2.SetFocus
    End Sub
    Tu sauras adapter ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 116
    Par défaut
    J arrive a limiter mon TEXTBOX a 7

    je te montre le code qui valide mon 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
    Private Sub CommandButton5_Click()
    Selection.AutoFilter
     
              Dim plage As Range, Cell As Range
            Dim FL1 As Worksheet, critere As String
            Set FL1 = Worksheets("Feuil1")
     
            Set c = Cells.Find(What:=TextBox10.Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
            xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
     
     
          On Error GoTo Erreur
            If c = "" Then
            UserForm1.Hide
            End If
            c.Activate 'active la cellule trouvée
     
            DA = ActiveCell.Offset(0, 19).Value 'décale pour trouver le fournisseur
            TextBox12.Value = DA
    Erreur:
     
    End Sub
    Voila le code qui valide le TEXTBOX, et j'aimeré automatisé cela sans touche.
    Car plus tard la référence sera rentré dans le TEXTBOX avec un lecteur de code barre

    J'espère que c plus clair

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    J'aime bien quand les informations arrivent au compte-gouttes, on est plus sûr de répondre à côté.
    Tu as la solution dans ton propre code, si tu ajoutes le changement de focus que je t'ai mis.
    Tu places tout ton code dans l'événement change et si Len(textbox1) = 7 tu exécute ce que tu as mis dans le clic du bouton.
    Par contre, tu te compliques la vie en ajoutant une gestion d'erreur.
    Quelques remarques concernant ton code
    'Selection.AutoFilter 'on se demande ce que ça vient faire là vu qu'on ne sait pas ni ou te trouves ni ce que tu filtres ni si tu mets un filtre ni au contraire si tu le retires
    Pour savoir si un filtre est posé, regarde FilterMode dans l'aide en ligne
    Ici tu déclares Cell as Range et tu ne l'utilises pas dans ta procédure
    Dim plage As Range, Cell As Range
    Dim FL1 As Worksheet, critere As String
    Set FL1 = Worksheets("Feuil1")
    Ici tu utilises c que tu n'as pas déclaré (as range)
    Set c = Cells.Find(What:=TextBox10.Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
    xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
    etc.
    Un exemple à tester... si j'ai bien compris ce que tu souhaites
    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
    Private Sub TextBox10_Change()
    If Len(TextBox10) < 7 Then Exit Sub
    Dim plage As Range, Cell As Range
    Dim FL1 As Worksheet, critere As String
            Set FL1 = Worksheets("Feuil1")
     
            Set Cell = FL1.Cells.Find(What:=TextBox10.Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
            xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
     
            If Cell Is Nothing Then
                Unload UserForm1 'Hide masque l'userform mais ne le décharge pas
                Exit Sub
            End If
            'Inutile de l'activer pour récupérer la valeur de la colonne
            'cell.Activate 'active la cellule trouvée
     
            TextBox12.Value = Cell.Offset(0, 19).Value 'décale pour trouver le fournisseur
     
    End Sub
    Et dans UserForm_Initialize mais pas forcément justifié...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Initialize()
        TextBox10.MaxLength = 7
    End Sub
    La précision qui manque :
    Que fais-tu de ton userform si la donnée n'est pas trouvée ? Tu le masques ou tu le décharges ?
    Bon après-midi

    PS - Un autre élément manquant : Tu ne précises pas la colonne de la recherche. Si tu as la donnée que tu cherches n'importe où dans la feuille, sur une autre colonne, tu vas la trouver... et l'offset(0, 19) sera faux

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 116
    Par défaut
    Désolé j'ai oublié de supprimer c'est des copier/coller d'une autre partie du programme

    J'ai juste une petite question

    voici le 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Private Sub CommandButton2_Click()
    'Recherche par référence
    Selection.AutoFilter
    Dim Tablo As Variant, Tempo As Variant, i As Long, j As Long
        Worksheets("Feuil1").Activate 'à défaut d'instancier la feuille
        Tablo = Range("H2:H" & Range("h" & Rows.Count).End(xlUp).Row).Value
    'triAlpha
        For i = 1 To UBound(Tablo)
            For j = 1 To UBound(Tablo)
                If Tablo(i, 1) < Tablo(j, 1) Then 'test
                    Tempo = Tablo(i, 1)
                    Tablo(i, 1) = Tablo(j, 1)
                    Tablo(j, 1) = Tempo
                End If
            Next j
        Next i
        ListBox4.Clear
    'Remplissage excluant les doublons
        ListBox4.AddItem Tablo(1, 1)
        For i = 2 To UBound(Tablo)
            If Tablo(i, 1) <> Tablo(i - 1, 1) Then ListBox4.AddItem Tablo(i, 1)
        Next
     
    Dim plage As Range, Cell As Range
    Dim FL2 As Worksheet, critere As String
        Set FL2 = Worksheets("Feuil1")
        ListBox3.Clear
    'On fixe le critère
        critere1 = ListBox4
    'Pose du filtre : Si un filtre existe, on le supprime...
        If FL2.FilterMode Then FL2.Cells.AutoFilter
    '... avant de le poser sur la colonne désirée
        FL2.Columns("a:a").AutoFilter Field:=1, Criteria1:="*" & TextBox7 & "*"
     
    'La plage de données filtrées correspond aux seules cellule visibles
    'Dans cette plage, la colonne du filtre est la colonne 1
        Set plage = FL2.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible)
    'Parcours de la plage filtrée -> remplissage des trois colonnes de la listbox
        For Each Cell In plage 'dans la listbox, la première colonne a l'indice 0
            'Colonne 1 ds listbox (indice 0) : colonne du filtre => D
            ListBox3.AddItem Cell 'colonne A de la feuille
            'Colonne 2 ds listbox (indice 1) : A + 2 => colonne C de la feuille
            ListBox3.List(ListBox3.ListCount - 1, 1) = Cell.Offset(0, 2)
            'Colonne 3 ds listbox (indice 2) : A + 3 => colonne D de la feuille
            ListBox3.List(ListBox3.ListCount - 1, 2) = Cell.Offset(0, 3)
        Next
        Set plage = Nothing
    End Sub
    et

    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
    Private Sub ListBox3_Click()
    TextBox2.Value = ListBox3.Value
     
            Dim plage As Range, Cell As Range
            Dim FL2 As Worksheet, critere As String
            Set FL2 = Worksheets("Feuil1")
     
            Set c1 = Cells.Find(What:=TextBox2.Value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
            xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
     
    On Error GoTo Erreur
     
            If c1 = "" Then
            UserForm1.Hide
            End If
            c1.Activate 'active la cellule trouvée
     
            Désignation = ActiveCell.Offset(0, 7).Value 'décale pour trouver la désignation
            TextBox2.Value = Désignation
            Stock = ActiveCell.Offset(0, 2).Value 'décale pour trouver le stck
            TextBox3.Value = Stock
            Emplacement = ActiveCell.Offset(0, 9).Value 'décale pour trouver l emplacement
            TextBox5.Value = Emplacement
            Fournisseur = ActiveCell.Offset(0, 8).Value 'décale pour trouver le fournisseur
            TextBox6.Value = Fournisseur
            Référence = ActiveCell.Offset(0, 0).Value 'décale pour trouver le fournisseur
            TextBox4.Value = Référence
            Plan = ActiveCell.Offset(0, 18).Value 'décale pour trouver le fournisseur
            TextBox11.Value = Plan
            DA = ActiveCell.Offset(0, 19).Value 'décale pour trouver le fournisseur
            TextBox12.Value = DA
    Erreur:
     
    End Sub
    Je copie dans la listbox tout puis un filtre dans la deuxieme listbox
    Par contre je n'arrive pas a supprimer la premiere référence de ma deuxieme listbox il affiche toujours la premiere ligne du mon filtre

    Merci

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    De quoi parles-tu ? J'en étais resté au sujet de la discussion qui était "validation automatique d'une textbox"
    Scinde tes problèmes. Ouvre une discussion par question, sinon on est perdu.
    Le problème suivant est évoqué là où tu as trouvé le code pour le filtre.
    je n'arrive pas a supprimer la premiere référence de ma deuxieme listbox il affiche toujours la premiere ligne du mon filtre
    On ne va pas le traiter ici.
    Tu peux relire ce que j'ai mis ? Tester le code ? Répondre aux questions ?
    A+

  9. #9
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Pas besoin de code compliqué pour traiter du code à barres!

    Une TextBox et un bouton Valider dont la propriété Default est mise à True.

    Configurer le lecteur de code pour qu'il envoie un Carriage return en fin de saisie.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Citation Envoyé par AlainTech Voir le message
    Pas besoin de code compliqué pour traiter du code à barres!
    Une TextBox et un bouton Valider dont la propriété Default est mise à True.
    Précisément, le pb est que wabo67 ne veut pas de bouton de validaton et veut que la validation se fasse automatiquement à la réception du 7ème caractère

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour, Ousk

    Si le seul usage de la touche ENTER doit ne provoquer qu'un seul bloc d'instructions, sur tout l'UserForm, la solution d'AlainTech est de mise.
    Avec un bouton de commande dont la propriété Default est mise à true, il sera cliqué automatiquement dès lors que l'on appuiera sur la touche ENTER, quel que soit la textbox dans laquelle on utilise la touche ENTER.
    Rien n'interdit enfin, si l'on ne veut pas voir ce bouton de commande, de lui donner des coordonées telles qu'il serait hors des limites de l'userform (pour éviter le Visible = False qui empêcherait l'exécution par la touche ENTER)

    Illustration à main levée :

    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
    Private Sub UserForm_Initialize()
     Command1.Move Me.Width * 2 ' pour le cacher bien que visible (hors de l'UserForm)
     Command1.Default = False
    End Sub
     
    Private Sub TextBox1_Change()
      If Len(TextBox1.Text) = 7 Then
        Command1.Default = True
        SendKeys "{ENTER}"
        DoEvents
        Command1.Default = False
      End If
    End Sub
     
    Private Sub Command1_Click()
      MsgBox "oui, j'exécute ..."
    End Sub

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello ucfoutu,
    Effectivement, c'est une solution. J'avoue que j'y avais même pas songé. Ceci dit, j'aime pas bien l'idée d'un contrôle qui se balade hors de l'écran même si, en l'occurence, cela ne présente aucun inconvénient aucun...
    Mais ok, Alain a toujours raison

  13. #13
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Hello Ousk,
    Tu n'aimes pas que ce command1 se ballade en dehors ?
    Alors on va carrément le supprimer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub UserForm_Initialize()
     TextBox1.MaxLength = 7
    End Sub
     
    Private Sub TextBox1_Change()
      If Len(TextBox1.Text) = TextBox1.MaxLength Then coucou
    End Sub
     
    Private Sub coucou()
      MsgBox "oui, on exécute"
    End Sub

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Oui, alors c'est ce que j'ai mis sous une autre forme. Tu utilises simplement MaxLength alors que je ne l'utilise pas.
    Tu peux remarquer qu'il y a une recherche préalable à la validation du textbox, c'est pourquoi, afin que cette recherche ne s'effectue qu'une seule fois, j'ai ajouté la condition "If Len(TextBox10) < 7 Then Exit Sub" en tête de macro. Et comme j'ai cette condition, je n'ai plus besoin de tester MaxLength.
    Et comme je n'ai plus besoin de tester MaxLength mais que je teste Len(TextBox10) je n'ai plus besoin du bouton.
    Et comme je ferme l'userform, je n'ai plus besoin de valider avec Entrée.

Discussions similaires

  1. Validation automatique d'une fenêtre non WinDev
    Par ahmet57 dans le forum WinDev
    Réponses: 4
    Dernier message: 18/08/2006, 08h35
  2. [DTD] pas de validation automatique ?
    Par Emplyst dans le forum Valider
    Réponses: 2
    Dernier message: 23/07/2006, 23h25
  3. [Javascript] validation automatique à partir d'une liste
    Par lau_the_raptor dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/06/2006, 07h05
  4. Validation automatique de formulaire (sans clic)
    Par budiste dans le forum Langage
    Réponses: 6
    Dernier message: 13/04/2006, 16h31
  5. [C#] Remplissage automatique de 2 TextBox
    Par dacamp dans le forum ASP.NET
    Réponses: 8
    Dernier message: 29/09/2004, 17h50

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