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 :

Compatibilité MACRO 2003 ET 2010


Sujet :

Macros et VBA Excel

  1. #21
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Salut.

    De toute façon, si les valeurs sont identiques, le test renvoie VRAI (TRUE) et donc le message "le résultat est faux" apparaît.

    C'est donc que les valeurs ne sont pas égales. Point à la ligne. Il se peut que les valeurs affichées semblent identiques (arrondi d'affichage par exemple) alors que les valeurs calculées sont différentes...

    La seule solution est effectivement de passer par les valeurs espion pour bien comprendre quelles sont les valeurs prises en compte...

    Cela dit, je soumets à votre réflexion le code suivant, qui prouve qu'Excel peut évaluer un test logique de façon "fantaisiste". En fait, en l'absence d'une comparaison d'une valeur avec une valeur logique, VBA test que c'est faux ou que ce n'est pas faux. Le SI d'Excel se comporte de la même manière...

    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
      Dim Valeur As Long
     
      Valeur = 34
     
      If Valeur = True Then
        MsgBox "TEST 1 = VRAI"
        Else
        MsgBox "Test 1 = FAUX"
      End If
     
      If Valeur Then
        MsgBox "TEST 1 = VRAI"
        Else
        MsgBox "Test 1 = FAUX"
      End If
    Rigolo, n'est-il pas?

  2. #22
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Bonjour Pierre,

    Ca ne me semble pas si fantaisiste que ça en fait :
    • Dans le premier cas, on teste l'égalité entre deux variables. L'une est un entier long, l'autre un booléen. Il y a donc un cast logique vers le type le plus "large" et le booléen True, devient l'entier 1 qui n'est pas égale à 34.
    • Dans le second cas, on attends un booléen, donc VBA essaie de transformer notre entier en booléen, et la règle c'est False pour 0 et True pour tout autre entier (c'est là que c'est discutable à la rigueur, le plus propre serait d'interdire cette conversion avec perte d'information).

    D'ailleurs, je ne sais pas, question aux experts, on peut empêcher les cast implicites dans VBA ou pas (Une option strict quoi) ?

    N'empêche que moi, j'aimerais bien avoir le fin mot de l'histoire, alors mauvaise cellule ou pas ?

  3. #23
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    Pour le cas de Pierre, vu de ma fenêtre (de l’éditeur VBE bien sûr).

    CAS 1 – on lui soumet bien une expression* à analyser et ça répond aux données de l’aide VBA pour l’instruction If..Then…Else
    *expression
    Combinaison de mots clés, d'opérateurs, de variables et de constantes générant une chaîne, un nombre ou un objet. Une expression peut effectuer un calcul, manipuler des caractères ou tester des données.
    Tu tentes de comparer un long avec une valeur de Boolean => False retourné
    Citation Envoyé par aide VBA
    Condition : Une expression numérique ou expression de chaîne qui prend la valeur True ou False. Si l'argument condition est Null, il est considéré comme False.

    …/… Null : Valeur indiquant qu'une variable ne contient pas de données valides. La valeur Null est le résultat de l'attribution explicite de la valeur Null à une variable ou de toute opération entre des expressions contenant la valeur Null.
    Donc en tentant d'interpréter Valeur en booléan, n'ayant pas été attibuée, soit il prend la valeur par défaut des Boolean => False, soit il considère l'argument de condition comme Null.


    Cas 2

    Là je ne sais pas à ce jour, on ne pose rien explicitement, le mieux serait d’avoir un message d’erreur comme si on mettait Valeur en string et qu’on lui assignait « toto » au lieu de 34 vu qu’on fait n’importe quoi.
    J’ai bien mis « toto » au lieu de 34 car si on met Valeur en string et valeur = 34, on s’aperçoit qu’il traduit bien 34 en « 34 » mais que le cas 2 ne plante pas donc, qu’il réinterprète « 34 » en 34.
    Donc cas 2 => nous somme face aux pouvoirs d’interprétation du VBA, et dans ce cas je ne connais pas la règle. Il ne plante pas donc le fait de donner à valeur une donnée numérique (ou interprétable comme telle) lui permet d’interpréter un cas de figure qui renvoie True.

    Quand à empêcher les cas implicite, je ne pense pas que ce soit possible, pas vu dans les options et d’un autre côté, ça voudrait dire qu’à chaque fois qu’on adresse une cellule non pointée par une variable objet, on passe par une écriture Application.WorkBooks(xx).worksheets(yy).Range…. etc…

    D’un autre côté, les écritures du genre cas 1 ou 2 exploitées quand elle passent sont soit une volonté d’offuscation soit du développement masochiste

    Citation Envoyé par Microsoft

    Les valeurs Boolean, type de données (Visual Basic) ne sont pas stockées en tant que nombres et les valeurs stockées ne sont pas destinées à être équivalentes aux nombres. Pour garantir la compatibilité avec les versions antérieures, Visual Basic fournit des mots clés de conversion (CType Function, CBool, CInt, etc.) pour effectuer des conversions entre des types Boolean et numériques. Toutefois, d'autres langages exécutent parfois différemment ces conversions, comme c'est le cas pour les méthodes du .NET Framework.

    Vous ne devez jamais écrire un code qui repose sur les valeurs numériques équivalentes à True et False. Autant que possible, limitez l'utilisation des variables Boolean aux valeurs logiques pour lesquelles elles sont conçues. S'il s'avère nécessaire de mélanger des valeurs Boolean et des valeurs numériques, assurez-vous que vous comprenez la méthode de conversion choisie.
    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
    Sub Pierre1()
    Dim Valeur As Long
      Valeur = 34
     
      If Valeur = True Then
        MsgBox "TEST 1 = VRAI"
        Else
        MsgBox "Test 1 = FAUX"
      End If
    End Sub
    Sub Pierre2()
    Dim Valeur As Long
     
      Valeur = 34
      If Valeur Then
        MsgBox "TEST 1 = VRAI"
        Else
        MsgBox "Test 1 = FAUX"
      End If
    End Sub
    cordialement,

    Didier

  4. #24
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Oui oui...

    Je voulais juste faire remarquer que les tests logiques peuvent être déroutants.

    Par défaut, on pourrait penser que If CONDITION Then impose que CONDITION renvoie VRAI, alors qu'en fait, il suffit que CONDITION ne renvoie pas FAUX...

    Et donc, comme le dit Didier, il vaut mieux être explicite.

    Quand à un verrou sur le transtypage automatique, je ne vois pas d'outils qui permette cela.

    Cela dit,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If True Then MsgBox "Joyeuses fêtes"

  5. #25
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message

    Par défaut, on pourrait penser que If CONDITION Then impose que CONDITION renvoie VRAI, alors qu'en fait, il suffit que CONDITION ne renvoie pas FAUX...

Discussions similaires

  1. Pb compatibilité vba [2003-2007-2010]
    Par Gorzyne dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/03/2013, 20h23
  2. [XL-2010] Problème compatibilité macro excel 2003 / 2010
    Par alf62000 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 10/11/2012, 17h43
  3. Compatibilité Excel 2003 - outlook 2010
    Par fleur57 dans le forum Outlook
    Réponses: 1
    Dernier message: 29/08/2012, 23h05
  4. Probleme compatibilité macro 2003 -2010
    Par debutVBA dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 17/01/2012, 16h13
  5. Pb de compatibilité office 2003 et 2010
    Par hebh dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/07/2011, 20h49

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