Continuer boucle si Isnumerci = false

Bonjour le forum,

je souhaite relancer la boucle jusqu'à que la valeur saisie par l'utilisateur soit un nombre (entier serai encore mieux). Certe je peux utiliser un nombre conséquent de condition, mais je souhaite déjà utiliser la fonction IsNumeric(). Voici mon bout de code.

Do
    NbE = InputBox("Combien de fois voulez vous jouer ?")
    'If Not IsNumeric(NbE) Then
    ToF = IsNumeric(NbE)
    If ToF = False Then
        MsgBox "Ce n'est pas un nombre ! Veuillez recommencer... "
        Else
    End If
Loop While ToF = False 

Salut,

Je ne saisie pas vraiment ton problème... Mais bon voici un exemple..

Exemple de control de valeur :

Do

    nbe = InputBox("Combien de fois voulez vous jouer ?  (1-1000)")
    'Pour la touche Cancel
    If nbe = "" Then Exit Sub
    If nbe <= 1000 Then 

        'On verifie que c'est numerique
        tof = IsNumeric(nbe)
        If tof = False Then
            MsgBox "Ce n'est pas un nombre ! Veuillez recommencer... "
        Else
            If nbe - CInt(nbe) > 0 Then
                MsgBox "Veuillez saisir un nombre entier"
                tof = False
            End If
        End If

    Else
        MsgBox "Veuillez saisir un nombre entre 1 et 1000"

    End If

Loop While tof = False

MsgBox "traitement suivant  : " & nbe

Ton code est bien, mais un UserForm te permettrai d'alleger les controles en te servant des propriétés (longueur max etc...)

Damien

Salut Bigdams,

merci pour ce code mais je constate le même problème que chez moi, le programme plante si j’inscris une lettre et même si j'écris un nombre entier ! Erreur d’exécution (13) incompatibilité de type.

Re,

Je n'ai pas d'erreurs sur 2003, cela vient peut etre de la version mais j'ai une doute.

Cela plante sur quelle ligne ?

Sinon une solution qui fonctionne a tout les coups :

Private Sub CommandButton1_Click()
Dim nbe As String
Dim flag As Boolean

flag = False
While flag = False
 nbe = InputBox("Combien de fois voulez vous jouer ? ")
 flag = verifnum(nbe)
 If flag = False Then MsgBox "Veuillez Saisir un nombre entier"
Wend
'TRAITEMENT
End Sub
Function verifnum(contenu As String) As Boolean
'Retourne TRUE si numeric
'Retourne Flase si pas numeric ou pas entier
verifnum = True
For i = 1 To Len(contenu)
    If Asc(Mid(contenu, i, 1)) < 48 Or Asc(Mid(contenu, i, 1)) > 57 Then
        verifnum = False
    End If
Next
End Function

Damien

Bonjour tous,

Bobléponge -> Note que les messages privés, comme le nom l'indique sont réservés... aux messages privés et non aux questions techniques.

Suite à tes explications où tu ne parle pas d'InputBox, Voir cette démo

A+

Edit : -> Damien, tu peu directement testé la variable

   flag = IsNumeric(nbe)

Merci Damien, j'ai quelques soucis concernant le code puisqu'à mon avis je place le code au mauvais endroit. Puisque j'ai l'ensemble du code dans "Microsoft Excel Objects" dans Feuil1

J'ai donc créer un module ou j'ai collé "Function verifnum". Faut-il créer un module de classe ? Voici mon fichier :

Ps: c'est le bordel car je débute... J'essaye d'ajouter des fonctions supplémentaire au fur et à mesure. J'aimerais bien utiliser le système d'appel de fonction avec Procédure "maître" et "esclave" pour donner un peu d'ordre dans mes macros. D'où la question précédente.

lermite a écrit :

Bonjour tous,

Bobléponge -> Note que les messages privés, comme le nom l'indique sont réservés... aux messages privés et non aux questions techniques.

Suite à tes explications où tu ne parle pas d'InputBox, Voir cette démo

A+

Edit : -> Damien, tu peu directement testé la variable

   flag = IsNumeric(nbe)

Oui effectivement . Cependant je ne souhaitais pas ouvrir un poste pour une question mais comme il me fallait une réponse pour poursuivre mon avancé dans le VBA et que je ne n'y parvenais pas alors j'ai tout de même ouvert une discussion.

7test.zip (18.68 Ko)

Pour lermite :

Edit : -> Damien, tu peux directement tester la variable

   flag = IsNumeric(nbe)

Je suis d'accord.

Par contre IsNumeric plante si la valeur est trop grande (overflow)

D'où ma deuxième solution..... Y a sans doute plus simple.

Pour Bobléponge

Tu crée un module (qui s'appel par défaut Module1) et tu colle la fonction dedans.

Tu l'appelles depuis un autre endroit (feuil1 ou autre) par verifnum(....)

Si tu as une erreur tu peux aussi écrire : Module1.verifnum(...)

Les modules de classes sont pour la définitions des classes. Un peu compliqué si tu débutes, tu verras ça plus tard...

Truc et astuces : si tu appuies sur CTRL+Espace tu auras une liste de choix.

Donc dans ton script tu écris verif puis tu tapes sur CTRL+ESPACE tu auras une liste de choix (si tu ne trouves pas la fonction ca ne marchera pas)

Damien

Par contre IsNumeric plante si la valeur est trop grande (overflow)

Tu a entré quoi dans l'InputBox ?

J'ai essayé de le planter et n'y suis pas arrivé ?

Au temps pour moi, c'est à la ligne

If nbe - CInt(nbe) > 0 Then

C'est la fonction Cint qui plante (ce qui est normal), mais je n'ai pas trouvé de solution pour récuperer la valeur entière d'un grand nombre.

Damien

CInt(nbe) limiter à +- 32200

Cdbl(nbe) devrait convenir.

Mais si c'est pour tester le bouton annuler tu dois mettre

If nbe <>"" then

La variable nbe étant de prime abord un string.

A+

Pour lermite : Cdbl ne renvoi pas la valeur entière exemple : ( cdbl(3.62) = 3.62)

Pour tester si la valeur est entiere je faisais 3.62 - (Cint(3.62)) > 0 ce qui dans cas fait 3.62-3 = 0.62 => Nombre relatif donc pas accepté.

Pour Bobléponge , j'ai modifié ton fichier (j'ai noté où dans le code)

Damien

11testbobeponge.zip (18.11 Ko)

OK, j'avais pas compris le but, alors c'est avec Clng(nbe)

EDIT : mais plus simplement

If nbe <> int(nbe) then ->> pas entier

Bien joué.

Je l'avais oublié celui la.

Merci

Damien

Messieurs ne nous emballons pas trop vite, n'oubliez pas que je débute . Merci pour ces modifications, cependant toujours le même problème !!

Damien, j'ai téléchargé le fichier que tu as posté et lorsqu'à la question : Combien de fois voulez vous jouer ? je répond "a" etc... le logiciel plante... Pourtant je suis sur excel 2010 et plus 2007. Je ne désespère pas mais c'est tout de même surprenant que chez toi cela fonctionne et pas chez moi.

que veux-tu dire par

Messieurs ne nous emballons pas trop vite

Je ne vois pas qui s’emballe ici ??

remplace la partie ci-dessous

'************* MODIF ****************************
Dim flaq As Boolean
flaq = False
Do
    nbe = InputBox("Combien de fois voulez vous jouer ? (1 à 16 max")
        If nbe = "" Then Exit Sub
        If Not IsNumeric(nbe) Then
             MsgBox "Veuillez saisir uiquement un nombre entre 1 et 16"
        ElseIf Int(nbe) <> nbe Or nbe > 16 Or nbe = 0 Then
            MsgBox "Veuillez saisir un nombre entier entre 1 et 16"
        Else
            flaq = True
        End If
Loop While Not flaq

A+

Bonsoir

Une idée en passant

Pourquoi ne pas utiliser la méthode InputBox au lieu de la fonction, cela simplifierait la programmation (du moins je le pense)

La macro modifiée pourrait donner ceci

Option Explicit

Sub Calcul()
Dim Nb1 As Integer, Nb2 As Integer, nbe As Integer, Reponse As Integer, Total As Integer
Dim NomDif As String
Dim NbP As Byte
Dim Rep
Dim Base As Integer
Dim I As Integer

'Variable qui définit le nombre de point
Dim NbrPoints As Byte

  Randomize

  'Début du programme
  Do
    Rep = Application.InputBox("Veuillez saisir votre nom", "Joueur", Type:=2)
    If Rep = False Then Exit Sub
  Loop Until Rep <> ""
  MsgBox "Bienvenu " & Rep

  Do
    Rep = Application.InputBox("Choisissez le niveau de difficulté; 1: Facile; 2:Difficile", "Niveau", 1, Type:=1)
    If Rep = False Then Exit Sub
  Loop Until Rep = 1 Or Rep = 2

  If Rep = 1 Then
    Base = 100
    NomDif = " facile(s)"
  Else
    Base = 1000
    NomDif = " difficile(s)"
  End If

  Do
    Rep = Application.InputBox("Combien de fois voulez vous jouer ? (1 à 16 max", 2, Type:=1)
    If Rep = False Then Exit Sub
  Loop Until Rep > 0 And Rep < 17

  nbe = Rep

  'Début de la partie
  If nbe < 2 Then
    MsgBox "" & nbe & " partie lançée" & NomDif
  Else
    MsgBox "" & nbe & " parties lançées" & NomDif
  End If

  For I = 1 To nbe
    Nb1 = Int((Base * Rnd) + 1)
    Nb2 = Int((Base * Rnd) + 1)
    Total = Nb1 + Nb2

    Rep = Application.InputBox("Combien fait la somme de " & Nb1 & " et de " & Nb2 & "?", Type:=1)
    If Rep = False Then Exit Sub

    Reponse = Rep

    If Reponse <> Total Then
      MsgBox "Faux ! La réponse était : " & Total, vbExclamation, "Erreur"
    Else
      MsgBox "Réponse exacte !"
      archivage 'Appel de la procédure "Archivage"
      NbrPoints = NbrPoints + 1 'Incrémente NbrPoints à chaque fois que la procédure est appelée
    End If

    NbP = NbP + 1
    Select Case NbP
      Case 1
        MsgBox "Manche 1 terminée"
      Case 2
        MsgBox "Manche 2 terminée"
    End Select
  Next

  MsgBox "Votre score est de " & NbrPoints
End Sub

A voir

que veux-tu dire par

Messieurs ne nous emballons pas trop vite

Je ne vois pas qui s’emballe ici ??

remplace la partie ci-dessous

Je me suis mal exprimé, je ne parlais pas de dispute mais de la difficulté que j'éprouve à déchiffrer vos débats sur le code

J'ai remplacé et maintenant cela fonctionne à merveille !! Peu importe le caractère que j’inscris, le programme ne plante plus. Il ne reste plus qu'à comprendre les modifications.... Quand je constate la facilité avec laquelle vous programmez, c'est une formalité pour vous alors que pour moi c'est le contraire.

Merci à vous 3. Je reviendrai vers vous lorsque je butterai sur un nouveau problème sur ce même programme.

D’ailleurs je complète ce poste par une question : Quelqu'un peut t'il m'expliquer clairement le code de la fonction "verifnum" ?

Comme dit précédemment, je reviens vers vous car je me heurte à un petit problème. Je souhaite à présent inclure une multiplication. II faut donc proposer à l'utilisateur le choix entre des multiplications ou des additions. J'ai voulu alléger la feuil1 en créant des procédures (multiplication et addition) comme celle que j'ai crée auparavant (Archivage). Mais je ne suis pas du tout sûr de mon coût et le débogage me le fait comprendre. Premièrement, pouvez vous me dire si oui ou non je peux procéder de cette manière. Il suffit de me guider et j'essayerai de trouver par moi même.

Voici le fichier :

12test.zip (18.68 Ko)

Salut,

Quelqu'un peut t'il m'expliquer clairement le code de la fonction "verifnum" ?

Version commenté

Function verifnum(contenu As String) As Boolean
'Retourne TRUE si numeric
'Retourne Flase si pas numeric ou pas entier
verifnum = True
For i = 1 To Len(contenu)  'Pour chaque lettre dans la chaine de caractère 'contenu'
    If Asc(Mid(contenu, i, 1)) < 48 Or Asc(Mid(contenu, i, 1)) > 57 Then 'On verifie que le code ASCII du caractère est compris entre 48 et 57
        'Code ASCII 48 = 0
        'Code ASCII 49 = 1
        'etc...
        'Code ASCII 57 = 9
        verifnum = False 'S'il est pas compris entre ces deux bornes alors ce n'est pas un nombre
    End If
Next
End Function

Dis moi si cela est assez clair.

Je regarde ton fichier.

Damien

D'accord c'est déjà beaucoup plus clair, j'avais totalement oublié le code ASCII, le C++ est loin derrière moi... En tout cas merci pour ces explications clair.

J'attends donc l'aide pour créer un choix de calcul.

Rechercher des sujets similaires à "continuer boucle isnumerci false"