cs_kabja
Messages postés12Date d'inscriptionmercredi 4 octobre 2006StatutMembreDernière intervention16 juin 2007
-
15 juin 2007 à 12:44
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 2018
-
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.
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 15 juin 2007 à 16:50
Bah je modifie ma réponse (excuse moi c'est ma faute)
Mais t'as essayer ce que je t'ai mis!!!! (ce qu'il manquait --> ) Car c'est la seule possibilité pour que cela rafraichisse tes données avec la fonction dans tes autres cellules. (du moins le plus simplement du monde).
Pas de Param, bah débrouille toi sans.. Mais si tu as comme tu dis 3000 cellules contenant cette fonction, ça implique un minimum de 3000 lignes dans l'évènement WorkSheet_Change
A toi de voir, si tu veux faire très chiant et compliqué, ou d'une façon très simple.
cs_IAORANA
Messages postés9Date d'inscriptionvendredi 9 décembre 2005StatutMembreDernière intervention15 juin 2007 15 juin 2007 à 18:43
Salut,
Alors soit je suis dans le cas de jmfmarques, soit je ne comprend vraiment rien. Mais comme j'ai Excel et VBA, j'ai pu au moins tester le problème.
J'ai mis dans la cellule A1 une valeur. Dans les cellules B1 à B9, j'ai mis les valeurs 1 à 9. Dans les cellules C1 à C9 la formules en question : =test($A$1; B1) dans la première et copié dans les autres. La formule doit bien avoir deux variables pour fonctionner. Et voici le module à créer :
Option Explicit
Dim x As Double
Function test(x As Double, y As Double)
test = y * x
End Function
Et c'est tout ! Pas "Worksheeet_Change" et autres superflu. La formule marche et est modifiée si une modification intervient soit en A1, soit en B1 à B9. Mais ton Worksheet, il est en calcul automatique ??
Vous n’avez pas trouvé la réponse que vous recherchez ?
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 15 juin 2007 à 18:57
Ca revient à faire ce que je dis depuis 2 heures, à part que tu emploies
...y As Double) alors que moi je le qualifie en type Range et me sert de sa propriété Value.
Mais c'est effectivement la même chose, et comme je le disais tout à l'heure, c'est pas grand chose à faire en terme de modifications.
Mais vu qu'il ne "veut pas" de param supplémentaire, faudra attendre Windows 2075 pour qu'il puisse lire dans les pensées...
cs_kabja
Messages postés12Date d'inscriptionmercredi 4 octobre 2006StatutMembreDernière intervention16 juin 2007 15 juin 2007 à 19:39
Bon..
j'ai a peu pres trouver comment faire, avec en gros tout ca:
Worksheet.change()
x=range("A1")
...
Worksheet.selectionchange()
calculate
...
et dans un module, le fonction tel que:
function test(y as double)
Application.volatile
test=x*y
End sub
Avec ca, j'ai ma fonction qui marche dans n'importe quelle cellule, et avec un SEUL argument (y en l'occurence). x est lui attribué à une variable publique dès qu'il change. Je suis surpris qd même que personne n'ait compris de quoi je parlais. C'est trivial d'avancer que function(x as double, y as double) fonctionne.. Je voulais autre chose, c'est tout.
cs_IAORANA
Messages postés9Date d'inscriptionvendredi 9 décembre 2005StatutMembreDernière intervention15 juin 2007 15 juin 2007 à 19:50
Pourquoi faire simple quand on peut se compliquer la vie. Tu as une déclaration public, une sub et une fonction avec une variable, et tout ça pour le prix de deux variables dans une seule fonction. Si ce n'est pas bien négocié, ça. Mais tu voulais autre chose, je comprend.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 15 juin 2007 à 19:52
Euh...
Tu es bien certain de lire les réponses ?
Tant Mortalino que moi-même t'avons indiqué que si x était public, il t'était possible de ne pas le passer en paramètre !!!
Pour te rafraichir la mémoire, donc :
Citation :
C'est bien évidemment possible !
Rien ne te l'interdit, puisque x est public !
Tu pourrais donc, si x est punlic, écrire à ton choix :
Function test(y As Double) as double
test = y * Range("A1").Value
End Function
ou
Function test(y As Double, x as double) as double
test = y * x
End Function
ou encore
Function test(y As Double) as double
test = y * x
End Function
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 15 juin 2007 à 20:31
je réagis juste à Je suis surpris qd même que personne n'ait compris de quoi je parlais.
Nous avons très bien compris puisque le résultat final (ta proposition et les nôtres) obtient le même résultat. La seule différence est que nous voulions juste t'aiguiller vers une solution plus simple, moins coûteuse au processeur et en mémoire.
Pour infos, ton x = Range("A1") dans l'évènement Change induit une affectation de valeur à la variable X, à chaque changement de valeur dans ta feuille.
Application.volatile te fait réactualiser une macro, chose encore coûteuse.
Là tu ne t'en rends pas compte car c'est une petite fonction. Mais imagine une fonction beaucoup plus complexe, qui travaille sur des objets (style Graphique) pourrait posséder une centaine de ligne de code pour accomplir le travail. Avec ce superflu, ton temps d'exécution serait 2 à 3 fois plus long ! (et des traitements de 10 minutes, j'en ai vu, donc imagine 10min x 2 ou 3... c'est énorme).
Voilà, c'était pas pour t'embêter, mais essayer de t'aider et faire progresser ton code àdes fins d'optimisation.
cs_kabja
Messages postés12Date d'inscriptionmercredi 4 octobre 2006StatutMembreDernière intervention16 juin 2007 16 juin 2007 à 15:05
C'est vrai, Mortalino en avait parlé dans les 3 solutions qu'il proposait, mais ca ne fonctionnait pas en l'état. Il manquait quelque chose comme application.volatile pour que ca fonctionne. Apres, c'etait surtout pour trouver autre chose, mais il semble en effet que cela complique les choses pour aucun gain de temps dans mes calculs. Cette solution n'est pas satisfaisante, c'est toujours bon savoir.
Voila, voila.
Ps: Ma variable publique x est déclarée dans une feuille.