Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème avec Application.volatile

7 réponses
Avatar
BeN
Bonjour à tous.
Voilà j'ai un problème avec une fonction en vba, que j'utilise à partir
d'un cellule excel (en mettant dans la cellule =ma_fction(param1,...) ).
Bon la fonction marche, mais j'ai voulu la rendre "autorecalculante" :)
, donc j'ai vu que Application.Volatile faisait ça.

Donc maintenant si je modifie une cellule, la fonction est bien
réexécuter. C'est ce que je voulais, par contre le problème, c'est que
j'avais un morceau de code qui s'executer sur l'evenement "Change" de ma
Feuil1. Le code sert à faire une coloration du fond d'une cellule, en
fonction de son contenu.

J'ai mis un point d'arret, et la procedure est bien executer, mais les
modification que je fais sur les cellules ne sont pas pris en compte.
Comme si les cellules se verouller, quand je met ce
"Application.volatile", si je l'enléve, ma coloration remarche, mais je
dois valider la cellule qui contient ma fonction, pour qu'elle se mette
à jour.

Voici le code de ma procedure sur l'evenement "Change"

Private Sub Worksheet_Change(ByVal Target As Range)
If ((Target.Row >= 5 And Target.Row <= 24) Or (Target.Row >= 26 And
Target.Row <= 48)) And (Target.Column >= 5 And Target.Column <= 10) Then
Select Case Target
Case "Blé dur"
With Target.Interior
.ColorIndex = 10
.Pattern = xlSolid
End With
Case "Prairie"
With Target.Interior
.ColorIndex = 43
.Pattern = xlSolid
End With
Case "Courges"
With Target.Interior
.ColorIndex = 46
.Pattern = xlSolid
End With
Case "Gel"
With Target.Interior
.ColorIndex = 40
.Pattern = xlSolid
End With
Case "Melons"
With Target.Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
Case "Luzerne"
With Target.Interior
.ColorIndex = 50
.Pattern = xlSolid
End With
Case "P de terre"
With Target.Interior
.ColorIndex = 53
.Pattern = xlSolid
End With
Case "Oliviers"
With Target.Interior
.ColorIndex = 12
.Pattern = xlSolid
End With
Case Else
With Target.Interior
.ColorIndex = 0
.Pattern = xlSolid
End With
End Select
End If
End Sub


Et le code de ma fonction
Public Function ble_dur(intervale As Range, champs As String) As Single
Application.Volatile
Dim total As Single
total = 0
For i = 1 To intervale.Rows.Count
If intervale.Cells(i, 1) = "Blé dur" Then
If ActiveSheet.Cells(intervale.Cells(i, 1).Row,
intervale.Cells(i, 1).Column - 1) = champs Then
total = total +
ActiveSheet.Cells(intervale.Cells(i, 1).Row, 3)
End If
End If
Next i
ble_dur = total
End Function

Sachant que la procedure se trouve sur Feuil1 et que la fonction est
dans un module (Module1), je ne sais pas si c'est comme ça qu'on fait :)
En traçant le code pas à pas, le ".ColorIndex" contient la valeur
"-4142", je crois que c'est comme si je n'avais pas de selection.

J'ai aussi essayer un truc du genre "Feuil1.Cells(Target.Row,
Target.Column).Interior" à la place de "Target.Interior" dans mes With.
Mais c'est pareil.


J'espère que vous m'avez compris :) Et merci d'avance pour la solution.
Je suis sur que ça doit être un truc tout bête, mais vu que je debute en
VBA, je n'ai pas trouvé.

7 réponses

Avatar
Modeste
Bonsour® BeN avec ferveur ;o))) vous nous disiez :


Bon la fonction marche, mais j'ai voulu la rendre "autorecalculante" :)
, donc j'ai vu que Application.Volatile faisait ça.


Application.volatile n'intervient que sur un changement de valeur !!!!
un changement de format, couleur, texte, bordures ne change pas la valeur...

dans ta procédure de recoloration
il faut terminer par : Application.calculate


--
;o)))
@+

Les news à la source !!!
news://news.microsoft.com/microsoft.public.fr.excel
et répondez OUI

n'oubliez pas les FAQ :http://www.excelabo.net
http://dj.joss.free.fr/faq.htm
http://www.faqoe.com http://faqword.free.fr

Avatar
Michel Gaboly
Bonjour,

Application.Calculate peut être lent si tu as des documents lourds ouve rts.

Recalcule simplement la feuille avec Me.Calculate.


Bonsour® BeN avec ferveur ;o))) vous nous disiez :



Bon la fonction marche, mais j'ai voulu la rendre "autorecalculante" :)
, donc j'ai vu que Application.Volatile faisait ça.



Application.volatile n'intervient que sur un changement de valeur !!!!
un changement de format, couleur, texte, bordures ne change pas la vale ur...

dans ta procédure de recoloration
il faut terminer par : Application.calculate





--
Cordialement,

Michel Gaboly
www.gaboly.com


Avatar
Modeste
Bonsour® Michel Gaboly avec ferveur ;o))) vous nous disiez :

Application.Calculate peut être lent si tu as des documents lourds
ouverts.


Tout à fait Michel !!!
;o)))
c'était surtout pour appuyer sur les lacunes du dénombrement par les formats
et l'impuissance de application.volatile dans ces contextes.

;-)
pffft... on ne va pas relancer le débat !!!


--
;o)))
@+

Les news à la source !!!
news://news.microsoft.com/microsoft.public.fr.excel
et répondez OUI

n'oubliez pas les FAQ :http://www.excelabo.net
http://dj.joss.free.fr/faq.htm
http://www.faqoe.com http://faqword.free.fr

Avatar
Michel Gaboly
J'ai rien dit, moi, ;-)))

Enfin, presque.


Bonsour® Michel Gaboly avec ferveur ;o))) vous nous disiez :


Application.Calculate peut être lent si tu as des documents lourds
ouverts.



Tout à fait Michel !!!
;o)))
c'était surtout pour appuyer sur les lacunes du dénombrement par le s formats
et l'impuissance de application.volatile dans ces contextes.

;-)
pffft... on ne va pas relancer le débat !!!





--
Cordialement,

Michel Gaboly
www.gaboly.com


Avatar
BeN
Merci pour les réponses :)
Donc si j'ai bien compris, j'enleve mon Application.Volatile dans ma
fonction ble_dur, qui se trouve dans un module, et je rajoute un
me.Calculate à la fin de ma procedure de coloration.

J'ai fait ça, mais ça ne marche pas. La procédure de coloration
remarche, mais si je change une valeur dans la zone, où la procédure
s'execute, la cellule qui contient ma fonction ne se met pas à jour.

J'ai dû mal comprendre un truc.

J'ai rien dit, moi, ;-)))

Enfin, presque.



Bonsour® Michel Gaboly avec ferveur ;o))) vous nous disiez :


Application.Calculate peut être lent si tu as des documents lourds
ouverts.




Tout à fait Michel !!!
;o)))
c'était surtout pour appuyer sur les lacunes du dénombrement par les
formats
et l'impuissance de application.volatile dans ces contextes.

;-)
pffft... on ne va pas relancer le débat !!!









Avatar
BeN
J'ai un peu chercher, et en fait, avec un Application.CalculateFull ça
marche. Un me.Calculate ou un Application.calculate n'a pas l'air de suffir.
Mais sinon, il n'y pas moyen de rendre cette fonction automatique, comme
le sont les fonctions Excel.
Par exemple si dans A1 à A10 j'ai des nombres, et que dans A11, je met
=SOMME(A1:A10). Si je modifie les nombres dans A1 à A10, la somme va se
recalculer. Je voudrais que cela soit pareil, mais sans dépendre de la
procédure de coloration. C'est possible ??

Merci pour les réponses :)
Donc si j'ai bien compris, j'enleve mon Application.Volatile dans ma
fonction ble_dur, qui se trouve dans un module, et je rajoute un
me.Calculate à la fin de ma procedure de coloration.

J'ai fait ça, mais ça ne marche pas. La procédure de coloration
remarche, mais si je change une valeur dans la zone, où la procédure
s'execute, la cellule qui contient ma fonction ne se met pas à jour.

J'ai dû mal comprendre un truc.


J'ai rien dit, moi, ;-)))

Enfin, presque.






Avatar
BeN
Tiens c'est magique, je sais pas ce que j'ai fais, mais maintenant ça me
fait comme si j'avais le application.volatile, sauf qu'il n'y est pas.
Le seul moyen de refaire marcher la coloration, c'est de commenter la
fonction. Ben biensur apres elle ne marche plus.


Bonsour® BeN avec ferveur ;o))) vous nous disiez :



Bon la fonction marche, mais j'ai voulu la rendre "autorecalculante" :)
, donc j'ai vu que Application.Volatile faisait ça.



Application.volatile n'intervient que sur un changement de valeur !!!!
un changement de format, couleur, texte, bordures ne change pas la valeur...

dans ta procédure de recoloration
il faut terminer par : Application.calculate