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 :

Problème avec IsNumeric


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 6
    Par défaut Problème avec IsNumeric
    Bonsoir à tous... Alors voila, je suis novice en VBA (je suis juste en train de nager dedans pour un travail scolaire)...

    J'ai utilisé IsNumeric pour tester si trois valeurs encodées sont des nombres ou pas et ensuite j'ai demandé à ce que si IsNumeric retourne la valeur "faux", il effectue une série de calcul. Le soucis, c'est que ça marche parfaitement pour mes deux premières valeurs encodées (A et B) mais pas pour C... J'ai droit à valeur inconnue alors que j'ai fais pareil pour les trois... ça doit être une bête erreur de débutant mais je n'arrive pas à m'en sortir... J'ai fais pas mal de sites mais je n'ai pas trouvé de solution.

    Alors voici le début de mon code (très basique évidemment et surement pas parfait) dans lequel se trouve IsNumeric :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function ecriture_fonction(A, B, C As Double) As String
     
    Dim AA, BB, CC As Boolean
     
    AA = IsNumeric(A)
    BB = IsNumeric(B)
    CC = IsNumeric(C)
     
    If (AA = False Or BB = False Or CC = False) Then
    MsgBox "Entrez uniquement des nombres... merci!", 0 + 48, "Erreur : pas de variables!"
    ecriture_fonction = "Erreur : lettre"
    Else
    Merci d'avance et ... bonne soirée

  2. #2
    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
    IsNumeric fonctionne avec une chaîne de caractère, pas une valeur numerique

    A et B, non typées (pas beau pas beau) sont des Variant. C est typée en Double (donc pas une chaîne de caractères !)

    De surcroit : il semble que tu contrôles une saisie, non ?
    Si saisie ===>> c'est forcément une chaîne de caractères (String) et non une valeur numérique, que tu saisis (alors ? ===>> C n'est pas un double mais un String)

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 6
    Par défaut
    Merci de ta réponse...

    Ah et bien tu vois, on m'a appris (d'une superbe manière je te l'accorde... j'en pleure) que noté comme cela, A et B étaient aussi typés... Donc si je comprend bien (désolé mais je fais mon possible), si je type A et B aussi, ça ne marchera plus non plus et donc... comment pourrais-je vérifier si les nombres entrés sont bien des nombres et pas des lettres?

  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
    Re-belote,

    en typant A en String, B en String et C en string (tu m'as lu ?)
    Isnuméric considère des strings

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 6
    Par défaut
    N'as tu pas amélioré ta réponse par la suite? Car il n'y avait pas la deuxième partie du texte quand JE T'AI LU (et oui.. pas besoin d'être désagréable... j'éviterai de demander de l'aide puisque apparemment ce n'est pas bien vu... désolé de ne pas être d'un top niveau)

  6. #6
    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 ucfoutu Voir le message
    IsNumeric fonctionne avec une chaîne de caractère, pas une valeur numerique

    A et B, non typées (pas beau pas beau) sont des Variant. C est typée en Double (donc pas une chaîne de caractères !)
    De surcroit : il semble que tu contrôles une saisie, non ?
    Si saisie ===>> c'est forcément une chaîne de caractères (String) et non une valeur numérique, que tu saisis (alors ? ===>> C n'est pas un double mais un String)
    Je n'ai rien complété du tout !
    De surcroit : même la première partie était claire ! (en rouge dans la citation ci-dessus)à
    Je ne suis pas désagréable, mais il n'est pas certain que tu sois attentif ..

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 6
    Par défaut
    Il y a une différence entre être attentif (ce que je suis même si je reconnais que je commence à fatiguer à force d'essayer et d'essayer encore) et ne pas trop s'en sortir... Je fais mon possible pour essayer de comprendre... il faut bien un début à tout non?

    En fait, j'ai bien compris... il faudrait que je mette A,B et C en string! Mais le problème, c'est que j'ai besoin qu'ils soient des doubles (puisque je les utilise dans des calculs... c'est correct ce que je dis non? j'espere avoir au moins compris cela ) ... Il faudrait donc que je convertisse les double en string juste pour le IsNumeric?

  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
    OK,

    On passe alors à la lecture de la 2ème partie de mon message précédent :
    C'est bien une saisie, que tu contrôles. Où (dans quoi) se fait la saisie ?
    Ma réponse dépendra de la tienne à cette question.

  9. #9
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 6
    Par défaut
    Alors oui c'est bien une saisie (dans trois cellules d'excel)... Ces saisies doivent être de valeurs numériques

  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
    Alors (je n'ai pas Excel sous la main pour contrôler) :
    - si ces cellules sont de format numùérique : lis leur propriété Text et non leur propriété Value
    - par ailleurs : plusieurs fonctions te sont offertes par VBA pour transformer des valeurs numériques en chaînes de caractères (regarde Str, Cstr et Ccur dans ton aide en ligne)

    J'appelle enfin ton attention sur le fait que IsNumeric ne reconnait comme valeurs numériques, lorsqu'elles comportent des décimales, que si le séparateur de décimales est la virgule et non le point

    Il est important si tu es débutant, qu'après avoir lu ces rubriques, tu procèdes à quelques petits exercices qui vaudront mieux qu'un long discours.

    En voilà un, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim c As String
    c = "3.3"
    MsgBox IsNumeric(c)
    MsgBox CCur(Val(c))
    MsgBox IsNumeric(CCur(Val(c)))
    Invente d'autres exercices de l'espèce, jusqu'à ce que tout devienne clair dans ton esprit. C'est ce que j'ai fait à mes débuts et je te le conseille donc.

  11. #11
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonsoir UC, kilowatt
    sur les conseils d'UC, j'aurais écrit comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function ecriture_fonction(A As String, B As String, C As String) As Double
     
    If IsNumeric(A) = False Or IsNumeric(B) = False Or IsNumeric(C) = False Then
    MsgBox "Entrez uniquement des nombres... merci!", 0 + 48, "Erreur : pas de variables!"
    ecriture_fonction = "Erreur : lettre"
    Else
    ecriture_fonction = CCur(Val(A)) + CCur(Val(B)) + CCur(Val(C))
    End If
    End Function
    mais j'ai remarqué que le message (en cas d'écriture erronnée) se répète 3 fois
    donc à améliorer

    bonne nuit
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  12. #12
    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,Krovax, oups...., pardon ...casefayere

    La valeur de True est -1, celle de false est 0
    On en profite donc ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Function controlons(A As String, B As String, C As String) As Boolean
      If Abs(IsNumeric(A) + IsNumeric(B) + IsNumeric(C)) = 3 Then
        controlons = True: Exit Function
      End If
      MsgBox "faites attentions à vos saisies !"
    End Function
    Allez ... une autre pour les amoureux (pas moi) du "On Error Resume Next :
    (ici, en supposant que le séparateur décimal est la virgule... Si c'est le point, remplacer cdbl par val
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Function controlons(A As String, B As String, C As String) As Boolean
      controlons = True
      dim toto as double
      On Error Resume Next
      toto = CDbl(A) + CDbl(B) + CDbl(C)
      If Err > 0 Then
        controlons = False
        MsgBox "mauvaises saisies"
      End If
    End Function
    Rigolo, non ?

  13. #13
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bien compris UC mais je ne suis pas Krovax

    Bonne nuit
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  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
    Oups (j'ai honte) ===>> corrigé

    Bonne nuit à toi également.

  15. #15
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    je n'ai pas eu le temps de voir ta modif, on s'est croisé, pas de problème pour le lapsus (krovax est un mec bien)

    oui rigolo, la deuxieme solution, mais j'ai tant vu de critiques sur l'utilisation du on error que.......

    re bonne nuit
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  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
    Par défaut
    Tu as bien raison !
    Je vomis moi-même l'utilisation de cette abomination de On Error...

    Revenons à nos moutons ...
    Aucune des solutions ne me plait. Pauvre utilisateur qui se ferait remonter les bretelles sans même savoir quelle est la valeur mal saisie !!!

    Faire au moins ceci, par pitié pour lui ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Function controlons(A As String, B As String, C As String) As Boolean
       Dim toto As String
       toto = toto & IIf(IsNumeric(A), "", A) & vbCrLf
       toto = toto & IIf(IsNumeric(B), "", B) & vbCrLf
       toto = toto & IIf(IsNumeric(C), "", C) & vbCrLf
       If toto = vbCrLf & vbCrLf & vbCrLf Then
         controlons = True
       Else
          MsgBox "valeur(s) mal saisie(s) : " & vbCrLf & toto
       End If
    End Function
    Et encore ... Je passerais plus volontiers les 3 adresses de cellules, traiterais leur contenu dans la fonction et retournerais True si Bon ou False (si pas bon) en signalant la/les cellules et en m'y mettant (select) ... dans la 1ère si plusieurs fausses

  17. #17
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 6
    Par défaut
    Merci beaucoup à vous tous pour vos réponses...

    Finalement, j'ai utilisé la simplicité (mon but n'étant pas de faire un truc parfait mais juste un programme qui marche pour un examen basique de débutant...)

    J'ai donc mis mes saisies en variant...

    Du coup, ça marche nickel, j'ai juste un soucis pour les nombres négatifs (évidement le "-" n'est pas un nombre donc ma msgbox se pointe... ce que je ne souhaite évidemment pas)...

  18. #18
    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
    Bon...
    Désolé pour toi (précisément par ce que tu es débutant) que tu aies choisi de typer en variant... (ce qu'il faut systématiquement éviter de faire !)...
    Pour ton information, maintenant :
    Teste donc le dernier code avec des nombres négatifs ===>>> pas de problème !
    mais bon... nul ne sera ici plus royaliste que le roi (il est simplement dommage que tu ne cherches pas à l'être...)

Discussions similaires

  1. Problème avec IsNumeric
    Par mademoizel dans le forum ASP
    Réponses: 2
    Dernier message: 24/01/2008, 21h13
  2. Problème avec isnumeric
    Par avigeilpro dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 22/06/2007, 04h10
  3. Problème avec isnumeric
    Par Reservoir_Dogs dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 07/08/2006, 03h06
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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