cs_kabja
Messages postés12Date d'inscriptionmercredi 4 octobre 2006StatutMembreDernière intervention16 juin 2007
-
15 juin 2007 à 12:44
cs_MPi -
16 juin 2007 à 16:11
Bonjour,
Voila mon soucis:
J'ai mon sub evenementiel tel que:
Public x as double
Private Sub Worksheet_Change(ByVal Target As Range)
x = Sheets("Feuil1").Range("a1")
End Sub
J'ai ensuite dans un module cette fonction:
Function test(y As Double)
test = y * x
End Function
Le probleme est que, lorsque x est modifié, le résultat de la fonction test n'est pas actualisé dans les cellules . Je vois pas comment faire, ca a pourtant l'air simple.
J'aimerai bien avoir votre avis.
cs_kabja
Messages postés12Date d'inscriptionmercredi 4 octobre 2006StatutMembreDernière intervention16 juin 2007 15 juin 2007 à 12:59
Dans la fonction, ya rien d'autre que ce que j'ai cité, c'est surtout pour comprendre le fonctionnement:
Ma fonction test, c'est donc uniquement:
Function test(y As Double)
test = y * x
End Function
Cette fonction utilise la variable public x, qui est modifiée de temps en temps par:
Private Sub Worksheet_Change(ByVal Target As Range)
x = Sheets("Feuil1").Range("a1")
End Sub
Le problème, c'est que quand la valeur de cette variable est modifiée, les cellules dans laquelle la fonction test est appelée ne sont pas actualisée.
cs_kabja
Messages postés12Date d'inscriptionmercredi 4 octobre 2006StatutMembreDernière intervention16 juin 2007 15 juin 2007 à 13:54
Merci de ta réponse, mais regarde bien ce que je demande:
Je voudrais utiliser des variables publiques. Il n'est pas necessaire de les appeler dans la liste d'arguments pour la fonction puisse s'en servir. Le probleme est surtout que la fonction ne se rends compte de rien quand seul la variable publique change.
Public x as double
Private Sub Worksheet_Change(ByVal Target As Range)
x = Range("A1").value
End Sub
Function test(y As Double)
test = y * x
End Function
y est un argument que la fonction va chercher dans le tableur, mais x est une variable dont la valeur lui a déjà été affecté précedemment.
Vous n’avez pas trouvé la réponse que vous recherchez ?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 15 juin 2007 à 14:09
Oui ?
Et alors ?
Tu n'as donc à lui passer qu'un seul paramètre en entrée, s'il connait déjà l'autre ...
Et Alors ?
Celà ne change rien au mécanisme d'utilisation d'une fonction !
T'attends quoi ? Que j'écrive exactement ce dont tu as besoin en fonction de ton contexte ? pour que tu le copies sans comprendre ?
C'est loin d'être ma tasse de thé, pardonne-moi !!!
Un autre que moi, alors ...
cs_kabja
Messages postés12Date d'inscriptionmercredi 4 octobre 2006StatutMembreDernière intervention16 juin 2007 15 juin 2007 à 15:08
Tu sais lire, ou bien?
Je t'explique que lorsque l'on change la valeur de A1 (donc de x, si tu suis), le résultat dans la cellule où j'appelle la fonction n'est pas actualisé. C'est le problème, tu comprends.
Mais, laisse tomber, c'est pas grave si tu sais pas. Je ne m'adresse pas à toi en particulier.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 15 juin 2007 à 15:21
Ah cà, pour comprendre, oui, je comprends, pardi ...
Je comprends entre autres qu'à moins de faire une fonction Excele personnalisée ( ce qui n'a rien à voir avec une fonction VBA telle que tu l'as écrite... donc dans ta macro...) :
Ta fonction VBA ne s'exécutera que si appelée, avec ses paramètres d'entrée...
Il te faudra donc la lier à un événement de ta feuille.
Reste, sans doute, à rechercher, si tu veux éviter ce mécanisme, comment créer une fonction personnalisée et l'enregistrer dans Excel.
Tu vois ? Je comprends, moi (bien que n'ayant ni VBA ni Excel)...
En d'autre termes : ne pas confondre une fonction Excel avec une fonction VBA.
Vu ?
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 15 juin 2007 à 15:47
jmfmarques à 100% raison, même si t'as valeur est public, la moindre des choses c'est de passer cette valeur en paramètre, c'est plus conventionnel..
Public x as double
Private Sub Worksheet_Change(ByVal Target As Range)
x = Range("A1").value
End Sub
Function test(y As Double, x2 As Double) As Double
test = y * x2
End Function
Si tu fais MsgBox Test(2.5, x)
Le résultat sera bien calculé, quelque soit la valeur de x (bref, cette valeur à beau changer, elle sera prise en compte)
cs_kabja
Messages postés12Date d'inscriptionmercredi 4 octobre 2006StatutMembreDernière intervention16 juin 2007 15 juin 2007 à 15:54
C'est sur, mais dans ce cas, il n'y a plus d'interet à mettre cette variable en public, s'il faut tout de même aller la chercher dans le tableur. Je voulais faire ca parce que j'ai 10 arguments a mettre dans une fonction, mais avec seulement 2 qui changent souvent. Du coup, je voulais leur attribuer une valeur dans une variable publique (qui ne changerait que de temps en temps) pour ne pas avoir à aller les chercher dans le tableur.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 15 juin 2007 à 16:13
Kabja (et s'il te plait ne viens pas nous expliquer que l'on ne sait pas lire) :
Pouyr résumer : ou tu fais une fonction Excel personnalisée (et c'est une autre paire de manche)
ou tu te sert d'une fonction dans un module et alors (quel que soit le cas de figure) : il ne se passera rien si tu n'appelles pas cette fonction à l'occasion d'un événement. C'est là le point essentiel et Mortalino t'a suggéré un événement.
Pour le reste (les paramètres d'entrées) rien ne t'oblige à passer à cette fonction les paramètres dpnt la valeur existerait déjà en public ! Il te suffit de ne passer que les paramètres manquants, si celà t'arrange.
Une chose reste certaine : il te faudra lier la fonction de ton module à un événement (à moins, une fois de plus, que tu ne crées une fonction Excel personnalisée et tout se passera alors automatiquement... mais, dans ce derniers cas, ta fonction personnalisée Excel ignorera totalement les variables VBA et ne s'exécutera qu'en lui indiquant les cellules absolues ou relatives concernées, d'une part.. et, d'auttre part, sera insérée dans Excel et donc dans tous tes classeurs créés ou à venir...)
La chose est simple, donc :
- soit une fonction VBA à laquelle tu passes les paramètres qu'elle ignore encore, que tu lances à l'occasion d'un événement et qui te retourne une valeur
- soit le fardeau d'une fonction personnalisée Excel à créer et que tu trimbaleras partout.
Choix à faire (je choisirais personnellement le 1er)
cs_kabja
Messages postés12Date d'inscriptionmercredi 4 octobre 2006StatutMembreDernière intervention16 juin 2007 15 juin 2007 à 16:15
Merci de ta patience,
La solution que tu proposes fonctionne tres bien, mais ca ne regle pas mon probleme:
Function test(y As Double)
test = y * Range("A1").Value End Function
Dans cette fonction, il faut toujours aller chercher la valeur de A1 dans le tableur. Or, je me sers de cette fonction plus de 30000 fois à chaque recalcul, c'est pour ca que mon idée était justement d'alléger le calcul en mettant à disposition les valeurs qui changent rarement en variable public (pour éviter d'avoir a aller les chercher).
cs_kabja
Messages postés12Date d'inscriptionmercredi 4 octobre 2006StatutMembreDernière intervention16 juin 2007 15 juin 2007 à 16:22
"Pour le reste (les paramètres d'entrées) rien ne t'oblige à passer à
cette fonction les paramètres dpnt la valeur existerait déjà en public
! Il te suffit de ne passer que les paramètres manquants, si celà
t'arrange."
C'est justement là qu'est tout le problème, la fonction ne "voit pas" que les paramètres en public changent. Pour ceux que j'appelle en argument, pas de pb, le resultat s'actualise. Mais si les variables public changent, il ne se passe rien, même en recalculant (F9).
Il doit y avoir quelque chose qui m'échappe.. Tant pis, merci de votre aide.
cs_kabja
Messages postés12Date d'inscriptionmercredi 4 octobre 2006StatutMembreDernière intervention16 juin 2007 15 juin 2007 à 16:35
Function test(y As Double) as double
test = y * x
End Function
C'est celle-ci qui me plait. Qd tu parles d'evenement, le fait que la valeur de x change (dans ma cellule A1, et donc aussitot dans ma variable publique x) constitue t'il un evenement? Parce que justement je ne vois pas comment. C'est le coeur de mon probleme. Même un recalcul ne fait rien. Quel type d'evenement puis-je utilisé pour que ma fonction soit recalculer si x change.