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 :

[E-03] Test sur un type de variable


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 28
    Par défaut [E-03] Test sur un type de variable
    Bonjour,

    J'aimerais faire un test sur une variable que je rentre via un InputBox.
    Le problème c'est que quand je rentre un nombre via un InputBox il considère que c'est un string et pas un double.

    J'ai besoin de faire ce test car si l'utilisateur rentre autre chose qu'un double il doit resaisir et j'affiche pour cela un nouveau InputBox.

    Voilà ce que j'ai fait pour le moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim inter() As Variant
     
    inter(1) = InputBox("Pondération du moins bon performer")
     
    Do Until VarType(inter(1)) = vbDouble
    inter(1) = InputBox("Pondération du moins bon performer", "Erreur lors de la saisie précédente")
    Loop
    Et quand je saisis 1 par exemple ca boucle alors que ca devrait pas car 1 est bien un Double.

    Merci d'avance,
    Arnaud.

  2. #2
    Membre chevronné Avatar de drakkar_agfa
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 618
    Par défaut
    Bonjour,

    Avec ceci, tu peux convertir ton String en double

  3. #3
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 28
    Par défaut
    Je ne veux pas convertir mon string en Double.

    J'explique un peu plus ce que j'aimerais faire.

    - Je demande à l'utilisateur de me rentrer la pondération qu'il souhaite, mais il faut que cette donnée soit un nombre (idéalement un double pour vba),
    - Puis faire un test pour savoir si ce qu'il a rentré est bien un Double ou pas
    - Si c'est un Double pas de problème on passe à la suite
    - Si ce n'est pas un Double on lui demande de rerentrer ce qu'il voulait rentrer.

    Typiquement cela permet d'éviter les erreurs de frappes sont relancé à chaque fois tout le programme.

    Si quelqu'un à une solution on souhaite des compléments d'informations, demandez.

    Merci d'avance,
    Arnaud.

  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,
    la caractéristique d'un double est d'être un numérique et d'inclure les single, les integer et les long .... Donc, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Command1_Click()
      inter = "on ne s'en préoccupe pas"
      While Not IsNumeric(Replace(inter, ".", ","))
        inter = InputBox("Pondération du moins bon performer")
      Wend
    End Sub
    J'ai ici utilisé le Replace car je ne sais pas comment tu imposes la saisie (avec quel séparateur de décimales, puisque isnumeric aura besoin de la virgule)
    Et j'ai évité une gestion d'erreur
    L'exemple ci-dessus est donc polyvalent.
    Que faire ensuite du résultat (inter) saisi ?
    Simple ===>> l'inverse si tu dois l'utiliser en valeur numérique pouir des opérations, genre, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    valinter = val(replace(inter,","".))
    ' et pour preuve ====>>
     MsgBox valinter & "  " & valinter + 2.3
    et ainsi, ce sera toujours vrai et toujours bon, que l'utilisateur saisisse avec une virgule ou avec un point.

  5. #5
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 28
    Par défaut
    Bon en fait j'ai essayé la solution de uctofu est cela à l'air de marcher.
    J'essaierai avant de poster la prochaine fois (pas encore les réflexes d'un bon développeur).

    Merci de votre aide,
    Arnaud.

  6. #6
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 28
    Par défaut
    Re salut à tous,

    J'ai remis ce topic en non résolu, car j'ai une autre question sur le sujet.

    Comment puis je modifié le code pour que le test que je veux effectuer teste si la valeur rentrée par l'utilisateur est un entier ou pas ?

    Merci d'avance,
    Arnaud.

  7. #7
    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
    "une" méthode (à adapter)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Command1_Click()
    Ok as boolean
      inter = "on ne s'en préoccupe pas"
      While Not ok
        inter = InputBox("Pondération du moins bon performer")
        ok = IsNumeric(Replace(inter, ".", ","))
        ok = ok and inter = Int(inter)
        ok = ok or inter = ""
      Wend
    End Sub

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

    ou encore en jouant sur la division par \1 (notons bien \1 et non /1), en s'inspirant de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto = "1,1"
     titi = Val(Replace(toto, ",", "."))
     MsgBox IIf(titi \ 1 = titi, "entier", "pas entier")

  9. #9
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 28
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    "une" méthode (à adapter)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Command1_Click()
    Ok as boolean
      inter = "on ne s'en préoccupe pas"
      While Not ok
        inter = InputBox("Pondération du moins bon performer")
        ok = IsNumeric(Replace(inter, ".", ","))
        ok = ok and inter = Int(inter)
        ok = ok or inter = ""
      Wend
    End Sub
    Voila ce que j'ai essayé de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim nbActifsBest as Variant
    Dim ok as Boolean
     
    nbActifsBest = InputBox("Combien d'actifs souhaitez vous utilisez ?", "nombre d'actifs")
    While Not ok
        nbActifsBest = InputBox("Combien d'actifs souhaitez vous utilisez ?", "Vous devez saisir un entier")
        ok = IsNumeric(Replace(nbActifsBest, ".", ","))
        ok = ok And nbActifsBest = Int(nbActifsBest)
        ok = ok Or nbActifsBest = ""
    Wend
    Quand je saisis 3 (un entier) je boucle quand même. Pour sortir de la boucle je clique sur annuler et la ligne suivante est surlignée en jaune :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ok = ok And nbActifsBest = Int(nbActifsBest)
    Merci d'avance,
    Arnaud.

  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
    Ok. A lire tes posts précédents je n'avais pas déduit que tu voulais simplement un entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim nbActifsBest As Variant
    Dim ok As Boolean
     
        Do While Not ok
            nbActifsBest = InputBox("Combien d'actifs souhaitez vous utilisez ?", "Vous devez saisir un entier")
            ok = IsNumeric(nbActifsBest)
            ok = ok And nbActifsBest = Int(Val(nbActifsBest))
            ok = ok Or nbActifsBest = ""
        Loop
    MsgBox nbActifsBest
    End sub
    Une explication : La ligne suivante demande un variant ou un string (= "")
    ok = ok Or nbActifsBest = ""
    Or la ligne précédente demande un nombre. Le problème est le mélange des "genres"
    En utilisant Variant comme type et val pour récupérer la valeur, ça devrait pouvoir aller... "devrait" sauf si tu rentres 0, auquel cas ok = true
    Tu dis

  11. #11
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 28
    Par défaut
    Ca marche.

    Merci.

    J'ai posté un Topic hier qui est toujours sans réponse si tu as une idée je suis preneur.

    http://www.developpez.net/forums/d67...onnees-tracer/

  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
    Si c'est résolu, un petit clic sur pour qu'on sache que c'est résolu
    (Je jetterai un oeil sur l'autre url mais pas tout de suite)

  13. #13
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 28
    Par défaut
    Salut,

    J'avais pas touché à cela depuis longtemps, mais en faisant tourner le programme je me suis rendu compte que même si on saisissait un entier du premier coup, on avait encore un boucle pour ressaisir l'entier.
    Cette boucle n'apparait qu'une fois et après c'est bon.

    Quelle serait la modification à faire ?

    Merci d'avance,
    Arnaud.

  14. #14
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 28
    Par défaut
    Rebonjour,

    J'aurais besoin de même de faire un test sur une Date.
    Je m'explique : il y a un msgBox qui demande une date à l'utilisateur et je voudrais que dans le cas où la date n'existe pas, le programme considère la date d'après existante.
    Par exemple, si l'utilisateur rentre le 31/04/2009, le programme doit comprendre le 01/05/2009.

    Si cela n'est pas possible, j'aurais juste besoin que cela boucle en demandant une autre date.

    Voici ce que j'ai codé pour le moment pour demander la date à l'utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dateDebut = InputBox("Quelle est la date de début du zoom ?", "Date de début")
    Päs grand chose je sais lol

    Merci d'avance,
    Arnaud.

  15. #15
    Membre expérimenté
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 155
    Par défaut
    pour vérifier si c'est un nombre, tu as utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not isNumeric(nbActifsBest) then Msgbox "error"
    De même, pour vérifier si c'est une date, tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not isDate(dateDebut) then Msgbox "error"
    Courage!

  16. #16
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 28
    Par défaut
    Citation Envoyé par AnneCa Voir le message
    pour vérifier si c'est un nombre, tu as utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not isNumeric(nbActifsBest) then Msgbox "error"
    De même, pour vérifier si c'est une date, tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not isDate(dateDebut) then Msgbox "error"
    Courage!
    Salut,

    J'ai essayé d'adapter les solutions que l'on m'avait donnée précédemment avec un test utilisant isDate, mais le programme s'arrête si je rentre une date qui n'existe pas comme par exemple un 30/02 avant même d'avoir effectuer le test.

    Voilà ce que j'ai codé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dateDebut = InputBox("Quelle est la date de début du zoom ?", "Date de début")
    While Not IsDate(dateDebut)
      dateDebut = InputBox("Quelle est la date de début du zoom ?", "Erreur lors de la saisie précédente")
    Wend
    dateDebut = CDate(dateDebut)
    Si tu vois comment je peux m'en sortir ça serait cool.

    Merci,
    Arnaud.

  17. #17
    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, sincemono,

    Voici une réponse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Command1_Click()
      datedebut = "on s'en moque !"
      While Not (IsDate(datedebut) And datedebut Like "##/##/####" And Val(Mid(datedebut, 4, 2)) <= 12)
        datedebut = InputBox("Quelle est la date de début du zoom ?")
      Wend
      datedebut = CDate(datedebut)
    End Sub
    Pourquoi ce qui est en rouge dans le code ?
    Tout simplement parce que VB est ainsi conçu qu'il accepterait comme valide la saisie de "12/31/2001" et la transformerait spontanément en "31/12/2001" (donc source d'erreur)...
    Voilà .

  18. #18
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 28
    Par défaut
    Merci pour cette réponse et désolé d'avoir posté trop de questions sur le même topic.
    Arnaud.

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 04/03/2011, 18h06
  2. test sur le type de données
    Par new_wave dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 04/06/2009, 12h33
  3. Test sur le type d'un TComponent
    Par pottiez dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/06/2007, 21h57
  4. Test sur le type de valeur
    Par mevardy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/08/2006, 14h43
  5. tests sur le type de valeurs
    Par dor_boucle dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 16/03/2006, 15h10

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