Pb de recalcul des fonctions

cs_kabja Messages postés 12 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 16 juin 2007 - 15 juin 2007 à 12:44
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 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.

32 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
15 juin 2007 à 16:38
Même un recalcul ne fait rien





Mais t'as essayer ce que je t'ai mis!!!!
Avec le param MyCell As Range.. C'est ça qu'il te faut !





@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
0
cs_kabja Messages postés 12 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 16 juin 2007
15 juin 2007 à 16:45
Et moi, je te dis depuis le début que je ne veux pas d'autres arguments à entrer que y. C'est pourtant clair.



Function test(y As Double) as double
    test = y * x
End Function

c'est juste ca que je veux.
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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.

Bonne journée

@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
0
cs_IAORANA Messages postés 9 Date d'inscription vendredi 9 décembre 2005 Statut Membre Dernière intervention 15 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 ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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...

@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
0
cs_kabja Messages postés 12 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 16 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.

Merci pour tout, en tout cas.
0
cs_IAORANA Messages postés 9 Date d'inscription vendredi 9 décembre 2005 Statut Membre Dernière intervention 15 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.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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

les 3 seront comprises puisque x est public.
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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.

@++

<hr size ="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
15 juin 2007 à 23:42
Juste au cas où...
Où est déclarée ta variable x (Public) ?
Dans une feuille ou dans un module ?

MPi
0
cs_kabja Messages postés 12 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 16 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.
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
16 juin 2007 à 16:11
Essaie en la déclarant au niveau d'un module
Et n'oublie pas d'enlever la déclaration au niveau de la feuille.

MPi
0
Rejoignez-nous