problème de précision avec valeur collée dans cellule depuis vba

Roland_M

XLDnaute Barbatruc
Bien le bonjour à tout le monde,

Tout d'abord mes meilleurs voeux à toutes et à tous pour l'année 2015,
avec une petite pensée pour Monique !

Concernant mon problème de précision il est déjà connu mais cette fois c'est différent !
depuis vba Cells(Lig, Col) = MaValeur! (l'exemple qui suit c'est juste pour l'explication non vérifié)
il est possible que 7.77 depuis vba, dans la cellule on se retrouve avec 7.76999...
je ne parle de format cellule, je peux avoir à l'affichage 7.70, mais en passant sur la cellule on aura bien ce 7.76999...
certains diront que ce n'est pas si grave, moi je répond que si ! je m'excuse mais je suis carré, 0.02 c'est pas 0.0199
car si vous devez effectuer un test de comparaison if Cells()=7.7 la réponse sera non !

mais comme on en a déjà discuté je ne reviendrai pas là-dessus !

mon problème c'est que ça c'est généralisé !? je m'en suis aperçu seulement hier !
je pense donc aux problèmes de mise à jour récente d'office !? est-ce possible !?

j'ai un classeur de gestion de compte en banque avec une feuille par année
et comme tous les ans j'ai une fonction que me crée une nouvelle feuille
et recopie certaines valeurs retraits, virements ... mensuels.
et là surprise la plupart des valeurs à deux décimales sont fausses !?
exemple: V! = 37.83: Cells(Lig, Col) = V! et là j'ai 37,8300018310546
par contre si met en dur Cells(Lig, Col) = 37.83 là c'est ok !
j'ai essayé avec V# c'est encore pire !

pour l'instant j'ai solutionné avec Str(V!) qui colle les résultats exactes
ce que je ne comprend pas c'est que ça fonctionné ainsi avant et ce depuis le début des années 2000

c'est un comble de commencer à bidouiller pour avoir de bons résultats !
et s'il faut revoir tous mes classeurs pour mettre str() ça va pas le faire !
où est la fiabilité dans tout ça lorsqu'on travaille sur des classeurs "sérieux"


avez vous rencontré ce problème !?
si vous voulez bien faire cet essai en copiant ce petit Sub
en formatant les 6 cellules(A1:A6) au format nombre 2 décimales

Sub Essais()
For C = 1 To 6: V! = Choose(C, 37.83, 25.48, 79.3, 150.77, 52.15, 27.45): Cells(C, 1) = V!: Next
End Sub

'perso j'ai:
'valeurs > résultats
'37.83 > 37,8300018310546
'25.48 > 25,4799995422363
'79.30 > 79,3000030517578
'150.77 > 150,77000427246
'52.15 > 52,1500015258789
'27.45 > 27,4500007629394

merci d'avance

EDIT: j'oublié de dire que dans les options avancées on peut cocher: définir le calcul avec la précision au format affiché
mais pour moi ça ne me parait pas convenable !?
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : problème de précision avec valeur collée dans cellule depuis vba

Bonjour Roland_M

Avec cette sub cela semble aller mieux (pourquoi le ! ????)

Code:
Sub Essais()
For C = 1 To 6: V = Choose(C, 37.83, 25.48, 79.3, 150.77, 52.15, 27.45): Cells(C, 1) = V: Next
End Sub
 

Roland_M

XLDnaute Barbatruc
Re : problème de précision avec valeur collée dans cellule depuis vba

bonjour à toi pierrejean !

petite précision !
V! c'est une variable simple précision !

par principe dans mes programmes je défini en début de module
DefInt A-Z
ceci pour une question de clarté et de rapidité (vieux réflexe du temps du QuickBasic 4.5)
et ensuite je précise mes variables V! V# V$ ainsi je vois de suite à la lecture du code de quoi il en retourne !

maintenant si toi tu fais l'essai comme ça, alors V est considéré comme Variant

EDIT: j'ai fais l'essai et là c'est vrai que c'est ok !
mais tout en variant ça va pas le faire !?

pour l'instant j'utilise Str() au moment de l'écriture qui semble fonctionner
sinon j'utilise aussi des fonctions du genre, selon 1 2 ou 3 digit:

Public Function FFormatNum2Digit$(X#)
Z$ = Trim(Format(X#, "0.00")): FFormatNum2Digit$ = Replace(Z$, ",", ".")
End Function
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : problème de précision avec valeur collée dans cellule depuis vba

Re

Vu: le ! détermine une variable de type Single

Cette sub fonctionne également

Code:
Sub Essais()
For C = 1 To 6: V# = Choose(C, 37.83, 25.48, 79.3, 150.77, 52.15, 27.45): Cells(C, 1) = V#: Next
End Sub

Et entre nous cela me conforte dans ma détestable habitude d'ignorer l'Option Explicit !!!!

Edit: Avais pas encore vu ta réponse
Bonne et heureuse année à toi et aux tiens (j'aurais commencer par là)
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Re : problème de précision avec valeur collée dans cellule depuis vba

Bonjour,

Pour compléter pierrejean, !=> As Single
Déclare V as Double, ou as Currency qui est prévu pour les comptes (entier avec virgule fixe 4 décimales)

Bonne et heureuse année à tous
eric

edit: Ah, pierrejean a complété, du coup je doublonne, tant pis :)
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
Re : problème de précision avec valeur collée dans cellule depuis vba

re

moi aussi je n'utilise jamais Option Explicit

effectivement ici dans l'essai simple de la boucle, V# fonctionne aussi !
mais dans mes codes non !
probablement que c'est du à la variable qui se "balade" un peu partout dans les codes entre Sub !?


EDIT: merci Eric pour ta réponse !

mais ailleurs j'utilise aussi tout en # (double) et cette fonction pour coller les valeurs dans les cellules
Public Function FFormatNum2Digit$(X#)
Z$ = Trim(Format(X#, "0.00")): FFormatNum2Digit$ = Replace(Z$, ",", ".")
End Function

j'ai donc rectifié pour V! et j'utilise cette fonction aussi qui fonctionne bien !
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : problème de précision avec valeur collée dans cellule depuis vba

Bonne année.
j'ai essayé avec V# c'est encore pire !
Avez vous essayé avec V@ ?
Mais attention, il faut le spécifier aussi derrière les constantes : 37.83@
VB:
Sub ÀTester()
Dim N&, V
For N = 1 To 2
   V = Choose(N, 37.83!, 37.83@)
   MsgBox "V = " & V _
      & vbLf & "V * 100 - " & Int(V * 100 + 0.5) & " = " & V * 100 - Int(V * 100 + 0.5) _
      & vbLf & "TypeName(V) = " & TypeName(V)
   Next N
End Sub
37.83 ne peut en aucun cas être représenté exactement en Double, en dépit des apparences.
VB:
MsgBox "Mais avec les Double, il triche !" _
   & vbLf & "37.83 * 100 - 3783 = " & 37.83 * 100 - 3783
Remarque: Par contre 37,830078125 ne pourrait être représenté exactement en Currency.
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
Re : problème de précision avec valeur collée dans cellule depuis vba

re

bonjour à toi Dranreb et merci pour ton intervention !

alors voilà:
j'utilisais, par habitude(toujours les habitudes!), des vars single ou double !
je n'avais jamais essayé currency
eh bien comme quoi il y a un début à tout, je viens de tout corriger en currency ou @
et apparemment tout est OK sans fonction et autres subterfuges

voilà une année qui démarre bien !
et je suis moins c.. qu'il y a 5 minutes !
bonne journée à vous tous !
 

Roland_M

XLDnaute Barbatruc
Re : problème de précision avec valeur collée dans cellule depuis vba

re

à propos des variables, Integer ou Long, sur le site de myDearFriend!
VBA et les variables - Tutoriels & Astuces Excel > VBA pour débutants - Tutoriels : myDearFriend! Excel Pages

je viens de lire ceci, très intéressant (moi qui Declare toujours DefInt A-Z je vais donc rectifier)
-----------------------------------------
Type Integer ou type Long ?
Traditionnellement, les développeurs VBA utilisent le type Integer lorsque les valeurs à stocker le permettent, parce que ce type de données requiert moins de ressources mémoire que le type Long (c'est même la règle du jeu expliquée ci-dessus).

Toutefois, une information d'importance semble méconnue :
aujourd'hui VBA convertit automatiquement en interne tous les éléments de type Integer en élément de type Long, et ce, même si la déclaration explicite est "As Integer". Il est donc devenu préférable aujourd'hui d'utiliser le type Long en lieu et place du type Integer pour accroître les perfomances du code. En fait, le traitement des variables de type Long est même devenu plus rapide car ce type de données n'a pas besoin d'être converti avant traitement !
------------------------------------------------
 
Dernière édition:

Discussions similaires