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 :

Probleme de comparaison entre deux cellules identiques


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 97
    Par défaut Probleme de comparaison entre deux cellules identiques
    Bonjour a tous,
    J'ai un probleme lors de la comparaison entre deux feuilles qui contiennent les mêmes valeurs, la première par formule et la seconde directement par valeur.

    Je compare ces deux feuilles cellule par cellule via le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        For Each oCell In Firstsheet.UsedRange
                If oCell.Value <> SecondSheet.Range(oCell.Address).Value Then
                    different = True
                    MsgBox "Different sheets"
                    Exit For
                End If
        Next oCell
        If Not different Then
             MsgBox "Identical sheets"
        End If
    En executant ce code, vba detecte une cellule qui ne contient pas la même valeur dans les deux feuilles.
    Et quand je fais differents tests pour comparer ces deux cellules j'obtiens ceci:
    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
     
    ?ocell.Value
     100
     
    ?SecondSheet.Range(ocell.Address ).Value 
     100 
     
    ?TypeName(ocell.Value) 
    Double
     
    ?TypeName(SecondSheet.Range(oCell.Address ).Value) 
    Double
     
    ?oCell.Value = 100
    False
     
    ?oCell.Value = cstr(100)
    True
     
    ?SecondSheet.Range(oCell.Address).Value = 100
    True
     
    ?SecondSheet.Range(oCell.Address).Value = cstr(100)
    True
     
    ?oCell.Value = SecondSheet.Range(oCell.Address ).Value
    False
    Je rappelle que la premiere feuille contient des formules la secondes des valeurs.
    Avez-vous une idée de ce qui se passe?
    merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut GlamIS et le forum
    Je compare ces deux feuilles cellule par cellule via le code suivant:
    ........
    Je rappelle que la premiere feuille contient des formules la secondes des valeurs.
    Avez-vous une idée de ce qui se passe?
    Oui, une assez bonne :
    si tu rentres 100, Excel affiche 100
    si tu rentres 100,1 avec un format de type "# ##0;-# ##0;0", Excel affiche 100 et ta macro dit gloups
    Dans un calcul, Excel se sert de tous les octets à sa diposition, et il suffit qu'un bit, même le plus faible soit différent pour qu'il ne voit plus une égalité, alors qu'il n'est même pas capable de l'afficher.

    En régle générale, ce genre de problème se présente lors des divisions.

    Il te faut donc déterminer la précision de la comparaison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if round(oCell,3) <> round(SecondSheet.Range(oCell.Address),3) then
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if int(oCell*1000) <> int(SecondSheet.Range(oCell.Address)*1000) then
    A+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 97
    Par défaut
    Merci Gorfael,
    mais je ne comprend pas, les deux cellules que je compare sont pourtant du meme type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ?TypeName(ocell.Value) 
    Double
     
    ?TypeName(SecondSheet.Range(oCell.Address ).Value) 
    Double

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut GlamIS et le forum
    Oui, les 2 sont de même type, mais... pour prendre un exemple irrealiste :
    Valeur 1 :
    00000000 00000000 00000000 00000001,00000000 00000000 00000000 00000000
    (8 octets) Excel affiche au maximum : 1,0000000000 C'est ça capacité maximale d'affichage(Attention, ce n'est qu'un exemple pour épliquer mon propos)

    Valeur 2 :
    00000000 00000000 00000000 00000001,00000000 00000000 00000000 00000001
    (8 octets) Excel affiche au maximum : 1,0000000000
    Il devrait afficher 1,000000000000000000001 mais il n'en est pas capable.Si pour toi les 2 valeur sont identiques, pour excel, c'est le jour et la nuit. et tu ne pourras jamais voir la différence. Dans toutes les histoire de comparaison de calcul, on se retrouve avec le même style de problème insoluble : l'iformatique ne fait aucun cadeau .
    Le plus simple est de contourner la difficulté en tranchant dans le vif, spr arrondi, ou en utilisant des opérateurs moins strictes que =.
    (Valeur 2 - 0,00001 <= Valeur 1) and (Valeur 1 <= Valeur 2 +0,00001)

    Peut-être que dans les "Options Compare" il existe une solution, mais je n'y crois pas, et j'ai la flemme de vérifier.
    A+

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 97
    Par défaut
    merci Gorfael,
    T'as tout a fait raison, le problème vient du fait que Excel n'affiche pas toujours ce qu'il a en mémoire!
    N'ayant pas la main sur le code VBA, j'ai trouvé une solution de contournement pour mon problème, j'intègre dans les formules de la première feuille la fonction INT qui transforme les données en entiers et ceci pour eviter tout chiffre après la virgule!
    Et ça marche

    Comme quoi tout chiffre rond n'est pas entier!

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

Discussions similaires

  1. Comparaison entre deux dates dans une table
    Par Biskot75 dans le forum Access
    Réponses: 6
    Dernier message: 19/09/2006, 11h16
  2. Réponses: 6
    Dernier message: 18/04/2006, 13h11
  3. Comparaison entre deux champs de deux tables différentes
    Par liam81150 dans le forum Requêtes
    Réponses: 1
    Dernier message: 26/09/2005, 20h53
  4. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11
  5. Réponses: 2
    Dernier message: 25/05/2004, 11h40

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