Erreur incompréhensible

  • Initiateur de la discussion Initiateur de la discussion Guigui
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Guigui

XLDnaute Occasionnel
Bonsoir,

J'ai une erreur sur un code mais je ne comprend pas le pourquoi du comment !

* une vérification du type "si A = B alors" n'est pas vérifié (en VBA)
alors que la même vérif en formule dans la feuille donne bien A = B

* Un code du type "si A > B alors" est vérifié alors que la formule dans la feuille montre que A =B

Je vous joint un petit exemple.

(le but étant de détecter un changement d'heure comparé à un horaire prévis. et de faire apparaitre un dépassement d'amplitude horaire)

Merci par avance
Guillaume
 

Pièces jointes

Re : Erreur incompréhensible

Bonjour Guigui,

Mieux vaut utiliser un référencement clair que d'utiliser Offset()
comme tu le fais 🙄

Code:
Lig = Target.Row
Range("R" & Lig).value
est pour moi beaucoup plus clair et moins source d'erreur que
Code:
Target.Offset(0,13)

Maintenant le pb n'est peut-être pas là 😉

A+
 
Re : Erreur incompréhensible

Bonjour Guigui, BrunoM45
J'ai trouvé une erreur dans le code sur la ligne
Code:
[COLOR="DarkSlateGray"][B]Target.Offset(0, 11) = "CHGT HORAIRE " & Format(Target.Offset(0, -1), "hh:mm") & " " & Format([COLOR="Red"]Target - Target.Offset(0, 3)[/COLOR], "hh:mm") & " + " & Format(Target.Offset(0, 3), "hh:mm") & " SUP"[/B][/COLOR]
En effet, dans la colonne H, on trouve une formule susceptible de renvoyer du texte.
Dans ce cas, Target - Target.Offset(0, 3) ne peut être calculé.

Mettons une rustine :
Code:
[COLOR="DarkSlateGray"][B]Target.Offset(0, 11) = "CHGT HORAIRE " & Format(Target.Offset(0, -1), "hh:mm") & " " & Format([COLOR="Red"]Target - IIf(Target.Offset(0, 3) = "", 0, Target.Offset(0, 3))[/COLOR], "hh:mm") & " + " & Format(Target.Offset(0, 3), "hh:mm") & " SUP"[/B][/COLOR]
À vous de voir si ce bricolage rend le code correct...
ROGER2327
#3374


12 Floréal An CCXVIII
2010-W17-6T08:07:30Z
 
Re : Erreur incompréhensible

bonjour,

BrunoM45, merci pour cette petite astuce, en effet l'utilisation de la référence de la colonne est bien plus clair que les chiffres de l'offset ... je vais changer ca à l'avenir.

Roger2327, merci également, il est vrai que j'avais vu cette erreur mais en faite ce que je ne comprend pas c'est pourquoi dans le cas ou l'amplitude horaire réalisé est égale à celle prévus, le code ne vois pas cette égalité ?!

exemple:
13h00 22h00 > 08h15 de travail (45min étant retiré .. peut importe)
08h00 17h00 > 08h15 également

If Target.Offset(0, 13) = Target.Offset(0, 14) Then
Target.Offset(0, 11) = "CHGT HORAIRE"
End If

la verification IF n'est pas verifié !! .. pourquoi ?

Merci encore
Guillaume
 
Re : Erreur incompréhensible

bonjour a tous

Suite aux calculs il existe une infime difference entre
Target.Offset(0, 13)
et
Target.Offset(0, 14)

Je suggere:

Code:
If Abs(Target.Offset(0, 13).Value - Target.Offset(0, 14).Value) < 0.000001 Then

en lieu et place de
Code:
 If Target.Offset(0, 13) = Target.Offset(0, 14) Then
 
Re : Erreur incompréhensible

Re...
J'ai placé la ligne
Code:
[COLOR="DarkSlateGray"][B]MsgBox Target.Offset(0, 14).Value - Target.Offset(0, 13).Value[/B][/COLOR]
dans le code après If Target = "" Then Exit Sub
En mettant 08:00 en D17 et 17:00 en E17, on obtient le message 5.55111512312578E-17. Normal donc que la réponse au test Target.Offset(0, 13).Value - Target.Offset(0, 14) soit FAUX.
Où est le problème ?
ROGER2327
#3376


12 Floréal An CCXVIII
2010-W17-6T12:33:54Z
 
Re : Erreur incompréhensible

Suite...
Bonjour pierrejean,

Je n'avais pas vu votre message.
Vous avez probablement raison, notre ami veut comparer des valeurs aux erreurs d'arrondi près.
J'y vais donc à mon tour de ma proposition :
Code:
[COLOR="DarkSlateGray"][B]        If Round(Target.Offset(0, 13), 8) = Round(Target.Offset(0, 14), 8) Then
        Target.Offset(0, 11) = "CHGT HORAIRE"[/B][/COLOR]
ROGER2327
#3377


12 Floréal An CCXVIII
2010-W17-6T13:03:40Z
 
Re : Erreur incompréhensible

Re

Le problème, selon moi *, est qu'en R17 (soit Target.Offset(0, 13)) on a 0,34375
qu'en S17 (soit Target.Offset(0, 14)) on a 0,34375
(Visibles par format cellule > Nombre et 6 decimales)
Et que Target.Offset(0, 13)- Target.Offset(0, 14) soit <> 0
ce que vous et moi constatons cher ROGER

* et sauf erreur de ma part (ce qui n'est pas improbable)
 
Re : Erreur incompréhensible

Re...
Il est vrai qu'il est quelquefois difficile de s'y retrouver...
Ce qu'on voit dans une cellule de feuille de calcul est pratiquement toujours différent de son contenu réel. On parle d'ailleurs couramment de format d'affichage, ce qui revient implicitement à dire qu'on donne une forme visible (et si possible compréhensible) à un contenu sous-jacent.

Pour ce qui est des nombres, on sait qu'un processeur calcule exclusivement dans le système de numération binaire (ou de base 2), alors que les opérateurs humains ont généralement accoutumé de concevoir leurs calculs avec des nombres écrits sous la forme décimale (ou de base 10), et quelquefois avec des nombres écrits sous la forme sexagésimale (ou de base 60). Ce dernier cas est en fait assez courant dans la mesure du temps (heure, minute, seconde) ou des angles (degré sexagésimal, minute sexagésimale, seconde sexagésimale).

Par exemple, lorsque nous voulons calculer 2+3, nous écrivons dans une cellule =2+3 et nous avons la satisfaction de constater que notre tableur affiche 5.

Pour ce faire, le processeur ne calcule pas 2+3. Très schématiquement, on peut dire qu'avant que le processeur calcule, la formule est interprétée. Les nombres sont convertis en base 2, dans laquelle, 2 (base 10) s'écrit 10 (base 2), 3 (base 10) s'écrit 11 (base 2).
Le processeur additionne les nombres en base 2 et renvoie 101 (base 2). Ce résultat est converti en base 10 pour donner 5 (base 10) avant d'être affiché.
Tout va bien.

La source de nos problèmes vient de cette transposition de base à base.
Par exemple : Nous voulons calculer 45 minutes + 1 minute et nous attendons de notre tableur qu'il nous réponde que le résultat est 46 minutes.

Mais le boulot est très compliqué pour notre tableur !

Nous inscrivons ="0:45"+"0:01" dans la cellule A1 d'une feuille vierge et, à la surprise générale, la réponse est : 0,031944444.
Voyons ce qu'a fait le tableur.
En analysant notre demande, il comprend qu'il faut calculer une somme et que les termes de cette somme sont des temps. Le tableur est conçu de telle sorte que tout ce qui concerne les temps est traité dans l'unité "jour". Pour lui, 1 heure est 1/24 jour, 1 minute est 1/1440 jour, etc.
Il va donc demander au processeur de calculer (45/1440)+(1/1440).

Selon la technique décrite plus haut, il convertit 45/1440 (base10) en 0,00001 (base 2) et 1/1440 (base 10) en
0,00000000001011011000001011011000001011011000001011011... (base 2).
Le malheur est que cette transcription ne peut être exacte. L'écriture ci-dessus signifie qu'en base 2 la valeur exacte de 1/1440 s'écrit avec une suite infinie de chiffres, la partie soulignée (000001011011) se répétant indéfiniment. En pratique, une machine ne peut pas travailler avec des nombres dont l'écriture est une suite infinie de chiffres. Elle ne conservera que le début de l'écriture, qui représente une valeur voisine de la valeur exacte.
Si elle ne garde, par exemple, que 0,00000000001011011 (base 2), elle ne calculera pas réellement avec 1/1440 (base 10), mais avec 91/131072 (base 10) puisqu'elle aura oublié une infinité de chiffres. La différence de ces deux nombres vaut à peu près -0.000000169542100694471 (base 10). Par conséquent tous les calculs ultérieurs seront légèrement faussés par cette approximation.
Ainsi on obtiendra 0,00001000001011011 (base 2) pour somme, soit 0,031944274902343... (base 10) au lieu de la valeur exacte 0,0,03194... où le 4... signifie que le 4 se répète indéfiniment.

Dans le cas d'Excel, le résultat retenu est 0,0319444444444444 car Excel travaille avec plus de chiffres binaires que je n'en ai retenu ci-dessus.

Maintenant, si nous mettons la cellule A1 au format Heure, nous constatons que s'affiche 00:46:00 qui est bien le résultat attendu. Mais il ne s'agit que d'un affichage, le contenu réel de la cellule étant toujours 0,0319444444444444.

Écrivons maintenant 0,0319444444444456 dans la cellule B1 et appliquons-lui le format Heure. On obtient l'affichage 00:46:00.

Enfin, écrivons =A1=A2 dans la cellule A3. Le résultat affiché est FAUX, contredisant les apparences !
Mais c'est correct car 0,0319444444444444≠0,0319444444444456

En fait, ces comparaisons de valeurs sont assez aléatoires chaque fois qu'on ne maitrise pas parfaitement les techniques d'arrondi. On retiendra que les comparaisons se font sur le contenu réel des cellules et non sur le contenu affiché.

Voilà...
Élémentaire, mon cher Watson !
ROGER2327
#3382


13 Floréal An CCXVIII
2010-W17-7T15:02:39Z
 
Re : Erreur incompréhensible

Re,

WOUAOU !!
C'est .... Bluffant !!!

Merci pour l'explication !

Ca me rappel un jeu PC "rama" ou il fallait pour solutionner une énigme utilisé des base, 2, 8 .. Bon casse tête lol

Merci encore 🙂
Guillaume
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
306
Retour