Excel vba
Résolu/Fermé
Caféi
-
16 déc. 2010 à 15:22
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 17 déc. 2010 à 16:18
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 17 déc. 2010 à 16:18
A voir également:
- Excel vba
- Liste déroulante excel - Guide
- Si et excel - Guide
- Word et excel gratuit - Guide
- Aller à la ligne excel - Guide
- Déplacer une colonne excel - Guide
10 réponses
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
16 déc. 2010 à 15:28
16 déc. 2010 à 15:28
Bonjour,
Rien à faire pour y remédier, inhérant à Excel. Tu peu employer Round().
A+
Rien à faire pour y remédier, inhérant à Excel. Tu peu employer Round().
A+
ccm81
Messages postés
10906
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
13 janvier 2025
2 429
Modifié par ccm81 le 16/12/2010 à 15:50
Modifié par ccm81 le 16/12/2010 à 15:50
bonjour
es tu sur que le nombre qui bugge n'est pas un arrondi a 2ch decimaux?
sinon peut être puisque tes nombres ont tous 2 ch decimaux
1. les x100
2. les tranformer en entier
3. faire la somme
4. la diviser par 100
bon courage
es tu sur que le nombre qui bugge n'est pas un arrondi a 2ch decimaux?
sinon peut être puisque tes nombres ont tous 2 ch decimaux
1. les x100
2. les tranformer en entier
3. faire la somme
4. la diviser par 100
bon courage
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
Modifié par lermite222 le 16/12/2010 à 16:11
Modifié par lermite222 le 16/12/2010 à 16:11
Bonjour Ccm,
Malheureusement, la solution que tu préconise ne donnerra pas de résultat, c'est un "défaut" d'excel et des MP, rien à faire si ce n'est Round().
Mais bon... je peu avoir manquer un escalier.
Il y a aussi la configuration des cellues avec 2 déc.
A+
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
Malheureusement, la solution que tu préconise ne donnerra pas de résultat, c'est un "défaut" d'excel et des MP, rien à faire si ce n'est Round().
Mais bon... je peu avoir manquer un escalier.
Il y a aussi la configuration des cellues avec 2 déc.
A+
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
ccm81
Messages postés
10906
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
13 janvier 2025
2 429
Modifié par ccm81 le 16/12/2010 à 16:20
Modifié par ccm81 le 16/12/2010 à 16:20
> re
j'ai essayé ça en travaillant avec le type double, ça marche mais peut etre jusqu'à un certain point ....
A1:A16 formatée a 2 ch decimaux
A16 est le total calculé par excel
A21 n'est pas formatée et ça donne le même resultat
bonne suite
j'ai essayé ça en travaillant avec le type double, ça marche mais peut etre jusqu'à un certain point ....
A1:A16 formatée a 2 ch decimaux
A16 est le total calculé par excel
A21 n'est pas formatée et ça donne le même resultat
Private Sub CommandButton1_Click() Dim cc s Long Dim cs As Double Dim tots As Double Dim tot As Long tot = 0 For li = 1 To 15 cs = Cells(li, 1) cc = Int(Round(100 * cs, 2)) tot = tot + cc Next li tots = Round(tot / 100, 2) Range("A21").Value = tots End Sub
bonne suite
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
Modifié par lermite222 le 16/12/2010 à 22:35
Modifié par lermite222 le 16/12/2010 à 22:35
Bonjour,
d'accord si format de cellue = 2 décimales, mais pas valable si.. non.
Reste toujour un nombre de décimales maxi.
A+
d'accord si format de cellue = 2 décimales, mais pas valable si.. non.
Reste toujour un nombre de décimales maxi.
A+
ccm81
Messages postés
10906
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
13 janvier 2025
2 429
16 déc. 2010 à 16:54
16 déc. 2010 à 16:54
> lermitte222
dans ma feuille A21 (la somme vba) est formatée "Normal"
dans ma feuille A21 (la somme vba) est formatée "Normal"
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
16 déc. 2010 à 17:27
16 déc. 2010 à 17:27
Bonjour,
La solution de ccm81 me semble être la bonne : il suffit d'utiliser le type Double pour TableauCAPays :
Dim TableauCAPays(n) as double
Par exemple si on place tes valeurs de A1 à A15, le code suivant fonctionne parfaitement :
Patrice
La solution de ccm81 me semble être la bonne : il suffit d'utiliser le type Double pour TableauCAPays :
Dim TableauCAPays(n) as double
Par exemple si on place tes valeurs de A1 à A15, le code suivant fonctionne parfaitement :
Sub test() Dim TableauCAPays(1) As Double Dim ctr As Integer For ctr = 1 To 15 TableauCAPays(1) = TableauCAPays(1) + Cells(ctr, 1).Value Next ctr Cells(16, 2).Value = TableauCAPays(1) End Sub
Patrice
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
16 déc. 2010 à 23:09
16 déc. 2010 à 23:09
Re,
Ont est (je pense) à côté du sujet, les additions ne génére jamais plus de décimales que celles des nombres additionnés.
En faisant simplement ...
ont optient 1247,27
Non, le probléme est certainement dans ce que contient déjà TableauCAPays(i)
Ou notre ami Caféi nous cache des choses :-D
Ont est (je pense) à côté du sujet, les additions ne génére jamais plus de décimales que celles des nombres additionnés.
En faisant simplement ...
For li = 1 To 15 tots = tots + Cells(li, 1) Next li Range("A21").Value = tots
ont optient 1247,27
Non, le probléme est certainement dans ce que contient déjà TableauCAPays(i)
Ou notre ami Caféi nous cache des choses :-D
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
Modifié par Patrice33740 le 16/12/2010 à 23:50
Modifié par Patrice33740 le 16/12/2010 à 23:50
C'est probablement un problème de déclaration, par exemple si tu déclare :
le résultat est 1247,2699
Dim TableauCAPays(1) As Single
le résultat est 1247,2699
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
Modifié par lermite222 le 17/12/2010 à 12:27
Modifié par lermite222 le 17/12/2010 à 12:27
Ont diraient que ça avance, :-)
Patrice : Avec Single tu a bien en affichage 1247,2699 mais si tu sélectionne la cellule tu a dans la barre des formules.. 1247,26989746093 !!
Avec un variant et un DOUBLE, 1247,27
C'est encore une des bizarrerie d'excel, un double devrait donner au moins autant de décimales qu'un single or c'est pas le cas.
Caféi : Il te reste 2 solutions.
1°) Déclarer ton tableau en Double
2°) Employer Round(), et si tu veux une fonction Round() avec disposition européenne tu peu employer la fonction de Patrice
A+
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
Patrice : Avec Single tu a bien en affichage 1247,2699 mais si tu sélectionne la cellule tu a dans la barre des formules.. 1247,26989746093 !!
Avec un variant et un DOUBLE, 1247,27
C'est encore une des bizarrerie d'excel, un double devrait donner au moins autant de décimales qu'un single or c'est pas le cas.
Caféi : Il te reste 2 solutions.
1°) Déclarer ton tableau en Double
2°) Employer Round(), et si tu veux une fonction Round() avec disposition européenne tu peu employer la fonction de Patrice
A+
L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
17 déc. 2010 à 15:13
17 déc. 2010 à 15:13
Re,
Ce n'est pas une bizarrerie mais un problème de précision mathématique.
Les variables représentées par des nombres à virgule flottante sont des
approximations plus ou moins précises.
Le type Single utilise 32 bits pour représenter le nombre :
- 1 bit de signe, 8 bits pour l'exposant et 23 bits pour la mantisse
- soit un nombre décimal avec 7 chiffres significatifs
Le type Double utilise 64 bits pour représenter le nombre :
- 1 bit de signe, 11 bits pour l'exposant et 52 bits pour la mantisse
- soit un nombre décimal avec 16 chiffres significatifs
Pour prendre l'exemple actuel 1247,27 s'écrit :
En Single :
01000100100110111110100010100011
soit :
0 10001001 00110111110100010100011
signe : 0
= +
exposant : 10001001
= 137 - 127
= 10
mantisse : [1,]00110111110100010100011
= 1 + 0/2 + 0/4 + 1/8 + 1/16 + 0/32 + 1/64 + ....
= 1,2180370
résultat : + 1,2180370 * 2 ^ 10
= 1247,269888
En Double :
0100000010010011011111010001010001111010111000010100011110101110
soit :
0 10000001001 0011011111010001010001111010111000010100011110101110
signe : 0
= +
exposant : 10000001001
= 1033 - 1023
= 10
mantisse : [1,]0011011111010001010001111010111000010100011110101110
= 1 + 0/2 + 0/4 + 1/8 + 1/16 + 0/32 + 1/64 + ....
= 1,2180371093750000
résultat : + 1,218037109375 * 2 ^ 10
= 1247,27
CQFD
Ce n'est pas une bizarrerie mais un problème de précision mathématique.
Les variables représentées par des nombres à virgule flottante sont des
approximations plus ou moins précises.
Le type Single utilise 32 bits pour représenter le nombre :
- 1 bit de signe, 8 bits pour l'exposant et 23 bits pour la mantisse
- soit un nombre décimal avec 7 chiffres significatifs
Le type Double utilise 64 bits pour représenter le nombre :
- 1 bit de signe, 11 bits pour l'exposant et 52 bits pour la mantisse
- soit un nombre décimal avec 16 chiffres significatifs
Pour prendre l'exemple actuel 1247,27 s'écrit :
En Single :
01000100100110111110100010100011
soit :
0 10001001 00110111110100010100011
signe : 0
= +
exposant : 10001001
= 137 - 127
= 10
mantisse : [1,]00110111110100010100011
= 1 + 0/2 + 0/4 + 1/8 + 1/16 + 0/32 + 1/64 + ....
= 1,2180370
résultat : + 1,2180370 * 2 ^ 10
= 1247,269888
En Double :
0100000010010011011111010001010001111010111000010100011110101110
soit :
0 10000001001 0011011111010001010001111010111000010100011110101110
signe : 0
= +
exposant : 10000001001
= 1033 - 1023
= 10
mantisse : [1,]0011011111010001010001111010111000010100011110101110
= 1 + 0/2 + 0/4 + 1/8 + 1/16 + 0/32 + 1/64 + ....
= 1,2180371093750000
résultat : + 1,218037109375 * 2 ^ 10
= 1247,27
CQFD
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
17 déc. 2010 à 16:07
17 déc. 2010 à 16:07
Patrice... n'essaye pas d'en faire plus qu'il ne faut..
Les constatations sont là.
A+
Les constatations sont là.
A+
Je vois que ma question à fait fureur !
Je vais utiliser Double.
Merci beaucoup pour toutes les réponses que vous m'avez apporté !
Je vais utiliser Double.
Merci beaucoup pour toutes les réponses que vous m'avez apporté !
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 191
17 déc. 2010 à 16:07
17 déc. 2010 à 16:07
Tu a fait la bonne options.
A+
A+
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 779
17 déc. 2010 à 16:18
17 déc. 2010 à 16:18
Pour éviter ce genre de désagrément il suffit simplement d'utiliser systématiquement :
Option Explicit
en début de module
Option Explicit
en début de module