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 :

Contrôle de saisie


Sujet :

Macros et VBA Excel

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut Contrôle de saisie
    Re-Bonjour ! (Je vais finir par vous esquinter la santé à ce rythme là )

    J'aurais une petite question pour savoir si ce que je souhaite est faisable

    En gros, je veux faire un contrôle de saisie dans une case. J'ai un InputBox dans laquelle je ne veux autoriser que des chiffres et qu'ils soient strictement supérieurs à 0. Jusque là, la fonction IsNumeric et comparer par rapport à 0 mon entrée suffiraient bien.

    Seulement cela implique une boucle If... Else. Le seul problème c'est que je suis dans mon "main" là. Je veux donc bloquer l'InputBox avec peut-être un message d'erreur mais sans avancer dans le programme. En cas de mauvaise saisie, je veux être réinvité à saisir une valeur et en rester là jusqu'à ce qu'une bonne valeur soit rentrée. Je ne veux pas passer dans un Else vu que mon programme ne peut être continué que si une valeur correcte est rentrée.

    J'aimerais donc savoir comment faire

    Merci encore

  2. #2
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    Fais voir déjà le code existant...

  3. #3
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bonjour,

    Un petit exemple d'utilisation de l'InputBox, introduit 0 ou une lettre ou un nombre correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test_nombre()
    Dim Nb As Single
     
    recom:
    Nb = Application.InputBox("Saisissez un nombre", Type:=1)
     
    If Nb <= 0 Then
        MsgBox "veuillez introduire un nombre supérieur à 0", vbCritical
        GoTo recom
    Else
        MsgBox "le nombre introduit est " & Nb & Chr(10) & "on peut poursuivre la procédure", vbInformation
    End If
     
    End Sub

  4. #4
    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,

    j'éviterais personnellement ce goto avec quelque chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    NB = -1 'je fais exprès de l'initialiser en négatif
      While NB <= 0
        NB = InputBox("Saisissez un nombre positif ")
        If NB <= 0 Then
          MsgBox "veuillez introduire un nombre supérieur à 0", vbCritical
        End If
      Wend

  5. #5
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Salut

    Citation Envoyé par DeaD78
    Seulement cela implique une boucle If... Else
    juste en passant, un bloc If expression Then... Else... End If n'est pas une boucle mais bien une structure de contrôle (conditionnelle).

    Pour la validation de ton InputBox, tu dois tester (dans la condition de boucle) que l'expression saisie
    • Est un nombre
      et
    • est suppérieure à zéro
      et
    • n'est pas une chaîne vide


    Ce qui devrait donner quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Do
        NB = InputBox("Saisissez un nombre positif ")
        If NB <= 0 Then
            MsgBox "veuillez introduire un nombre supérieur à 0", vbCritical
        End If
    Until ((NB <> "") And (IsNumeric(NB)) And (CInt(NB) > 0))
    Qui devrait boucler jusqu'à ce que (Until) les conditions soit remplies.

    Ceci dit, tu peux mettre plus d'arguments dans ton InputBox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Variable = InputBox("Message", "Titre", "Valeur par défaut")

  6. #6
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Re les gens,
    Citation Envoyé par zazaraignée Voir le message
    Pour la validation de ton InputBox, tu dois tester (dans la condition de boucle) que l'expression saisie Est un nombre
    non, en précisant que l'InputBox est de Type:=1, la vérification est automatique et un message sera automatiquement afficher si la saisie n'est pas un nombre valide

    @ UC, je n'avais pas penser à une boucle infinie qui recommence si la valeur ne correspond pas à la condition <=0 mais juste pour ma part de féminité qui réclame à cause de sa curiosité insatisfaite , pour quelle raison éviter le GoTo ? Tu en as sûrement une bonne mais cela me ferait plaisir de la connaître afin d'aller me coucher un peu moins ignare

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonsoir

    Personnellement, et sans vouloir troller, je ne vois pas pourquoi ucfoutu initialise NB à -1... Il me semble que 0 pourrait convenir, sauf si quelque chose m'échappe...

    De plus, la boucle infinie impose la saisie d'un nombre positif avant de poursuivre. Pour ma part, je préfère permettre à l'utilisateur une sortie honorable sans devoir saisir une valeur positive.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    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
    Citation Envoyé par fring Voir le message
    @ UC, je n'avais pas penser à une boucle infinie qui recommence si la valeur ne correspond pas à la condition <=0 mais juste pour ma part de féminité qui réclame à cause de sa curiosité insatisfaite , pour quelle raison éviter le GoTo ? Tu en as sûrement une bonne mais cela me ferait plaisir de la connaître afin d'aller me coucher un peu moins ignare
    Bonsoir, fring,

    - peut-être pour éviter de recevoir les claques que j'ai, en mon temps reçues...(pour avoir mis des Goto partout où ils étaient largement évitables)
    - peut-être que l'une de mes applications, développées à l'époque sous Pick Ultimate (OS devenue rarement utilisée) , a dû être complètement reprise en vue de son passage sous Unix via Pick Universe , à la demande d'un chef de projet, à cause de certaines habitudes dont j'abusais, parmi lesquelles le GOTO ...
    - peut-être pour permettre une plus grande facilité de maintenance
    - peut-être pour éviter à l'appli d'aller chercher ses étiquettes
    - peut-être, plus simplement pour éviter le plat de spaghetti...
    tu connais les spaghetti codes ?
    Non ?
    voilà :
    http://en.wikipedia.org/wiki/Spaghetti_code

    Ceci étant dit : il y a des cas où l'on ne peut les éviter.... mais, lorsqu'on le peut, il faut les éviter, ces "zoizeaux"-là, crois-moi ... Ils ne valent pas vraiment plus cher que les On error Resume Next and co...
    Amitiés.

  9. #9
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    J'adore les spaghet , je regarderai ça plus attentivement lorsque mon second neurone sera à nouveau opérationnel

    Tu as sans doute raison pour des grosses appli's qui contiennent une multitudes de GoTo dans tous les sens mais là...
    Soit, autant ne pas prendre les mauvaises habitudes dès le départ, merci pour l'info

  10. #10
    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
    Bonsoir Pierre Fauconnier,

    je lis ...

    Citation Envoyé par DeaD78 Voir le message
    J'ai un InputBox dans laquelle je ne veux autoriser que des chiffres et qu'ils soient strictement supérieurs à 0.
    Le -1, maintenant ?
    J'aurais pu mettre - 9 ou -8 ...(et pas forcément 0 ... pas raciste...)

    Mais voilà une autre façon, allez... sans -1, sans 0, ... (pourquoi pas ?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Dim couic As Boolean, nb As String
      couic = False
      While Not couic
        nb = InputBox("Saisissez un nombre positif ou A pour abandonner")
        If (Not IsNumeric(nb) Or Val(nb) <= 0) And UCase(nb) <> "A" Then
          MsgBox "veuillez introduire un nombre supérieur à 0", vbCritical
        Else
          couic = True
        End If
      Wend

  11. #11
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    Une InputBox de Type:=1 ? Connaissais pas! Faut que j'essaie... Sous OfficeXP ?... Faut dire que j'ai commencé à 'pitonner' tu VBA avec Office 95 (ou si vous préférez, Excel 7) et par la suite, et longtemps avec ça, avec Office 97. Il y a peut-être quelques nouveautés ou particularités qui m'ont échappé entre temps...

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut
    Bonjour le Fil et Le Forum
    ma première contribution ici ! (lol)
    ci-dessous une petite fonction a adapter et à mettre dans un module

    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
    50
    51
    52
    53
    54
    55
    Function ControleLaSaisie(Ch As Integer, ByVal Char As Integer)
     
    'Function ControleLaSaisie(TextBox As MSForms.TextBox, ByVal Char As Integer)
    Select Case Ch
    Case 0 'toutes les entrées
        ControleLaSaisie = Char
        Exit Function
    Case 1 'Texte et Espace
     If Char = 32 Or (Char >= 65 And Char <= 90) _
      Or (Char >= 97 And Char <= 122) Then
         ControleLaSaisie = Char
         Exit Function
     End If
    Case 2 'Chiffres seul
     If Char >= 48 And Char <= 57 Or Char = 46 Then
         ControleLaSaisie = Char
         Exit Function
     End If
    Case 3 'Texte, Espace et Chiffres
     If Char = 32 Or (Char >= 65 And Char <= 90) _
      Or (Char > 97 And Char < 122) _
      Or (Char > 48 And Char < 57) Then
         ControleLaSaisie = Char
         Exit Function
     End If
    Case 4 ' Chiffres & Symboles divers
     If (Char >= 48 And Char <= 57) _
      Or (Char >= 123 And Char <= 255) _
      Or (Char >= 33 And Char <= 47) Then
         ControleLaSaisie = Char
         Exit Function
     End If
    Case 5 'Texte, Espace & Symboles divers
     If Char = 32 Or (Char >= 65 And Char <= 90) _
      Or (Char >= 97 And Char <= 122) _
      Or (Char >= 123 And Char <= 255) _
      Or (Char >= 33 And Char <= 47) Then
         ControleLaSaisie = Char
         Exit Function
     End If
    Case 6
      If Char < 1 Then
        ControleLaSaisie = Char
        Exit Function
      End If
    End Select
    ControleLaSaisie = 0
    End Function
     
    'espace 32
    'Maj 65 à 90
    'min 97 à 122
    'chiffre 48 à 57
    'signes divers(1) 33 à 47
    'signes divers(2) 123 à 255
    que l'on appele avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub TextBox2_KeyPress(ByVal KeyAscii As _
        MSForms.ReturnInteger)
    Choix = 2
    KeyAscii = ControleLaSaisie(2, KeyAscii)
    End Sub
    Bon courage et à +
    Denis

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    salut ucfoutu,

    (Sans troller, j'le jure)

    Je sais que la saisie doit être positive non nulle, mais une boucle infinie tant que l'on ne saisit pas un nombre positif impose la saisie d'une valeur. Si l'utilisateur ne connaît pas la bonne valeur à saisir, soit il doit planter l'application, soit il saisit n'importe quelle valeur pour laisser le code continuer. Donc, pour moi, la boucle infinie est ergonomiquement une erreur de programmation. Et comme je connais ton souci d'une ergonomie orientée utilisateur, ...

    Pour le -1, je me doute que l'on aurait pu mettre -9 ou -2543456. Je me posais la question par rapport à ta remarque
    NB = -1 'je fais exprès de l'initialiser en négatif
    et je n'ai toujours pas de réponse (cela devient une habitude avec toi ). Un débutant en VBA risque de chercher longtemps pourquoi il faut "faire exprès de l'initialiser en négatif" alors qu'un 0 fonctionne très bien. Me trompé-je? Aurai-je la réponse?

    Allez, bonne journée, et puis aussi bonne chance...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    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, Pierre Fauconnier,

    J'avais bien compris que tu reprochais l'imposition absolue de la saisie d'une valeur positive, pour ne pas se retrouver dans la situation d'une boucle infinie... (imposition qui existait d'ailleurs également avec le code "GOTO "qui avait été proposé ...)
    C'est la raison pour laquelle j'ai ajouté (voir mon dernier message) une sortie possible par la frappe de la touche A (A pour abandon) ...

    Edit : et si j'avais (dans le 1er code) choisi d'initialiser à 0 : il aurait également fallu expliquer pourquoi et l'on revenait au même...
    Le commentaire aurait pu simplement être : "je fais ici exprès d'initialiser avec une valeur non recevable"...(0, négative)

    Pour en revenir à l'emploi du GOTO (que je suggère, on l'a vu, d'éviter chaque fois qu'on le peut) :

    Qu'il s'agisse de VBA, VB, ou de tout autre langage de développement, les aspects sont toujours les mêmes.

    Il est peut-être utile de rappeler que l'on trouve sur la pluspart des forums une ou plusieurs discussions relatives à cet emploi.

    J'ai voulu choisir une (très longue) discussion sur ce thème tout près d'ici ...

    ===>>>

    http://www.developpez.net/forums/showthread.php?t=75764

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Bonjour à toutes et à tous !

    Tout d'abord, désolé de ma réponse tardive, j'ai pris, malgré moi, une demi-journée de repos.

    Sinon, je voulais vous remercier car ces différentes manières de faire représentent exactement ce que je cherchais à faire. Merci de votre contribution à toutes et à tous !

    @zazaraignée : merci pour la remarque sur la "boucle". C'était une erreur de langage de ma part étant donné que je connais pourtant bien la différence entre une boucle (for, do ... while,...) et une condition.

    @tous : pour mettre mon petit grain de sel dans le débat, je dois avouer que je me suis aussi fait taper sur les doigts à cause de l'utilisation de ces GOTO. Raison invoquée : "c'est un code sale !" ou quelque chose dans le genre.

    En tout cas merci !

    Bonne journée à tous.

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

Discussions similaires

  1. Contrôle de saisie formulaire
    Par miram dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/02/2006, 08h33
  2. contrôle de saisie sur un espace
    Par oceane751 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/01/2006, 12h04
  3. contrôle de saisie menu déroulant
    Par shnouf dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 05/01/2006, 16h30
  4. contrôle de saisie
    Par oceane751 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/01/2006, 11h24
  5. [debutant] contrôle de saisie et formulaire
    Par oceane751 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/11/2005, 22h29

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