Bonsoir,
Petit souci VBA Excel
Un petit souci je n'arrive pas à convertir en VBA la fonction precedente:
Je trouve à chaque fois le mauvais résultat, je craque pourtant ca doit pas etre...Code:=ENT(MOD(ENT((A1-2)/7)+0,6;52+5/28))+1
Merci:aie:
Version imprimable
Bonsoir,
Petit souci VBA Excel
Un petit souci je n'arrive pas à convertir en VBA la fonction precedente:
Je trouve à chaque fois le mauvais résultat, je craque pourtant ca doit pas etre...Code:=ENT(MOD(ENT((A1-2)/7)+0,6;52+5/28))+1
Merci:aie:
bonsoir
As tu essayé d'utiliser la méthode Evaluate?
Code:MsgBox Application.Evaluate("INT(MOD(INT((A1-2)/7)+0.6,52+5/28))+1")
michel
hello
en fait, tu dois utiliser formulalocal
et fait atention au séparateur du 0.6 ou 0,6. sur ma bacane, j'ai du le changer, mais la ça marcheCode:Cells(2, 2).FormulaLocal = "=ENT(MOD(ENT((A1-2)/7)+0.6;52+5/28))+1"
voila voila
Je crois avoir cerné le problème à deaqu1 .. il sagit de la fonction MOD d'excel qui ne donne pas le même résultat que l'opérateur Mod de VBA ...
le code à SilkyRoad en utilisant la méthode Evaluate, utilise la fonction MOD d'excel..et permet de contourner le problème..
vu dans l'aide en ligne VBA :
donc en VBA avec l'opérateur modulo les arguments sont "arrondi" ... d'ou ..Citation:
L'opérateur modulo, ou reste, divise l'argument number1 par l'argument number2 (en arrondissant les nombres à virgules flottantes à des nombres entiers) et ne retourne que le reste dans l'argument result. Par exemple, dans l'expression ci-dessous, A (argument result) est égal à 5.
par exemple
donne 11Code:(634.6 Mod 52)
comme
ce qui n'est pas le cas avec la fonction MOD d'excel qui renvoie 10.6 pourCode:(635 Mod 52)
et 11 avec 635.....Code:=Mod(624.6;52)
une solution alternative à celle à SilkyRoad .. et d'utiliser "l'équivalent" à la fonction MOD d'excel .. que l'on trouve dans l'aide en ligne :
Citation:
La fonction MOD peut aussi s'exprimer en utilisant la fonction ENT :
MOD(n, d) = n - d*INT(n/d)
;)
J'ai réussi à m'en sortir de la façon suivante...
C'est barbare, je sais...Code:
1
2
3
4
5
6
7
8
9
10
11
12 Sheets("Feuil1").Select For j = 1 To 7 Valeur = ActiveSheet.Range("C" & j).Value n1 = Int((Valeur - 2) / 7) + 0.6 n2 = 52 + 5 / 28 n3 = Int(n1 - n2 * Int(n1 / n2)) + 1 ActiveSheet.Range("f" & j).Value = n3 Next
A la rigueur si quelqu'un aune astuce pour tout compresser, c'est pas de refus.
PS: Merci Bbil pour tes petits cours...8O
Bonjour
Citation:
Un petit souci je n'arrive pas à convertir en VBA la fonction precedente:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
=ENT(MOD(ENT((A1-2)/7)+0,6;52+5/28))+1
-->>Citation:
J'ai réussi à m'en sortir de la façon suivante...
Sheets("Feuil1").Select
For j = 1 To 7
Valeur = ActiveSheet.Range("C" & j).Value
n1 = Int((Valeur - 2) / 7) + 0.6
n2 = 52 + 5 / 28
n3 = Int(n1 - n2 * Int(n1 / n2)) + 1
ActiveSheet.Range("f" & j).Value = n3
Next
C'est barbare, je sais...
A la rigueur si quelqu'un aune astuce pour tout compresser, c'est pas de refus.
En précisant que cela n'est pas une "astuce"Code:MsgBox Int((Range("A1").Value - 2) / 7 + 0.6) Mod (52 + (5 / 28) + 1)
Bonsoir
Pièce jointe 447177Code:
1
2
3
4
5
6
7
8
9
10
11
12 Sub test() MsgBox Excelfunction_MOD(127.357, 33.2) MsgBox Excelfunction_MOD(183.5, 34) MsgBox Excelfunction_MOD(2345.58, 87) End Sub ' ' Function Excelfunction_MOD(N, D) NBdec = Len(Replace(CStr(N), Int(N), "")) 'NBdec = Len(CStr(N - Int(N))) 'etonnament avec celle ci le resultat n'arrondi pas les decimale Excelfunction_MOD = Round(N - D * Int(N / D), NBdec) End Function
edit:
petite correction sur le nombre de decimal
Code:
1
2 Dim NbDec NbDec = Len(Replace(CStr(N), Int(N) & ",", ""))
Bonjour patricktoulon
Toujours prendre pour base le plus grand nombre de décimales entre celui du nombre et celui de son diviseur.
re
oui je l'ai remarqué en faisant les tests
bref c'est propre comme fonction
ce qui me pertube plus c'est les 2 nbdec qui me donne le meme nombre de decimal sauf que le resultat en nombre de decimales arrondi est différent c'est une enigme
teste une fois l'un une fois l'autre tu verra
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 Sub test() MsgBox Excelfunction_MOD(127.357, 33.2) MsgBox Excelfunction_MOD(183.5, 34) MsgBox Excelfunction_MOD(2345.58, 87) End Sub ' ' Function Excelfunction_MOD(N, D) As Double Dim NbDec NbDec = Len(Replace(CStr(N), Int(N) & ",", "")) donne le nombre de decimal 'NbDec = Len(CStr(N - Int(N))) - 1 ' donne pareil mais etonnament avec celle ci le resultat n'arrondi pas les decimale Excelfunction_MOD = Round(N - D * Int(N / D), NbDec) End Function
Résultat de difficultés de Excel en matière d'arithmétique flottante.Citation:
ce qui me pertube plus c'est les 2 nbdec qui me donne le meme nombre de decimal sauf que le resultat en nombre de decimales arrondi est différent c'est une enigme
C'est la raison pour laquelle je préfère personnellement calculer dur la base d'une puissance de 10, ainsi :
où nbdec est le nombre le plus élevé de décimales entre le nombre et son diviseur.Code:Excelfunction_MOD = ((N * (10 ^ NbDec)) Mod (D * (10 ^ NbDec))) / 10 ^ NbDec
Inconvénient -->> limites des nombres trop élevés ou/et d'un nbdec trop élevé (mais je vois mal à quelles occasions on aurait alors besoin de calculer utilement de tels restes).
Bonne nuit