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

Excel Discussion :

Comparaison String : Formule VS VB


Sujet :

Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut Comparaison String : Formule VS VB
    Bonjour,

    j'ai une question concernant la manipulation des strings.
    Je fais un traitement de comparaison de string (Quoi ?!!,hé oui..)

    Je me retrouve face à un petit souci.
    Je m'explique, je souhaite comparer 2 cellules qui contiennent des caractères.

    Cellule A3 : ALPHA_M
    Cellule A4 : ALPHAA

    Si j'écris en formule : =SI(A3<A4;"OK";"pasok") --> j'obtiens OK

    En revanche si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim cellule1  As Variant
    Dim cellule2  As Variant
    Sheets("test").Activate
    Set feuille = ThisWorkbook.ActiveSheet
    cellule1 = feuille.Cells(3, 1)
    cellule2 = feuille.Cells(4, 1)
    If cellule1 <= cellule2 Then
    MsgBox "coool"
    Else
    MsgBox "pas cool"
    End If
    End Sub
    --> j'obtiens "pas cool"
    Cela signifie que la formule et VB ne sont pas d'accord. Quelqu'un pourrait-il m'expliquer pourquoi ? Et surtout comment faire pour que VB me donne le même résultat ?
    Merci d'avance,

    Evo

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Cela signifie que la formule et VB ne sont pas d'accord.
    Ils le seront sans aucun doute lorsque tu leur feras comparer ce qu'il convient de comparer.
    En typant, comme tu le fais, en variant les cellule cellule1 et cellule2 puis en écrivant, comme tu le fais) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cellule1 = feuille.Cells(3, 1)
    cellule2 = feuille.Cells(4, 1)
    If cellule1 <= cellule2 Then
    Tu "perds" complètement VBA, qui ne sait plus ce qu'il doit comparer (des objets Range ou leur valeur ?)
    Il est toujours important de préciser la propriété à comparer d'un objet
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Merci pour ton retour.
    Hmm mais si je met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If cellule1.Value <= cellule2.Value Then
    J'ai une erreur à l’exécution : objet requis.
    Donc je t'avoue que je suis tout aussi perdu que VB sur ce coup ;-)

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Si cellule1 et cellule2 sont des objets (des objets range en l'occurrence) ils doivent être initialisés comme tels, par une instruction Set (ton aide vba interne à consulter : rubrique Set, instruction)
    et initialisés comme tels (des objets Range et non en type Variant)
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Pas mieux, je suis toujours largué.
    L'aide indique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim YourObject, MyObject, MyStr 
    Set MyObject = YourObject    ' Assign object reference. 
    ' MyObject and YourObject refer to the same object. 
    YourObject.Text = "Hello World"    ' Initialize property. 
    MyStr = MyObject.Text    ' Returns "Hello World". 
     
    ' Discontinue association. MyObject no longer refers to YourObject. 
    Set MyObject = Nothing    ' Release the object.
    Je tente d'adapter sans succès.
    Si je copie le code de l'aide en l'état :
    erreur "incomptabilité de type" à l'éxecution.

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    T'est-il si difficile de te montrer aussi strict que ce que je t'ai exposé ?
    Regarde comme tout est pourtant simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim cellule1  As Range
    Dim cellule2  As Range
    Dim feuille As Worksheet
    'Sheets("test").Activate ' nul besoin d'activer. on travaille directement sur les objets
    Set feuille = ThisWorkbook.Worksheets("test")
    Set cellule1 = feuille.Cells(3, 1)
    Set cellule2 = feuille.Cells(4, 1)
    If cellule1.Value <= cellule2.Value Then
      MsgBox "coool"
    Else
      MsgBox "pas cool"
    End If
    EDIT : j'ai très délibérément VOULU coller à ton propre code (de sorte à ce que tu comprennes mieux le sens de chaque chose et ne brules pas les étapes)

    Tu apprendras ensuite (mais ce sera une autre étape) comment écrire tout cela beaucoup plus simplement et directement (sans le moindre "tremplin").
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Effectivement je suis partie loin... :-) :-)

    En revanche j'obtiens toujours "pas cool" comme résultat.

    A noter que mon code de départ fonctionne dans 99% des cas. Je ne rencontre un problème que sur la cellule qui contient le caractère _. C'est surement lié.
    Je pense que ton code est plus cohérent que le mien, néanmoins les 2 donnent le même résultat pour l'instant.

    VB aurait-il du mal à interpréter le caractère "_" ?

  8. #8
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Montre donc les valeurs comparées.
    Je te rappelle que la comparaison de chaînes de caractères se fait en fonction de la valeur ascii de chaque caractère
    le code accii de l'underscore est 95
    le code ascii de la lettre "A" est 65
    et donc ; l'underscore est par exemple plus grand que la lettre "A"
    Je te laisse maintenant là.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Certes...
    Ce qui signifie que la comparaison par formule ne compare pas de la même manière ?

    Les valeurs comparées sont dans mon premier post :
    Cellule 3 : ALPHA_M
    Cellule 4 : ALPHAA

    En formule : Cellule3 < Cellule 4
    en VB : Cellule3 > Cellule 4

    Même résultat que le format de cellule 3 et 4 soit "Standard" ou "Texte".

    Merci pour ton aide, bonne soirée !

    Quelqu'un d'autre pour tenter de m'expliquer d’où vient cet écart ?

  10. #10
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par unparia Voir le message
    Je te rappelle que la comparaison de chaînes de caractères se fait en fonction de la valeur ascii de chaque caractère
    Désolé de te décevoir , mais pas toujours

    Cela dépend.
    C'est vrai sans la ligne suivante dans l'entête ou peut-être dans les options. (Je ne me souviens plus pour VB6-VBA, mais c'est vrai dans VB.net)

    Option compare text


    dans l'entête du module implique que les lettres majuscules, les lettres accentuées et les lettres minuscules sont comparées et triées en semble selon les paramètres régionaux de Windows, ou les paramètres linguistiques d'Office. donc À, A, à, a sont "égales". C'est pareil pour É, E, Ê, È, ê, è, et toutes les autres lettres. En cas d'égalité, c'est le premier caractêre différent qui l'emporte

    ou rien, c'est l'ordre déterminé par la page de code utilisée qui est appliqué, comme tu le mentionnes.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    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 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Salut.

    +1 pour Clément.

    Si tu mets Option Compare Text en début de module, tes résultats seront conformes à ceux d'Excel.

    Si, dans une procédure particulière, tu veux déroger à l'option précisée en tête de module, tu peux préciser, à l'intérieur de la procédure, comment tu veux que la comparaison se fasse en utilisant la fonction strComp qui permet de définir le type de comparaison quel que soit l'option du module.

    strComp(A,B, ...) renvoie -1 si A<B, 0 si A=B et 1 si A>B

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      If StrComp(Range("a3").Value, Range("a4").Value, vbTextCompare) = -1 Then
        Debug.Print "OK"
      Else
        Debug.Print "Nok"
      End If
      If StrComp(Range("a3").Value, Range("a4").Value, vbBinaryCompare) = -1 Then
        Debug.Print "OK"
      Else
        Debug.Print "Nok"
      End If
    D'autres fonctions de texte peuvent utiliser un argument de ce type, par exemple la fonction InStr() qui permet de rechercher une chaine à l'intérieur d'une autre. Pour cette fonction également, tu peux déroger à Option Compare présent (ou absent et donc équivalent à Option Compare Binary) du début de module.

    Ces arguments de fonction sont très utiles car elles peuvent être utilisées au sein de fonctions génériques que tu te crées comme outils et que tu souhaites utiliser dans différents projets. Dans ce cas, ils permettent à tes fonctions perso de fonctionner toujours de la même façon dans n'importe quel module de n'importe quel projet sans tenir compte de la ligne d'option. Cela te permet de te créer tes boites à outils que tu balades de projet en projet sans devoir réinventer la roue à chaque fois et sans devoir tenir compte du contexte dans lequel ta fonction perso est utilisée.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Parfait !
    Merci à tous, ça fonctionne très bien avec :

    Evo

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

Discussions similaires

  1. comparaison String to string
    Par champity dans le forum Langage
    Réponses: 1
    Dernier message: 15/10/2009, 20h49
  2. Réponses: 4
    Dernier message: 15/05/2008, 17h38
  3. Réponses: 3
    Dernier message: 03/03/2008, 10h30
  4. [C#] Comparaison string
    Par aymron dans le forum ASP.NET
    Réponses: 2
    Dernier message: 10/10/2005, 16h17
  5. Comparaison string nombre
    Par yanndublanche dans le forum Langage
    Réponses: 3
    Dernier message: 30/06/2005, 14h51

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