Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

VBA - valeur qui se modifie au niveau des décimales

Franz68

XLDnaute Nouveau
bonjour,

depuis longtemps je viens sur ce forum pour trouver des solutions ... pour une fois je n'ai pas trouvé ... et désolé si ma question a déjà été traitée (si si j'ai cherché ...)

J'ai un petit souci sur VBA : un petit code simple qui va chercher avec .offset.value le contenu d'une cellule et qui le recopie dans une autre (vidée au préalable).

sauf que ma valeur est par exemple 165,53 et la destination se remplie de 165,53124587

je précise que les deux cellules ont le même format ... j'ai vérifié en augmentant le nombre de décimales après la virgule :

valeur après recopie valeur d'origine
533,5200195312500000000 533,52000000000
-147,4299926757810000000 -147,43000000000
-520,0000000000000000000 -520,00000000000
-714,4400024414060000000 -714,44000000000

il est particulier de noter que le 3ème n'a pas changé ... mais il n'avait rien après la virgule

le code :

Dim Valeur As Single
Dim origine As Single
Dim Dest As Single

Dest = 4

Range("u:u").ClearContents

Valeur = InputBox("Saisir une valeur max", "A vous ...", 0)

With Selection

Selection.Interior.Color = xlColorIndexNone

For Each cellule In Selection

If cellule.Value <= Valeur Then
cellule.Interior.Color = RGB(255, 255, 0)
origine = cellule.Offset(0, -8).Value
Range("U" & Dest).Value = origine
Dest = Dest + 1

End If

Next cellule

End With

là je sèche et remercie ceux qui pourront m'aider ...
 

Paf

XLDnaute Barbatruc
Re : VBA - valeur qui se modifie au niveau des décimales

bonjour et bienvenue sur XLD

essayez

soit en déclarant la variable origine as Double
soit en ne passant pas par une variable intermédiaire : Range("U" & Dest).Value = cellule.Offset(0, -8).Value

A+

Edit :Bonjour pierrejean
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : VBA - valeur qui se modifie au niveau des décimales

Bonjour Franz68

Salut paf

Je confirme la solution : origine as Double
Entre parenthèses origine non déclaré (ce qui revient a déclarer en Variant) fonctionne aussi
Moralité: Lorsque l'on écoute les ayatollah de l'option explicite il faut aussi apprendre à déclarer correctement
 

Franz68

XLDnaute Nouveau
Re : VBA - valeur qui se modifie au niveau des décimales

bonjour à tous les deux et merci pour votre aide.

Avec origine déclarée en double et non single, en effet plus de problème !!

merci bcp !!

suis juste surpris de l'impact de single vs double ... mais l'essentiel est que cela fonctionne !

merci encore !
 

Franz68

XLDnaute Nouveau
Re : VBA - valeur qui se modifie au niveau des décimales

je reste en effet étonné car si j'ai bien compris :

Single et Double sont tous les deux de même nature : stockage de nombre avec virgule flottante ... même si j'ai lu que Single devrait générer moins d'écart dans la conversion décimal / binaire que Double car il est moins précis ...


ceci étant, je ne comprends pas qu'une cellule qui contient 165,37 (et rien de plus ) génère un 165,3697854 ...

A l'affichage dans un format avec 2 chiffres après la virgule tout semble ok, mais pour des calculs ce n'est pas la même chose ...

si quelqu'un pouvait simplement me donner la raison de tout ceci, cela me permettrait de mieux savourer ma pinte en terrasse ce soir !!

mille mercis !
 

pierrejean

XLDnaute Barbatruc
Re : VBA - valeur qui se modifie au niveau des décimales

Re

Je pense pouvoir résumer en disant que la valeur binaire la plus proche de 165,37 dans la série des binaires de 32 octets est 165,3697854
Ne pas oublier que dans l'ordinateur classique toute information n'est stockable que sous forme binaire
Je cherche à mieux matérialiser ceci mais ce n'est pas très simple
 

pierrejean

XLDnaute Barbatruc
Re : VBA - valeur qui se modifie au niveau des décimales

Re

Voici une démonstration de conversion montrant la différence entre Single Double et Variant
 

Pièces jointes

  • Conversion.xlsm
    19.6 KB · Affichages: 29

Franz68

XLDnaute Nouveau
Re : VBA - valeur qui se modifie au niveau des décimales

Merci Pierre-Jean pour ces explications très claires !!

du coup, pour être tranquille je vais utiliser systématiquement du Double ou du Variant ... comme cela j'éviterai ce genre d'ennui ...

ah nos machines qui ne connaissent que des 1 et des 0 !!!

merci encore pour tout !!

 

eriiic

XLDnaute Barbatruc
Re : VBA - valeur qui se modifie au niveau des décimales

Bonjour,

J'aurais une explication légèrement différente de celle de Pierre-Jean (exceptionnellement... )
Un Single a environ 5.5 chiffres de précision et 165.37 ne devrait pas être altéré.
Avec 165.37 dans une cellule :
Code:
Dim a As Single
a = Range("A2")
on obtient bien 165.37 avec un Single.

Par contre une cellule est Double et si on convertit le Single en Double ça se gâte :
Code:
Dim b As Double
b = a
on obtient b=165.369995117188
C'est plus la double conversion Double/Single/Double qui accumule les erreurs.
Ce qui ne contredit pas "j'ai lu que Single devrait générer moins d'écart dans la conversion décimal / binaire que Double car il est moins précis ...", à condition d'être en Single tout le temps ce qui n'est pas le cas.
La conclusion reste donc la même : rester en Double dès qu'on affaire à des cellules.
eric
 

pierrejean

XLDnaute Barbatruc
Re : VBA - valeur qui se modifie au niveau des décimales

Re

Sans vouloir te contrarier cher eriiic vois ce fichier ou il me semble que nous n'avons qu'un seule conversion Single/Double
NB: je n'ai pas (ou pas encore) trouvé comment traduire en binaire un nombre avec virgule
 

Pièces jointes

  • Pour_eric.xlsm
    19.1 KB · Affichages: 15

eriiic

XLDnaute Barbatruc
Re : VBA - valeur qui se modifie au niveau des décimales

Bonjour pierrejean,

Ca ne me contrarie pas, ça confirme que c'est la conversion Single/Double qui génère l'erreur
C'est cette conversion automatique lorsqu'on écrit sur la feuille qui produit l'erreur et non "que la valeur binaire la plus proche de 165,37 dans la série des binaires de 32 octets est 165,3697854 "

165.37 est bien stocké sans erreur visible en Single, et ce même s'il est issu d'un Double (lecture de cellule).
C'est ce que je voulais exprimer.

Pour ce qui est de la représentation des flottants en binaire tu as une présentation de la norme ici : https://fr.wikipedia.org/wiki/IEEE_754
Toi qui aime bien les calculs complexes ça devrait te plaire ;-)
eric
 

pierrejean

XLDnaute Barbatruc
Re : VBA - valeur qui se modifie au niveau des décimales

Re

OK eriiiic je m’étais braqué sur la double conversion
d’Après Wikipedia la conversion en Single de 165.37 ne nécessite pas plus de 32 bits (et non octets comme je l'ai écrit par erreur)
En effet la mantisse a besoin de 14 bits contre 23 disponibles
Je rectifie donc : Il s'agit probablement d'un gros Bug des sbires de Bill .Parce qu'a priori le passage a 64 bits ne devrait utiliser que 32 bits à 0
En espérant qu'un des grands ténors d'EXCEL en sache un peu plus
 

eriiic

XLDnaute Barbatruc
Re : VBA - valeur qui se modifie au niveau des décimales

Bah je relativise, le stockage n'est peut-être pas totalement innocent non plus.
165.37 a sans doute une suite infinie de décimales en binaire.
La conversion met en évidence voire amplifie l'erreur, difficile de faire la part des choses.
Sur ce : les valises à faire
 

ROGER2327

XLDnaute Barbatruc
Re : VBA - valeur qui se modifie au niveau des décimales

Bonjour à tous.


En pièce jointe, un essai de transcription de la norme IEEE 754.​


Bonne journée.


ℝOGER2327
#8282


Mardi 10 Gidouille 143 (Saint Boudin, recteur - fête Suprême Quarte)
6 Messidor An CCXXIV, 1,2620h - romarin
2016-W25-5T03:01:44Z
 

Pièces jointes

  • IEEE 754.xlsm
    26.4 KB · Affichages: 36

eriiic

XLDnaute Barbatruc
Re : VBA - valeur qui se modifie au niveau des décimales

Bonjour,

Interessant.
Je regarderai plus en détail à mon retour de vacances mais en regardant vite fait je vois que la perte de précision à lieu lors du stockage sur 32 bits.
Tu avais raison J'avoue que j'ai douté lorsque j'ai vu que l'écart était de 4.8 10-6, proche des 5.5 chiffres significatifs.
eric
 

Discussions similaires

Réponses
8
Affichages
802
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…