OVH Cloud OVH Cloud

transformer une macro en une fonction perso

24 réponses
Avatar
isabelle
bonjour à tous,

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,

isabelle

4 réponses

1 2 3
Avatar
isabelle
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
Avatar
isabelle
le fichier de cette nouvelle exemple http://cjoint.com/?DCwgHwMF1vh
Avatar
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
'--------------------------------
Avatar
MichD
En passant cette syntaxe fonctionne si tu en as besoin


Dim Toto As Long
Toto = 10
x = Evaluate(Toto & "+" & 5)
1 2 3