XL 2010 Application.Volatile pose problème

fablog

XLDnaute Occasionnel
Bonjour tout le monde,

J'ai un soucis avec une fonction (qui n'est pas de moi). Si je modifie une cellule ne contenant pas cette fonction, il fait quand même un recalcul. Il semble que cela soit du à ligne "Application.Volatile" qui m'est nécessaire pour que le recalcul se fasse automatiquement dans les cellules contenant cette fonction. Avez-vous une solution svp pour que seule les cellules contenant cette fonction soit actualisée quand ce sont elles que je modifie?

VB:
Function pond(r As Range)
Application.Volatile
For Each c In r
'Stop
rang = c.Row
col = c.Column: b = Cells(1, col)
pond = pond + (coef(c) * c * b)
Next c
Calculate
End Function
 
Dernière édition:

vgendron

XLDnaute Barbatruc
Hello
je pense qu'il va falloir jouer avec l' evènement change de ta feuille
et application.enableevents
le mettre à false par défaut lorsqu'il y a un changement dans ta feuille
et le mettre à true uniquement si tu viens de modifier une cellule contenant ta fonction

mais j'imagine déjà qu'il va y avoir de pbs pour les autres cellules...
et pourquoi ne pas supprimer directement le Application.volatile --> comme ca. pas de calcul
et la. tu le lances uniquement au changmenet de cellule qui va bien.. (toujours avec l'évenement change)

en passant: à quoi sert le calculate dans ta fonction? cela ne fait il pas double emploi..
et j'imagine que ton problème sous entendu, est que le calcul est très long....

bref. beaucoup d'incertitudes vu qu'on a pas le fichier...
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Si les calculs sont en automatique, une fonction personnalisée utilisée dans une formule est toujours évaluée quand une cellule faisant partie d'une plage passée en paramètres est modifiée.
C'est une faute de lui faire prendre aussi en compte pour son calcul des cellules non spécifiées en paramètres.
C'est une faute aussi de ne pas les déclarer dans la liste avec l'attribut ByVal.
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Bonjour,

tout à fait d'accord avec Dranreb.
Dit autrement :
- tu enlèves le .volatile et le calculate inutiles.
- ta fonction doit recevoir en paramètre toutes les valeurs ou plages susceptibles de la faire évoluer.

On ne met volatile que les fonctions n'étant pas incluses dans un calculate, c'est à dire celles non ré-évaluées sur un événement Change (comme un changement de couleur).
eric
 

fablog

XLDnaute Occasionnel
Bonjour et merci pour tout vos commentaires constructifs.
Mes connaissances en VBA étant limitées, pouvez-vous m'indiquer le code qui devrait remplacer mes macros actuelles?
En faisant des test ce matin, tout ce que j'ai besoin c'est de l'équivalent d'un Contrl+Alt+F9 à chaque saisi dans les cellules contenant la dite fonction. J'ai désactivé le Application.Volatile et le Calculate que j'ai remplacé par Application.CalculateFull. Cela ne fonctionne pas car j'obtiens des #Valeurs! sur toutes mes cellules de résultat (qui sont les cellules Y6 à Y107). Si je fais Contrl+Alt+F9 manuellement il n'y a pas de problème.

Merci par avance!
 

Dranreb

XLDnaute Barbatruc
Joignez votre classeur. Là on ne sait pas ce que c'est, coef(c). Mais c'est probablement quelque chose qu'il faudrait transmettre en paramètre à la fonction.
Edit: Si c'est une fonction utilisée dans une formule matricielle sur plusieurs cellules, il faudrait lui faire retourner un tableau.
Contrl+Alt+F9 à chaque saisi dans les cellules contenant la dite fonction.
Qu'est-ce que sa signifie ? Vous voulez écraser la formule par des constantes saisies manuellement ?
Sans classeur joint, on n'y comprend rien, comme d'hab…
 
Dernière édition:

fablog

XLDnaute Occasionnel
Ci-joint mon fichier que j'ai épuré au maximum. Actuellement, quand je choisi une date différente en cliquant sur la cellule C2 de la feuille 2. Actions, le recalcul ne se refait pas. J'aimerai au contraire que ce recalcule se fasse automatiquement sans avoir besoin de faire Ctl+Alt+F9.

Merci par avance
 

Pièces jointes

  • Test.xlsm
    47.7 KB · Affichages: 36

Dranreb

XLDnaute Barbatruc
Essayez comme ça :
VB:
Option Explicit
Function Pond(ByVal R1 As Range, ByVal RL As Range) As Double
Dim T1(), TL(), C As Long
T1 = R1.Value: TL = RL.Value
For C = 1 To UBound(TL, 2)
   Pond = Pond + Coef(RL(1, C)) * TL(1, C) * T1(1, C)
   Next C
End Function
Function Coef(ByVal C As Range) As Double
Const Blanc = -4142, Orange = 44, Gris = 15, Mauve = 39
Select Case C.Interior.ColorIndex
    Case Orange: Coef = 1.5
    Case Gris: Coef = 1.75
    Case Mauve: Coef = 2
    Case Else: Coef = 1: End Select
End Function
Avec en C6, à propager sur 3 lignes :
Code:
=Pond($A$1:$B$1;$A6:$B6)
Ce qui illustre ce que je disais: si vous voulez que la fonction soit réévaluée quand les cellules A1:B1 changent de valeurs, parce que la fonction les utilise, il faut qu'elles lui soient transmises. Sinon comment voulez vous qu'Excel les voit comme antécédents de
celle ci ?
 
Dernière édition:

fablog

XLDnaute Occasionnel
Dranreb, cela fonctionne dans mon fichier original sauf pour le changement de classification de poste qui se fait à la ligne 5. Dans mon fichier Test, je n'ai laissé qu'une classification qui est AP-01-1 mais j'en ai des dizaines d'autres. La ligne 1 de mon fichier de test fait justement référence à cela. Que faudrait-il modifier svp?
 

fablog

XLDnaute Occasionnel
Si vous effacez la ligne 5 et que vous faites ctrl+Alt+F9 cela donnera 0. Je ne sais pas exactement comment est utilisée cette ligne puisque ces macros ne sont pas de moi, mais je confirme que c'est utilisé dans le calcul de la colonne C.
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Peut être bien, sauf si vous vouliez qu'au lieu des formules ce soit la fonction Pond qui aille directement chercher par elle même certaines choses dans une plage de l'autre feuille qui lui serait spécifiée. Mais il faudrait expliquer très précisément, bien en détail, ce que vous vous voudriez très très exactement. Peut être que ce serait quand même plus simple de corriger vous même les formules ?
 

Discussions similaires

Réponses
7
Affichages
485

Statistiques des forums

Discussions
311 720
Messages
2 081 907
Membres
101 836
dernier inscrit
karmon