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 :

accepter que des chiffres


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 174
    Points : 53
    Points
    53
    Par défaut accepter que des chiffres
    bonjour,

    je souhaite protéger mes textbox contre la saisie de lettre. mais alors j'ai essayer avec "not is numeric" mais alors mon souci est que mon séparateur de décimale n'est pas la virgule mais le point.

    Or quand j'utilise "is not numéric" dès que l'on saisie un chiffre avec un point et bien le msgbox se lance.

    Comment y remédier.

    merci

  2. #2
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 45
    Points : 54
    Points
    54
    Par défaut
    Bonjour,


    Dans le code tu devra mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    if asc(Keyascii)<>"." then
    if isnumeric(asc(keyascii))=false then
    keyascii=0
    end if
    end if
    End Sub
    En revanche cela ne gere pas si tu as 2 fois ou plus un point dans la textbox et si ton excel est français cça ne convertit pas pas le textbox en un nombre.
    Sinon je tesuggère si tu peux de remplacer le point par un e virgule et de tester à l'évèenement lostfocuc ce qui a été mis.

  3. #3
    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
    Points : 5 537
    Points
    5 537
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     If KeyAscii = 8 Then Exit Sub
     If Chr(KeyAscii) = "." Then
       If InStr(TextBox1.Text, ".") > 0 Then
         KeyAscii = 0: Beep
       End If
       Exit Sub
     End If
     If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0: Beep
    End Sub

  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
    Points : 15 546
    Points
    15 546
    Par défaut
    Tu as une autre solution qui consiste, lors de la saisie, à systématiquement remplacer le point par une virgule. L'utilisateur aura vite compris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If KeyAscii = 8 Then Exit Sub
        If KeyAscii = 46 Then KeyAscii = 44
    End Sub

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 174
    Points : 53
    Points
    53
    Par défaut
    OK ça fonctionne très bien.

    mais alors maintenant je voudrais mettre une autre sécurité qui consiste à afficher un msgbox si toutes les cases ne sont pas remplies, mais cela ne fonctionne pas. Pourtant je l'avais déja fait mais sans "elseif"....

    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
    'bouton suivant
    Private Sub CommandButton2_Click()
     
    If CSng(Replace(TextBox34.Value, ".", ",")) > 400 Then
            MsgBox "Vérifier votre valeur", vbCritical, "Lecture avant"
            TextBox34.SetFocus
        ElseIf CSng(Replace(TextBox39.Value, ".", ",")) > 400 Then
            MsgBox "Vérifier votre valeur", vbCritical, "Lecture avant"
            TextBox39.SetFocus
        ElseIf CSng(Replace(TextBox35.Value, ".", ",")) > 400 Then
            MsgBox "Vérifier votre valeur", vbCritical, "Lecture arrière"
            TextBox35.SetFocus
        ElseIf CSng(Replace(TextBox39.Value, ".", ",")) > 400 Then
            MsgBox "Vérifier votre valeur", vbCritical, "Lecture arrière"
            TextBox39.SetFocus
        ElseIf CSng(Replace(TextBox37.Value, ".", ",")) > 200 Then
            MsgBox "Vérifier votre valeur", vbCritical, "Angle vertical"
            TextBox37.SetFocus
        ElseIf CSng(Replace(TextBox41.Value, ".", ",")) > 200 Then
            MsgBox "Vérifier votre valeur", vbCritical, "Angle vertical"
            TextBox41.SetFocus
        ElseIf TextBox34.Value = "" Then
            MsgBox "Il manque des informations", vbCritical, "Informations manquantes"
            TextBox34.SetFocus
        ElseIf TextBox36.Value = "" Then
            MsgBox "Il manque des informations", vbCritical, "Informations manquantes"
            TextBox36.SetFocus
        ElseIf TextBox37.Value = "" Then
            MsgBox "Il manque des informations", vbCritical, "Informations manquantes"
            TextBox37.SetFocus
        ElseIf TextBox38.Value = "" Then
            MsgBox "Il manque des informations", vbCritical, "Informations manquantes"
            TextBox38.SetFocus
        ElseIf TextBox39.Value = "" Then
            MsgBox "Il manque des informations", vbCritical, "Informations manquantes"
            TextBox39.SetFocus
        ElseIf TextBox40.Value = "" Then
            MsgBox "Il manque des informations", vbCritical, "Informations manquantes"
            TextBox40.SetFocus
        ElseIf TextBox41.Value = "" Then
            MsgBox "Il manque des informations", vbCritical, "Informations manquantes"
            TextBox41.SetFocus
     
        point2.Hide
        hauteur2p.Show
    End If
     
    End Sub
    merci

  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
    Points : 15 546
    Points
    15 546
    Par défaut
    Je crois comprendre que tu ne dois pas quitter point2 s'il y a une erreur de saisie. Dans ce cas là, ajoute un else avant ces deux lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        else
         point2.Hide
         hauteur2p.Show
    End If

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 174
    Points : 53
    Points
    53
    Par défaut
    Alors je viens de tester et lorsque je ne rempli pas une case il me met erreur "incompatibilité de type"

  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
    Points : 15 546
    Points
    15 546
    Par défaut
    Supprime tous les value dans tes tests, si ça ne fonctionne pas je te prépare une autre réponse.
    La méthode que tu utilises est trop rigide. Par exemple, tu pourrais mettre tes message dans une variable et n'avoir qu'un affichage, donc un seul msgbox après le endif
    Mais commence par la suppression des ".value"
    A+

  9. #9
    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
    Points : 15 546
    Points
    15 546
    Par défaut
    Déjà un élément de réponse sur la méthode que j'utiliserais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim TabloTous as variant, msg as string
    TabloTous = Array("34","35","36","37","38","39","40","41")
    msg = ""
    For i = 0 to Ubound(TabloTous)
            If Me.controls("Textbox" & TabloTous(i)) = "" then
                   Msg = "Il manque des informations"
                   MsgBox msg, vbCritical, "Informations manquantes"
                   Exit for
            endif
    Next
    if msg <> "" then Me.controls("Textbox" & TabloTous(i)).setfocus
    Un seul test, un seul msgbox, un seul setfocus
    On pourrait également géréraliser la méthode pour les valeurs numériques.
    Tu dis si ça t'intéresse

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 174
    Points : 53
    Points
    53
    Par défaut
    désolé, je n'avais pas vu ton autre réponse

  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
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour, ousk,

    t'aurais pas comme l'impression que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim TabloTous as variant, msg as string
    TabloTous = Array("34","35","36","37","38","39","40","41")
    msg = ""
    For i = 0 to Ubound(TabloTous)
            If Me.controls("Textbox" & TabloTous(i)) = "" then
                   Msg = "Il manque des informations"
                   MsgBox msg, vbCritical, "Informations manquantes"
                   Exit for
            endif
    Next
    if msg <> "" then Me.controls("Textbox" & TabloTous(i)).setfocus
    revient (en évitant l'array, à écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim i as integer , msg as string
    msg = ""
    For i = 34 to 41
            If Me.controls("Textbox" & str(i)  = "" then
                   Msg = "Il manque des informations"
                   MsgBox msg, vbCritical, "Informations manquantes"
                   Exit for
            endif
    Next
    if msg <> "" then Me.controls("Textbox" & str(i).setfocus
    ??

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 174
    Points : 53
    Points
    53
    Par défaut
    Merci

    oui cela m'interresse, mais avant tout, je ne connais pas du tout ce type de fonction (je ne sais pas si cela s'appelle ainsi), mais avec une explication du fonctionnement, je veux bien me pencher sur la question.

  13. #13
    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
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par ucfoutu Voir le message
    Bonjour, ousk,

    t'aurais pas comme l'impression que :

    revient (en évitant l'array, à écrire :
    Si, en effet, mais si tu étais parti du code d'origine où les textbox sont testés dans le désordre, "peut-être" aurais-tu pu penser comme moi que les numéros ne se suivaient pas... Une fois bien rangés (par moi) cela devient évident... Heuseusement que ton oeil exercé est passé par là, sinon jbggg aurait été foutu d'utiliser un tableau
    Trois yeux exercés valent mieux que deux

    @fbggg
    As-tu vu que tu as deux fois le même test sur textbox39 ?
    Tu es sûr que dans un cas c'est une lecture arrière et dans l'autre une lecture avant ? C'est le porte-mire qui va être heureux !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        ElseIf CSng(Replace(TextBox39.Value, ".", ",")) > 400 Then
            MsgBox "Vérifier votre valeur", vbCritical, "Lecture avant"
            TextBox39.SetFocus
        ElseIf CSng(Replace(TextBox35.Value, ".", ",")) > 400 Then
            MsgBox "Vérifier votre valeur", vbCritical, "Lecture arrière"
            TextBox35.SetFocus
        ElseIf CSng(Replace(TextBox39.Value, ".", ",")) > 400 Then
            MsgBox "Vérifier votre valeur", vbCritical, "Lecture arrière"
            TextBox39.SetFocus

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 174
    Points : 53
    Points
    53
    Par défaut
    merci un petit erreur de ma part

  15. #15
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 467
    Points : 493
    Points
    493
    Par défaut
    Bonsoir
    une variante prend la virgule comme séparateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Dim Sep As String
    Sep = Application.International(xlDecimalSeparator)
    If KeyAscii = 44 Or KeyAscii = 46 Then
        If InStr(1, TextBox4, Sep, vbTextCompare) = 0 Then
            KeyAscii = Asc(Sep)
        Else
            KeyAscii = 0
        End If
    End If
    End Sub
    Bonne soirée

  16. #16
    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
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour, Abed_H,

    tu sais que j'ime rigoler, non ?
    jbggg a choisi le point comme sé"pareteur décimal, il me semble..

    Alors ? suffit de ceci, dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Text1_KeyPress(KeyAscii As Integer)
     If KeyAscii = 8 Then Exit Sub
     If Trim(Str(Val(Text1.Text & Chr(KeyAscii) & "1"))) <> Text1.Text & Chr(KeyAscii) & "1" Then
       KeyAscii = 0: Beep
     End If
    End Sub
    et on se moque de Isnumeric, de Instr, etc...

  17. #17
    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
    Points : 15 546
    Points
    15 546
    Par défaut
    Bonsoir uchs,
    Dans ta correction, il manquait deux parenthèses. De même, dans "Textbox" & i, il est inutile d'utiliser str(i) qui en outre ajoute un espace indésirable
    En vba on a cstr qui est une contraction de "Trim(Str(...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If cstr(Val(Text1.Text & Chr(KeyAscii) & "1")) <> ......
    @jbggg
    Une explication sur la méthode, donc, puisque c'est ce que tu sembles avoir demandé. Je reprends le code sans le tableau
    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 CommandButton2_Click()
    Dim i as integer , msg as string
    msg = ""
    For i = 34 to 41 'le N° de tes textbox
            '"Textbox" & i correspond au nom de chacun des 8 texbox
            'Me.controls(variable) permet d'utiliser une variable ou un nom composé
            'pour utiliser tes contrôles - ici on veut savoir si le contrôle est vide
            If Me.controls("Textbox" & i)  = "" then 
                  'comme le message est identique pour cette même erreur pour
                  'tous les textbox traités, on le place dans une variable msg
                  Msg = "Il manque des informations"
                  MsgBox msg, vbCritical, "Informations manquantes"
                  Exit for 'dès qu'une erreur a été trouvé, on sort
            endif
    Next
    'Si msg contient un message c'est qu'on a une erreur, on renvoie donc 
    'dans le bon contrôle
    if msg <> "" then Me.controls("Textbox" & i).setfocus
    End sub
    Pour le contrôle des valeurs le principe reste le même, sauf que là, tu as trois tests différents et des N° de textbox qui ne se suivent pas.
    Tu peux continuer en utilisant if then elseif, (mais ça tu connais)
    Je te propose donc de continuer avec une autre méthode que ci dessus
    en reprenant le tableau.
    Je ne connais pas le N° du textbox manquant pour les angles horizontaux ( > 400) je retiens 34, 35, 38, 39 et 37 et 41 pour les verticaux. Tu corrigeras.
    Je reprends tout pour déjà éliminer au moins les erreurs que j'ai vues.
    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 CommandButton2_Click()
    Dim tablo As Variant, i As Integer, msg As String
        msg = ""
        'Test sur textbox vide
        For i = 34 To 41
                If Me.Controls("Textbox" & i) = "" Then
                       msg = "Il manque des informations"
                       MsgBox msg, vbCritical, "Informations manquantes"
                       Exit For
                End If
        Next
        If msg <> "" Then Me.Controls("Textbox" & i).SetFocus
     
        'test sur les valeurs
        tablo = Array(34, 35, 37, 41, 38, 39)
        For i = 0 To UBound(tablo)
             Select Case tablo(i)
                   Case 34, 38
                       If Val(Me.Controls("Textbox" & tablo(i))) > 400 Then
                            msg = "Vérifier votre valeur"
                            MsgBox msg, vbCritical, "Lecture avant"
                            Exit For
                       End If
                   Case 35, 39
                       If Val(Me.Controls("Textbox" & tablo(i))) > 400 Then
                            msg = "Vérifier votre valeur"
                            MsgBox msg, vbCritical, "Lecture arrière"
                            Exit For
                       End If
                   Case 37, 41
                       If Val(Me.Controls("Textbox" & tablo(i))) > 200 Then
                            msg = "Vérifier votre valeur"
                            MsgBox msg, vbCritical, "Angle vertical"
                            Exit For
                       End If
              End Select
        Next
        If msg <> "" Then Me.Controls("Textbox" & tablo(i)).SetFocus
        'si pas d'erreur, on masque la feuille
        point2.Hide
        hauteur2p.Show
    End Sub
    Pour cette seconde partie, c'est toi qui vois. J'espère que je n'ai pas laissé d'erreur de code.
    Bon week-end

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/12/2008, 07h19
  2. un wxtextCtrl qui accepte que des chiffres
    Par boubou00 dans le forum wxWidgets
    Réponses: 9
    Dernier message: 27/06/2007, 10h11
  3. forcer un TextField à n'accepter que des chiffres
    Par intik dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 01/02/2007, 15h43
  4. vérifier que ce sont que des chiffres ?
    Par netwebzone dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 27/12/2004, 11h32
  5. que des chiffres..
    Par roots_man dans le forum ASP
    Réponses: 2
    Dernier message: 18/11/2004, 15h31

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