je peux trouver la variable r valant entre 0.01 à 0.9999999999999 pour résoudre
toute équation égale à 0
avec la macro "test" mais je n'y arrive pas avec un fonction perso,
voici ma solution avec une macro et j'aimerais la transformer en une fonction
générale,
Sub test()
Dim i, z, a1, a2, r
FVt = 210
PV1 = 100
PV2 = 101
t1 = 0.5
t2 = 0.75
a1 = "0.0"
For i = 0 To 9
r = CDbl(Str("" & a1 & i))
z = Exp(Application.Ln((FVt - PV1 * (1 + r) ^ t1) / PV2) / t2) - 1 - r
If z < 0 Then
a1 = Str("" & a1 & i - 1)
i = Empty
If a2 = z Then Exit For
End If
a2 = z
Next
MsgBox CDbl(a1)
End Sub
voici ou je suis rendu en utilisant Evaluate et des cellules nommées, mais ce
n'est pas bon
Function r_value(FVt, PV1, PV2, t1, t2, r, equation)
a1 = [r]
For i = 0 To 9
[r_v] = CDbl(Str("" & a1 & i))
z = Evaluate(equation)
If z < 0 Then
a1 = Str("" & a1 & i - 1)
i = Empty
If a2 = z Then Exit For
End If
a2 = z
Next
r_value = CDbl(a1)
End Function
merci par avance de passer du temps sur mon problème,
un autre exemple à vérifier sur la Function test_evaluate2 k est exactement égal à "valeur1 + valeur2 - " & r & " +" & r & "+0" comme sur la Function test_evaluate1 mais test_evaluate1 retourne 3 et test_evaluate2 retourne #VALEUR!
'sur la feuille: 2 cellules nommées valeur1 et valeur2, contenant les valeurs 1 et 2
Function test_evaluate1(valeur1, valeur2) ' sur la feuille =test_evaluate1(valeur1;valeur2) r = 0 test_evaluate1 = Evaluate("valeur1 + valeur2 - " & r & " +" & r & "+0") End Function
Function test_evaluate2(f) ' sur la feuille =test_evaluate2(L4) cellule L4 contient (valeur1 + valeur2 - " & r & " +" & r & "+0) r = 0 k = f 'pour vérifier test_evaluate2 = Evaluate(f) End Function
un autre exemple à vérifier
sur la Function test_evaluate2 k est exactement égal à "valeur1 + valeur2
- " & r & " +" & r & "+0"
comme sur la Function test_evaluate1
mais
test_evaluate1 retourne 3
et
test_evaluate2 retourne #VALEUR!
'sur la feuille: 2 cellules nommées valeur1 et valeur2, contenant les valeurs 1 et 2
Function test_evaluate1(valeur1, valeur2) ' sur la feuille
=test_evaluate1(valeur1;valeur2)
r = 0
test_evaluate1 = Evaluate("valeur1 + valeur2 - " & r & " +" & r & "+0")
End Function
Function test_evaluate2(f) ' sur la feuille =test_evaluate2(L4) cellule L4
contient (valeur1 + valeur2 - " & r & " +" & r & "+0)
r = 0
k = f 'pour vérifier
test_evaluate2 = Evaluate(f)
End Function
un autre exemple à vérifier sur la Function test_evaluate2 k est exactement égal à "valeur1 + valeur2 - " & r & " +" & r & "+0" comme sur la Function test_evaluate1 mais test_evaluate1 retourne 3 et test_evaluate2 retourne #VALEUR!
'sur la feuille: 2 cellules nommées valeur1 et valeur2, contenant les valeurs 1 et 2
Function test_evaluate1(valeur1, valeur2) ' sur la feuille =test_evaluate1(valeur1;valeur2) r = 0 test_evaluate1 = Evaluate("valeur1 + valeur2 - " & r & " +" & r & "+0") End Function
Function test_evaluate2(f) ' sur la feuille =test_evaluate2(L4) cellule L4 contient (valeur1 + valeur2 - " & r & " +" & r & "+0) r = 0 k = f 'pour vérifier test_evaluate2 = Evaluate(f) End Function
isabelle
le fichier de cette nouvelle exemple http://cjoint.com/?DCwgHwMF1vh
le fichier de cette nouvelle exemple http://cjoint.com/?DCwgHwMF1vh
le fichier de cette nouvelle exemple http://cjoint.com/?DCwgHwMF1vh
MichD
Dis pourquoi tu ne l'aimes pas ma fonction? Quel est son défaut? Elle marche? ;-)) Si tu le désires, tu peux utiliser comme paramètres les noms (non la référence aux noms (names)) de ta fonction.
Ce que tu cherches à faire, c'est possible comme ceci :
Quelques remarques sur la fonction "Evaluate" A ) Elle évalue une chaîne de caractères. Le symbole "+" est lu comme étant le symbole "&" qui existant, je crois, dans un langage précédent "Basic"
B ) La fonction Evaluate() évolue dans un environnement "VBA", en conséquence regarde ce que j'ai fait dans ma fonction, je remplace systématiquement la virgule pour le point si l'usager emploie la virgule comme séparateur décimal. Dans le cas où il utilise déjà le point, la ligne de code ne fait rien, mais c'est une sécurité "nécessaire". Comment faire ça quand tu utilises des "NOMS" (name) représentant la valeur d'une cellule? ou dans les paramètres que tu passes à la fonction?
C ) N'oublie pas que ce dont tu as de besoin, c'est une fonction récursive qui s'appelle elle-même jusqu'à ce que la valeur recherchée soit atteinte. Regarde ce qui se passe dans ta procédure d'origine lorsque le code exécute cette ligne de code que tu répètes à 2 endroits : Names("r_v").RefersTo = [R_V] + (1 / b) Quelle est la partie de ta fonction qui fait cela? Encore une fois, regarde la fonction que je t'ai fournie. (En passant, j'en profite pour te mentionner que cette ligne de code à ma fonction "If a1 = z Then Exit For" ne sert à rien, c'est simplement un oubli, de même pour la déclaration de la variable a1.)
D ) Les variables d'une fonction qui ne sont pas passées en paramètres comme dans ton exemple n'ont pas besoin de faire partie de l'expression à évaluer par "Evaluate".
E ) Si tu as réussi à faire fonctionner tout cela et que tu obtiens le résultat attendu, bravo!
'-------------------------------- Function test_evaluate1(valeur1 As Long, valeur2 As Long) Dim R As Long test_evaluate1 = Evaluate("Sum(" & valeur1 & "," & valeur2 & ")-" & R + R) End Function '--------------------------------
Dis pourquoi tu ne l'aimes pas ma fonction? Quel est son défaut? Elle
marche? ;-))
Si tu le désires, tu peux utiliser comme paramètres les noms (non la
référence aux
noms (names)) de ta fonction.
Ce que tu cherches à faire, c'est possible comme ceci :
Quelques remarques sur la fonction "Evaluate"
A ) Elle évalue une chaîne de caractères. Le symbole "+" est lu comme
étant le symbole "&" qui existant, je crois, dans un langage précédent
"Basic"
B ) La fonction Evaluate() évolue dans un environnement "VBA", en
conséquence
regarde ce que j'ai fait dans ma fonction, je remplace systématiquement
la
virgule pour le point si l'usager emploie la virgule comme séparateur
décimal.
Dans le cas où il utilise déjà le point, la ligne de code ne fait rien,
mais c'est
une sécurité "nécessaire". Comment faire ça quand tu utilises des
"NOMS" (name)
représentant la valeur d'une cellule? ou dans les paramètres que tu
passes à la fonction?
C ) N'oublie pas que ce dont tu as de besoin, c'est une fonction récursive
qui s'appelle
elle-même jusqu'à ce que la valeur recherchée soit atteinte. Regarde ce
qui se passe
dans ta procédure d'origine lorsque le code exécute cette ligne de code
que tu répètes
à 2 endroits : Names("r_v").RefersTo = [R_V] + (1 / b)
Quelle est la partie de ta fonction qui fait cela? Encore une fois,
regarde la fonction que
je t'ai fournie. (En passant, j'en profite pour te mentionner que cette
ligne de code à ma
fonction "If a1 = z Then Exit For" ne sert à rien, c'est simplement un
oubli, de même pour la
déclaration de la variable a1.)
D ) Les variables d'une fonction qui ne sont pas passées en paramètres comme
dans ton
exemple n'ont pas besoin de faire partie de l'expression à évaluer par
"Evaluate".
E ) Si tu as réussi à faire fonctionner tout cela et que tu obtiens le
résultat attendu, bravo!
'--------------------------------
Function test_evaluate1(valeur1 As Long, valeur2 As Long)
Dim R As Long
test_evaluate1 = Evaluate("Sum(" & valeur1 & "," & valeur2 & ")-" & R + R)
End Function
'--------------------------------
Dis pourquoi tu ne l'aimes pas ma fonction? Quel est son défaut? Elle marche? ;-)) Si tu le désires, tu peux utiliser comme paramètres les noms (non la référence aux noms (names)) de ta fonction.
Ce que tu cherches à faire, c'est possible comme ceci :
Quelques remarques sur la fonction "Evaluate" A ) Elle évalue une chaîne de caractères. Le symbole "+" est lu comme étant le symbole "&" qui existant, je crois, dans un langage précédent "Basic"
B ) La fonction Evaluate() évolue dans un environnement "VBA", en conséquence regarde ce que j'ai fait dans ma fonction, je remplace systématiquement la virgule pour le point si l'usager emploie la virgule comme séparateur décimal. Dans le cas où il utilise déjà le point, la ligne de code ne fait rien, mais c'est une sécurité "nécessaire". Comment faire ça quand tu utilises des "NOMS" (name) représentant la valeur d'une cellule? ou dans les paramètres que tu passes à la fonction?
C ) N'oublie pas que ce dont tu as de besoin, c'est une fonction récursive qui s'appelle elle-même jusqu'à ce que la valeur recherchée soit atteinte. Regarde ce qui se passe dans ta procédure d'origine lorsque le code exécute cette ligne de code que tu répètes à 2 endroits : Names("r_v").RefersTo = [R_V] + (1 / b) Quelle est la partie de ta fonction qui fait cela? Encore une fois, regarde la fonction que je t'ai fournie. (En passant, j'en profite pour te mentionner que cette ligne de code à ma fonction "If a1 = z Then Exit For" ne sert à rien, c'est simplement un oubli, de même pour la déclaration de la variable a1.)
D ) Les variables d'une fonction qui ne sont pas passées en paramètres comme dans ton exemple n'ont pas besoin de faire partie de l'expression à évaluer par "Evaluate".
E ) Si tu as réussi à faire fonctionner tout cela et que tu obtiens le résultat attendu, bravo!
'-------------------------------- Function test_evaluate1(valeur1 As Long, valeur2 As Long) Dim R As Long test_evaluate1 = Evaluate("Sum(" & valeur1 & "," & valeur2 & ")-" & R + R) End Function '--------------------------------
MichD
En passant cette syntaxe fonctionne si tu en as besoin
Dim Toto As Long Toto = 10 x = Evaluate(Toto & "+" & 5)
En passant cette syntaxe fonctionne si tu en as besoin
Dim Toto As Long
Toto = 10
x = Evaluate(Toto & "+" & 5)