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 :

Test d'une variable entre 2 bornes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 18
    Par défaut Test d'une variable entre 2 bornes
    Bonjour,

    Je me creuse la tête sur une macro pourtant simple.
    Je cherche à savoir si un nombre réel est compris entre 2 bornes ou entre 2 autres. Le problème est qu'il me retourne la mauvaise réponse:
    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()
    Dim val As Single
    'val = Cells(27, 6).Value
    val = 1.24681
    If 2 <= val <= 3 Then
        toto = 1
    ElseIf 1 <= val < 2 Then
        toto = 2
    End If
     
    MsgBox val & " , " & toto
     
    End Sub
    Je commence à devenir fou là!

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Et avec un Select Case ?
    Il est conseillé d'éviter d'utiliser "Val" comme variable car c'est une fonction VB (Renvoie le nombre contenu dans une chaîne de caractère sous la forme d'une valeur numérique d'un type approprié.)
    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
     
    Sub Test()
     
        Dim Valeur As Single
        Dim Toto
     
        Valeur = 1.24681
     
        Select Case Valeur
     
            Case 0 To 1.9999999999
                Toto = 1
     
            Case 2 To 2.9999999999
                Toto = 2
     
            Case 3 To 3.9999999999
                Toto = 2
     
        End Select
     
        MsgBox Toto
     
    End Sub

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 71
    Par défaut
    Bonjour tout le monde,

    2 erreurs dans ton code :


    1) tu n'as pas le droit d'utiliser val comme nom de variable, car c'est un mot réservé en VB

    2) Même si tu n'as pas d'erreur au niveau de l'interprêteur, tu n'as pas le droit d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If 2 <= valeur <= 3 Then
        toto = 1
    ElseIf 1 <= valeur < 2 Then
        toto = 2
    End If
    Tu dois écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If valeur >= 2 And valeur <= 3 Then
        toto = 1
    ElseIf valeur >= 1 And valeur < 2 Then
        toto = 2
    End If
    Il est effectivement préférable d'utiliser Select Case...End Select à Elseif.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 18
    Par défaut
    Merci pour toutes ces infos. Je vais tester ça!

    Je ne connaissais pas le case select. Ca va me simplifier la vie! Merci

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 71
    Par défaut
    Tu feras très attention à une faute assez classique : compare les codes 1 et 2

    1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Select Case valeur
        Case Is >= 3
            toto = 3
        Case Is >= 2:
            toto = 2
        Case Is >= 1
            toto = 1
        Case Else
            toto = 0
    End Select
    2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Select Case valeur
        Case Is >= 1
            toto = 1
        Case Is >= 2:
            toto = 2
        Case Is >= 3
            toto = 3
        Case Else
            toto = 0
    End Select
    L'ordre des valeurs avec les symboles < <= > >= n'est pas négligeable
    Le code dégressif n° 1 est juste. Si valeur vaut 2.2 toto vaudra 2, ce qui est JUSTE

    Le code progressif 2 est faux, mais ce n'est pas toujours facile à voir :
    - si valeur vaut 0.2, toto vaut bien 0, ce qui est JUSTE
    - si valeur vaut 1.2, toto vaut bien 1, ce qui est JUSTE
    - mais si toto est >= 2, toto vaudra toujours 1, ce qui est FAUX. En fait, le compilateur s'arrête à la 1ère sortie trouvée. Donc gaffe aux nombres réels !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 18
    Par défaut
    J'ai testé ça marche bien, merci.

    Par contre, j'ai essayé d'insérer une boucle if dans ma boucle Select Case mais ça me génère un message d'erreur "Case sans Select Case".
    J'imagine que la raison est que ce n'est aps possible d'imbriquer une autre boucle dans une boucle Case.

    Voici l'extrait de mon code (oui c'est pas optimisé et c'est très moche mais je verrai à l'optimiser une fois que j'aurai quelque chose qui fonctionne):
    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
    Select Case NbInf
        Case 0
            If R = "3R4-R" Then
    '            Pb = 0
                MsgBox "Pont OK"
            ElseIf R = "R-3R" Then
    '            Pb = 1
                If Rmax = R12 Then
                    MsgBox "Jauge 1 HS"
                ElseIf Rmax = R23 Then
                    MsgBox "Jauge 2 HS"
                ElseIf Rmax = R34 Then
                    MsgBox "Jauge 3 HS"
                If Rmax = R14 Then
                    MsgBox "Jauge 4 HS"
                End If
            Else
                MsgBox "Cas non pris en compte"
            End If
        Case 3
            If R = "R-2R" Then
    '            Pb = 2
                If (Rmax = R13 And R14 <> "Inf") Then
                    MsgBox "Jauges 1 & 2 HS"
                ElseIf (Rmax = R13 And R14 = "Inf") Then
                    MsgBox "Jauges 3 & 4 HS"
                ElseIf (Rmax = R24 And R14 <> "Inf") Then
                    MsgBox "Jauges 2 & 3 HS"
                ElseIf (Rmax = R24 And R14 = "Inf") Then
                    MsgBox "Jauges 1 & 4 HS"
                End If
            ElseIf R = "3R4-R" Then
    '            Pb = 4
                If (R12 And R13 And R14) = "Inf" Then
                    MsgBox "Fil 1 coupe"
                ElseIf (R12 And R23 And R24) = "Inf" Then
                    MsgBox "Fil 2 coupe"
                ElseIf (R13 And R23 And R34) = "Inf" Then
                    MsgBox "Fil 3 coupe"
                ElseIf (R14 And R24 And R34) = "Inf" Then
                    MsgBox "Fil 4 coupe"
                End If
            Else
                MsgBox "Cas non pris en compte"
            End If
    Merci pour votre aide

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

Discussions similaires

  1. Problème d'appels d'une variable entre fonctions
    Par julien.nasser dans le forum MFC
    Réponses: 12
    Dernier message: 26/04/2006, 09h23
  2. [Mail] Construire un test avec une variable
    Par jeromesco dans le forum Langage
    Réponses: 3
    Dernier message: 17/02/2006, 21h52
  3. [xsl] Test avec une variable ?
    Par maxonman dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 24/01/2006, 10h47
  4. Passer une variable entre deux fenêtres
    Par DeezerD dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/08/2005, 09h52
  5. Partage d'une variable entre les processus fils
    Par Mehdi Feki dans le forum Linux
    Réponses: 7
    Dernier message: 09/01/2005, 13h34

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