Décimales et VBA [Résolu]

DoDwDn_ 12 Messages postés samedi 18 août 2007Date d'inscription 2 mars 2009 Dernière intervention - 11 févr. 2009 à 15:02 - Dernière réponse : DoDwDn_ 12 Messages postés samedi 18 août 2007Date d'inscription 2 mars 2009 Dernière intervention
- 16 févr. 2009 à 10:55
Bonjour à tous,

Je voux expose mon problème :

Je travaille avec des tarifs incluant 5 décimales.

Sur un tableau, tout fonctionne parfaitement, je peux exporter mes données sans problème.
Sur un autre tableau, vba m'arrondit mes valeurs au mieux à la 4ème décimale.

Mon code ne contient pas de variable de type Integer au lieu de Double, mes cellules sont bien formatées (de toute façon, la valeur est fausse dans la fenêtre exécution).

Voici le code tout bête :
[...]
With bd2
        .Range("B" & li2) = mat.Range("J24")
        .Range("C" & li2) = mat.Range("J22")
        .Range("D" & li2) = mat.Range("G32")
        .Range("E" & li2) = mat.Range("J26")
        .Range("F" & li2) = mat.Range("J27")
        .Range("G" & li2) = mat.Range("J28")
        .Range("H" & li2) = mat.Range("J30")
        .Range("I" & li2) = mat.Range("J31")
        .Range("J" & li2) = mat.Range("J32")
    End With
[...]

Il n'y a donc rien de problématique (le code pour les 2 tableaux est sensiblement le même).
J'ai tenté avec Round(mat.Range("J27"), 5) ou format(mat.Range("J27", "0.00000") et le résultat est le même, c'est à dire un arrondi à la 4éme décimale.

Je sèche complètement...
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
hebus16 80 Messages postés vendredi 14 mai 2004Date d'inscription 2 octobre 2009 Dernière intervention - 11 févr. 2009 à 16:25
3
Merci
ah bhé celle là elle est pas mal dis donc .. effectivement en format numéraires VBA s'enflamme et arrondi de base à 4 décimales ... choix Microsoft ? c'est space je pense que tu vas avoir un soucis de gestion de tes données .. je te conseille de tout passer en format numérique cela sera plus sur ... il te reste à gérer l'unité monetaire séparement

Merci hebus16 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de hebus16
hebus16 80 Messages postés vendredi 14 mai 2004Date d'inscription 2 octobre 2009 Dernière intervention - 11 févr. 2009 à 15:06
0
Merci
Salut ,

J'aurai tendance à dire que cela vient des formats des cellules de gauche pas celle de droite ^^
En effet tu places dans les colonnes B C D E F G H I J les valeurs de la colonne J donc c'est la destination finale qui n'est pas bien formater
Sinon mets des mat.Range("J32").Value mais je suis pas sur que ca vienne de là
Commenter la réponse de hebus16
DoDwDn_ 12 Messages postés samedi 18 août 2007Date d'inscription 2 mars 2009 Dernière intervention - 11 févr. 2009 à 15:21
0
Merci
J'ai essayé de formater en numéraire ou monétaire, mais rien.

Ce qui me gêne plus, c'est qu'en mettant un tarif type '"0,0187" dans une cellule d'un classeur pour tester, en faisant, dans la fenêtre exécution : ? Range("B32") : il m'arrondit quand même ma valeur à "0,0187".

Pour moi, cela signifie que même VBA ne prend pas la bonne valeur.

Et je n'ai pas d'option type calcul au format affiché ou autre (d'ailleurs même le format affiché serait correct !).

Une autre idée ?
Commenter la réponse de DoDwDn_
hebus16 80 Messages postés vendredi 14 mai 2004Date d'inscription 2 octobre 2009 Dernière intervention - 11 févr. 2009 à 15:29
0
Merci
La je dois avouer que j'ai pas compris ton post ... tu peux toujours considéré que l'arrondi de 0,0187 est bel et bien égale à 0,0187 .. tu auras du mal à lui faire dire le contraire.
D'apres ce que j'ai compris tu as des données dans la colonne J qui posséde des chiffres à 5 decimales et tu veux les placer dans d'autres cellules mais ça réduit à 4 décimales ? as tu verifié avant la copie que c'est bien 5 decimales que tu passes et 4 que tu recuperes ?
Genre avant chaque copie fait un
  Msgbox "AVANT " & bd2.Range("B" & li2).Value
     bd2.Range("B" & li2) = mat.Range("J24")
  Msgbox "APRES " & mat.Range("J24").Value

et regarde ce que les msgbox te retournent
Commenter la réponse de hebus16
DoDwDn_ 12 Messages postés samedi 18 août 2007Date d'inscription 2 mars 2009 Dernière intervention - 11 févr. 2009 à 15:39
0
Merci
Je veux récupérer et écrire le chiffre à 5 décimales.

J'ai testé avec les MsgBox, et la MsgBox "AVANT" ne prend pas la 5ème décimale.
Pour "0,01874", la MsgBox m'affiche un joyeux "0,0187".

L'arrondi est juste, mais les calculs seront faussés si cette fameuse 5ème décimale est omise.

Je comprends pas pourquoi VBA interprète ma valeur, alors que je ne lui demande rien d'autre que de la lire.

Je viens de me faire un petit test, et le résultat est toujours le même : "0,0187".

Sub test()
Dim px1 As String
Dim px2 As Double
px1 = Range("B23")
MsgBox px1
px2 = Range("B23")
MsgBox px2
End Sub

Je désespère....
Commenter la réponse de DoDwDn_
hebus16 80 Messages postés vendredi 14 mai 2004Date d'inscription 2 octobre 2009 Dernière intervention - 11 févr. 2009 à 16:08
0
Merci
Quand tu fais un clic droit sur ta cellule et que tu prends le format de cellule tu as quoi ? parce que c'est étrange que ta donnée de référence soit déjà arrondi ... de mon coté j'arrive pas à reproduire ton cas
Commenter la réponse de hebus16
DoDwDn_ 12 Messages postés samedi 18 août 2007Date d'inscription 2 mars 2009 Dernière intervention - 11 févr. 2009 à 16:16
0
Merci
J'ai un format monétaire avec 5 décimales.

Je viens de tester en format nombre et cela fonctionne parfaitement !?

Je pense qu'on tient quelque chose...

Cela voudrait dire que VBA ne gère pas les décimales monétaires de la même manière que les décimales numéraires ?

As-tu de ton côté le problème d'arrondi avec un format monétaire ?
Commenter la réponse de DoDwDn_
DoDwDn_ 12 Messages postés samedi 18 août 2007Date d'inscription 2 mars 2009 Dernière intervention - 11 févr. 2009 à 16:38
0
Merci
J'avais mis le format monétaire pour une question de justesse d'affichage, mais bon, je vais passer le tout en numéraire (d'ailleurs, si ça se trouve personne ne le verra !).


Par contre, je me permet de modifier ta réponse :

hebus16 a dit :
ah bhé celle là elle est pas mal dis donc .. effectivement en format monétaire VBA s'enflamme et arrondi de base à 4 décimales ... choix Microsoft ? c'est space je pense que tu vas avoir un soucis de gestion de tes données .. je te conseille de tout passer en format numérique cela sera plus sur ... il te reste à gérer l'unité monetaire séparement

Je vais continuer à chercher les raisons de ce fonctionnement par ailleurs, histoire d'en savoir un peu plus...

Merci beaucoup en tout cas pour ton aide !


 
Commenter la réponse de DoDwDn_
hebus16 80 Messages postés vendredi 14 mai 2004Date d'inscription 2 octobre 2009 Dernière intervention - 11 févr. 2009 à 16:41
0
Merci
Pas de soucis ... je me suis enflammé je pensais déjà a la suite de ce que j'allais écrire à ce moment là mdr :p comme quoi il n'y pas que Excel qui fait n'importe quoi
Commenter la réponse de hebus16
Molenn 797 Messages postés mardi 7 juin 2005Date d'inscription 23 février 2011 Dernière intervention - 11 févr. 2009 à 16:54
0
Merci
J'arrive après la guerre, et je n'ai rien testé mais, juste pour voir si ça peut aider.

Si tu tiens à garder ton format monétaire, tu peux peut-être essayer d'utiliser la propriété .text de ta cellule plutôt que la propriété .value (quand tu ne précises pas comme tu le fais, c'est la .value qui est utilisée). En effet, la propriété .text récupère ce qui est affiché dans ta cellule et non sa valeur (intéressant à savoir quand on use et abuse des formats personnalisés ).

Voilà ma modeste contribution

Molenn
Commenter la réponse de Molenn
DoDwDn_ 12 Messages postés samedi 18 août 2007Date d'inscription 2 mars 2009 Dernière intervention - 16 févr. 2009 à 10:55
0
Merci
Effectivement, la propriété .text renvoie la bonne valeur, mais aussi le sigle "€".

Ce qui complique la tâche, puisque pour pouvoir effectuer des calculs, il faut reconvertir la valeur un valeur numérique.

Je trouve plus simple de simplement changer l'affichage, mais ça fait quand même une alternative, qui peut servir un jour ou l'autre à quelqu'un.

Merci pour cette proposition, Molenn !
Commenter la réponse de DoDwDn_

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.