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 :

Pourquoi -1 est-il considéré comme True ? [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Pourquoi -1 est-il considéré comme True ?
    Bonjour,
    le code suivant :
    Sub test()
    Dim toto As Variant
    toto = -1
    If toto = True Then
    Debug.Print "condition remplie"
    Else
    Debug.Print "condition non remplie"
    End If
    End Sub
    renvoie "condition remplie", alors que tous les autres nombres renvoient "condition non remplie"
    Quelqu'un sait-il pourquoi ? Cela peut causer des surprises dans le comportement du code !
    Xavier

  2. #2
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    Bonjour,
    False/True =0/-1
    Fais ce test
    msgbox True * 1

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Du coup, quelle est la bonne pratique ?
    Merci Thumb Down ! Je comprends mais je trouve cela piégeux.

    Du coup, j'en appelle aux développeurs vba de ce forum. Quelle est la bonne pratique pour faire un test qui n'est satisfait que sur un booléen de valeur True ou le texte "VRAI" ?

    If Range("A1") then...
    ne fonctionne pas car si Range("A1") est un nombre (sauf 0), c'est satisfait
    If Range("A1") = True then...
    ne fonctionne pas car si Range("A1") est égal à -1, c'est satisfait
    If Not IsNumeric(Range("A1")) And Range("A1") = True Then...
    ne fonctionne pas car si Range("A1") = True, IsNumeric(Range("A1")) renvoit True (donc Not IsNumeric(...) renvoie FAUX

    Je suis donc sur
    If Not Application.WorksheetFunction.IsNumber(Range("A1")) And Range("A1") = True Then...
    qui fonctionne

    ça me semble un peu compliqué pour un besoin aussi simple !

    Votre avis ?

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 753
    Points : 28 603
    Points
    28 603
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Un booléen ne peut pas être un texte.
    Si vous faites un test booléen par rapport à la valeur contenue dans une cellule Excel, il suffit d'indiquer VRAI ou FAUX dans la cellule (pour les versions française d'excel) et TRUE ou FALSE (pour les version anglaise) et évidemment ce n'est pas du texte mais bien une valeur booléenne. A savoir que dans Excel, VRAI est égal à 1 contrairement au VBA ou il est égal à -1 mais bien entendu la conversion est faite au moment de la lecture
    La valeur VRAI ou FAUX dans la cellule peut bien entendu être le résultat d'un test logique
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    If Range("A1").Text="Vrai" then...

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Merci
    @Philippe Tulliez : je comprends que vous privilégiez des formules de type =si(A1=A2;"VRAI";"FAUX") plutôt que =A1=A2, de façon à toujours avoir du texte et non un booléen en cellule excel ?

    @Thumb Down : excellent, ça fonctionne. Il faut juste modifier un peu la syntaxe : If Range("A1").Text = "VRAI" Then...
    Dans ce cas, seul le booléen True et le texte "VRAI" passent (le texte "Vrai" ne passe pas)
    Si on met = "Vrai", le booléen True ne passe pas.

    Je remplace donc ma longue formule
    If Not Application.WorksheetFunction.IsNumber(Range("A1")) And Range("A1") = True Then...
    par
    If Range("A1").Text = "VRAI" Then...

    Merci !

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2017
    Messages : 12
    Points : 11
    Points
    11
    Par défaut True/False et leurs valeurs numériques
    En résumé, d'après mes tests :

    Dans Excel :
    True = toutes valeurs numériques sauf 0
    False = 0
    On peut le voir dans =si(A1;”oui”;”non)
    ou dans if Range(“A1”) then
    Dans VBA :
    True = -1
    False = toutes valeurs numériques sauf -1
    On peut le voir dans if Range(“A1”) = True then

  8. #8
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 419
    Points : 2 178
    Points
    2 178
    Par défaut
    Oui le if respect la case Majuscule/ Minuscule donc oui il faut écrire "VRAI"

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 753
    Points : 28 603
    Points
    28 603
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    @Philippe Tulliez : je comprends que vous privilégiez des formules de type =si(A1=A2;"VRAI";"FAUX") plutôt que =A1=A2, de façon à toujours avoir du texte et non un booléen en cellule excel ?
    Certainement pas. =(A1=A2) suffit amplement. Je ne vois pas la raison de renvoyer une chaîne de caractères alors que la valeur booléenne peut-être testée immédiatement.


    Si le sujet vous intéresse, je vous invite à lire mon billet titré VBA - De la mauvaise utilisation d'un If...Then...Else pour modifier une propriété Booléenne
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

Discussions similaires

  1. Pourquoi cout est-il défini comme cela?
    Par Cédric Doucet dans le forum C++
    Réponses: 5
    Dernier message: 24/04/2015, 17h16
  2. [script.aculo.us] Ajax update n'est pas considéré comme une requete ajax
    Par Gregory.M dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 08/06/2010, 11h35
  3. [Modèle Relationnel] toute clef étrangère est-elle considérée comme primaire et étrangère?
    Par johnny3 dans le forum Schéma
    Réponses: 15
    Dernier message: 30/01/2009, 17h49
  4. Réponses: 2
    Dernier message: 29/04/2007, 15h35
  5. Réponses: 5
    Dernier message: 17/08/2006, 17h32

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