J'aimerai maintenant utiliser cette fonction à partir d'Excel. J'ai donc tapé dans une page Interpoline(Dates, Taux, C8) où Dates est une plage de dates triées par ordre croissant, Taux est une plage de chiffres et C8 est une date.
Dans ma cellule Excel où j'ai tapée cette fonction je vois #VALEUR.
Pensant que j'avais mal écrit la fonction j'ai tapé ensuite au début de la fonction Interpoline=1 pour voir si elle était activée correctement (et j'ai mis le reste du code en commentaire) mais je vois toujours #VALEUR.
Pouvez-vous me dire comment utiliser ma fonction Interpoline directement dans Excel ?
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 6 oct. 2007 à 00:32
Premièrement, une Function devrait retourner quelque chose.
Ta formule est peut-être simple pour toi, mais je n'ai aucune idée de ce qu'elle devrait retourner
Alors tu devrais l'écrire comme ceci
Public Function Interpoline(X() as variant, Y() as variant, Z as variant) As TypeRetour en changeant TypeRetour par ce qui devrait être retourné. Par défaut le retour est Variant, donc ça ne devrait pas causer de problème ici ...
Deuxièmement, cette formule doit être déclarée dans un module standard (.bas) et non pas dans le code d'une feuille ou d'un UserForm. C'est probablement ici qu'il y a problème... (?)
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 6 oct. 2007 à 12:21
Bonjour,
Non une fonction n'a pas obligatoirement bessoin de déclarer le type de donnée en retour. Car sans précision le type sera en Variant par défaut. Mais il reste vrai, qu'il est préférable de déclarer son type... C'est une nuance.
Pour illustrer, voici un exemple plus que basique :
Function essai()
essai = 5
End Function
Sub test()
Debug.Print essai
End Sub
qui fonctionne parfaitement...
Ensuite, encore un précision sur l'emplacement. La fonction si elle est déclarée dans "feuil1", sera correctement utilisable qu'à partir d'un appel effectuée à partir de ce même emplacement (donc en interne avec une sub en VBA). Malgré, les apparences les appels d'une fonction à partir d'une cellule EXCEL, ne fait pas directement référence à "feuil1" du VBA. Seul les événements passent directement. (Je ne sais pas si je suis bien clair... c'est pourtant juste).
En définitive, pour appeler une fonction reconnue à partir des cellules, il faut qu'elle soit dans un module (donc accessible à tous et en Public (par défaut)), comme l'indique MPi².
=
Le code d'erreur #VALEUR, ne signifie pas que la fonction n'est pas reconnue ! mais justement l'inverse. LA fonction est bien reconnue, mais ces paramètres où son calcul (plus généralement) pose problème.
Si la fonction n'était pas reconnue, le code d'erreur serait #NOM.
=
LE problème ici, semble être le passage des paramètres à la fonction. Pour passer une plage de cellule, on utilise la type RANGE. VARIANT fonctionnera mais peut poser problème si on traite n'importe comment les données par la suite.
PAR contre, les parenthèse ne seront pas valide pour passer une plage. C'est ICI l'erreur !
Donc utiliser :
Public Function Interpoline(X as variant, Y as variant, Z as variant)
et plus précisément :
Function Interpoline(X as range, Y as range, Z as range)
(Public est par défaut, donc on peut aussi le retirer)
On peut vérifier que cela fonctionne avec cet exemple basique :
Function essai(X As Range)
essai = X(2)
End Function
et en prenant une plage d'au moins 2 valeurs... et renvoi toujours la valeur de la 2ième selection X(2) (y'a pas de test de validité !)
=
Ensuite, le code proposée est obscure et ne fonctionne donc pas... mais les problèmes de syntaxe sont déjà résolus...
Estelle_BNP
Messages postés25Date d'inscriptionjeudi 14 décembre 2006StatutMembreDernière intervention10 mai 2008 8 oct. 2007 à 16:33
Merci pour votre aide. Grâce à vos remarques et en tatonnant un peu, j'ai réussi à faire marcher cette fonction. Voici le code final :
Public Function InterpoLine(x As Range, Y As Range, Z As Date) As Double
Dim i As Integer
Dim TabDate() As Variant
Dim TabTx() As Variant
Dim xk As Variant
TabDate() = x
TabTx() = Y
i = 1
While TabDate(i, 1) < Z And i < UBound(TabDate, 1)
i = i + 1
Wend
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 8 oct. 2007 à 22:51
Bonsoir,
Encore une précision. Tu utilises les plages en les tranférant dans un tableau déclaré par DIM. Ok, cela marche, mais comme tu ne modifie pas ces données, tu peux plus simplement garder les données RANGE.
En clair, ton code pourrait se simplifier avec :
=
Function InterpoLine(X As Range, Y As Range, Z As Date) As Double
Dim i As Integer
i = 1
While X(i, 1) < Z And i < UBound(X, 1)
i = i + 1
Wend
InterpoLine = Y(i - 1, 1) + (Z - X(i - 1, 1)) / (X(i, 1) - X(i - 1, 1)) * (Y(i, 1) - Y(i - 1, 1))
End Function
=
Rq : la variable "Dim xk As Variant" n'est jamais utilisée...