Fonction non automatique ???

D

Droopy

Guest
Hello,

J'ai écris cette fonction est elle fonctionne bien mais pas de façon automatique. Si je change des données sur la feuille excel que j'explore avec ma fonction cela ne change pas les totaux dans la cellule où est placé ma fonction ... avez-vous une idée pourquoi ?

***** La fonction en question *****


Function SommeCharge(SCompare As String, DDateDeb As Date, DDateFin As Date) As Long

Dim ICount As Integer

SommeCharge = 0
ICount = 15

While Worksheets("CCP Commun").Range("C" & ICount).Value <> ""

If Worksheets("CCP Commun").Range("G" & ICount).Value = SCompare Then
If Worksheets("CCP Commun").Range("A" & ICount).Value >= DDateDeb Then
If Worksheets("CCP Commun").Range("A" & ICount).Value <= DDateFin Then

SommeCharge = SommeCharge + Worksheets("CCP Commun").Range("F" & ICount).Value

End If
End If
End If

ICount = ICount + 1

Wend

End Function
 
C

coyote

Guest
Effectivement pas d'automatisme dans les macros si pas demandé

Attention de ne pas trop abuser de cette fonction car elle augmente les délais d'execution (Normal macro lancer à chanque changement)

Macro à mettre dans Visual Basic sur la Feuil à actualiser automatiquement

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

***(Appeller la fonction ou la macro)***

End Sub
 
T

Ti

Guest
pas besoin de macro événementielle pour ça : pour qu'une fonction destinée à être utilisée dans une cellule Excel s'exécute automatiquement, il faut ajouter au début de celle-ci la ligne suivante :

Application.Volatile

voilà, c'est tout.
 
R

Roland

Guest
Bonjour à tous
pour coyote

Je ne suis pas tout à fait d'accord avec toi sur les fonctions
Si tu crée une fonction (Function - End Function) dans un module,je ne parle pas de macro, elle est scrutée dès lors qu'un de ces arguments (une cellule ou un nom de cellule ou de plage) change de valeur.

Ces fonctions sont personnelles sont accessibles dans Insertion - Fonctions - personnalisées ......

Mais peut-être savait-tu tout celà

pour Droopy je regarde to Pb

Amicalement Roland
 
R

Roland

Guest
Re à tous

J'adore ce Forum on découvre quelque chose tout les quart d'heure ...Merci à Ti pour Application.Volatile je ne connaissais pas.
Mais à en lire la doc je ne suis pas sûr que cette instruction soit nécessaire dans le cas de droopy (à vérifier quand j'aurai son code).

extrait doc VBA "Marque comme volatile une fonction personnalisée. Une fonction volatile doit être recalculée chaque fois qu'un calcul est effectué dans une cellule quelconque de la feuille de calcul. Une fonction non volatile n'est recalculée qu'en cas de changement des variables d'entrée. Cette méthode est sans effet si elle ne se trouve pas à l'intérieur d'une fonction définie par l'utilisateur utilisée pour calculer une cellule de feuille de calcul."

Je pense que l'usage de Application.Volatile doit sensiblement ralentir l'exécution car le code est systèmatiquement scruté à chaque changement Quand penses-tu Ti ?

Amicalement Roland
 
T

Ti

Guest
Effectivement Roland, tu as raison dans ce cas (à vrai dire je n'avais même pas regardé ce que faisait la fonction de Droopy), cette fonction doit se calculer à chaque changement d'un de ses paramètres.

Typiquement on ajoute Application.Volatile lorsqu'une fonction renvoie une valeur qui doit s'actualiser sans que ses paramètres changent, comme celle-ci par exemple (évidemment ici j'aurais pu prendre Alea() mais c'est pour l'exemple) :

Function Allea(Limite As Long) As Long
Application.Volatile
Randomize
Allea = Int(Rnd * Limite)
End Function

Volatile ou non ? Ca dépend : si je suis en train de faire des tests sur un tableau et que je veux me constituer un jeu de valeurs d'essai, je m'arrangerai pour que ces valeurs changent toutes seules, dès que j'appuie sur F9 par exemple, donc j'ajouterai Volatile.
Si je veux "figer" cette valeur aléatoire, je ne mettrai pas Volatile.

Pour Droopy, voici une façon d'améliorer un peu sa fonction

Function SommeCharge(SCompare As String, DDateDeb As Date, DDateFin As Date) As Long
Dim Cel As Range
Set Cel = Worksheets("CCP Commun").[C15]
Do While Cel <> ""
With Cel
If .Offset(0, 4) = SCompare Then
If .Offset(0, -2) >= DDateDeb And .Offset(0, -2) <= DDateFin Then
SommeCharge = SommeCharge + .Offset(0, 3)
End If
End If
End With
Set Cel = Cel.Offset(1, 0)
Loop
End Function
 
C

coyote

Guest
Por Roland et Ti et pis les autres

Je dois reconnaitre que je ne connaissais pas les subtilités que vous proposiez....

Je dois également admettre qu'avant de connaitre ce forum, je développais au filling sans toujours exploiter la meilleure méthode....en commençant par l'enregistrement qui répond malheureusement que rarement à nos exigences.

Enfin je constate que grâce à vous et au WalkenbachBook (non ce n'est pas une commande VBA
Sad20rigole_gif.gif
) que je viens d'acquérir, je l'a joue moins Mac Gyver.
 
D

Droopy

Guest
Merci Ti pour ce code amélioré ... je dois dire que je suis un vrai nain de jardin en matière de programmation Excel .... enfin en Excel tout court.

Mais malheureusement chez moi la fonction reste statique ... elle ne recalcule rien du tout même si je change des données dans la feuille qui contient celles-ci.

Même si je fais F9 rien ne se passe. Par contre si je change un paramètre passé à la fonction elle recalcule.

Désolé de vous prendre votre temps avec un problème certainement très basic. Mais j'aimerais bien que cela fonctionne et surtout je ne comprend pas pourquoi cela ne fonctionne pas, et çà j'aime pas.

Merci à tous pour votre aide.

Droopy
 
D

Droopy

Guest
J'ai simplement passé en paramètre la plage des colonnes de ma feuille principale concerné par la fonction. Je ne les utilise pas dans ma fonction mais il lui fallait çà pour calculer .... c'est du bricolage mais j'ai pas besoin de plus que le fait que cela fonctionne.

Merci encore.

Séb.
 

Statistiques des forums

Discussions
313 101
Messages
2 095 286
Membres
106 243
dernier inscrit
Zamot