Pb de fonction avec ActiveCell

frbcn9

XLDnaute Nouveau
Bonjour,

J'ai créé la fonction suivante :

Function Calcul(Montant As Currency)
Calcul = Round(Montant * 0.15 * (ActiveCell.Offset(0, -1).Value - ActiveCell.Offset(-1, -1).Value) / 365, 2)
End Function

Il s'agit d'un calcul d'intérêts en fonction d'un montant et d'un nombre de jours calculés entre deux dates, qui se trouvent sur la cellule immédiatement à gauche et au-dessus. Le montant est une somme de valeurs extraite de la feuille.

Lorsque je valide la fonction, tout de passe parfaitement. Mais quand je modifie l'un des composants de la zone montant dans la feuille d'origine, le résultat se recalcule automatiquement de manière erronée. Je crois comprendre que, dans ce cas, l'ActiveCell n'est pas la cellule attendue (qui contient l'appel de la fonction), mais une cellule quelconque de la feuille.

Existe-t-il un moyen de résoudre ce problème ?

Je vous remercie par avance de votre aide.
 

dg62

XLDnaute Barbatruc
Bonsoir Frbcn9



Function Calcul(Montant As Currency)
Calcul = Round(Montant * 0.15 * (range('a1').Offset(0, -1).Value - range('a1').Offset(-1, -1).Value) /
365, 2)
End Function




range('A1') est un exemple, il suffit de remplacer A1 par la cellule de référence.
 
F

frbcn9

Guest
Bonsoir dg62,

Je te remercie pour ta réponse, mais malheureusement, elle ne convient pas à mon problème. En effet, dans ma feuille de calcul j'ai de très nombreux appels à cette fonction et donc mettre 'en dur' la cellule de départ du calcul dans la fonction est impossible.

J'ai pensé ajouter cette valeur en paramètre de la fonction, mais je me demandais s'il n'y avait pas une autre solution plus sophistiquée qui m'éviterait de changer toute ma feuille.

Ce devrait pouvoir être possible, car excel, pour évaluer la fonction est bien obligé à un moment donné de se déplacer sur la cellule en question.
 

PascalXLD

XLDnaute Barbatruc
Modérateur
Bonjour

Peut-être en rentrant au moins une des cellules dans ta fonction


Function Calcul(Montant As Currency, Date1 As Range)
Calcul = Round(Montant * 0.15 * (Date1.Value - date1.Offset(0, -1).Value) /
365, 2)
End Function

Bon courage
 

marco57

XLDnaute Occasionnel
Bonsoir à tous et au forum,

Si tu ajoutais deux arguments à ta fonction, il me semble qu'il n'y aurait plus de problème.
Je te propose :

Function Calcul(Montant As Range, DateDébut As Range, DateFin As Range)
Calcul = Round(Montant * 0.15 * (Fin.Value - Début.Value) / 365, 2)
End Function

Là où tu veux faire le calcul tu saisis la fonction =Calcul(C5;D5;D4) avec C5 la cellule contenant le montant,
D5 la cellule contenant la date la plus grande
et D4 la cellule contenant la date la plus petite

A+

Marco
 
F

frbcn9

Guest
Je vous remercie pour vos réponses. Je sens que je vais faire comme vous m'avez conseillé. Cela ne m'arrange pas vraiment, je dois avoir un bon millier de cellules à rectifier.

C'est vraiment stupide que l'on ne puisse pas déterminer dans une fonction qui l'a appelé (un bouton, une cellule, ....)

Merci quand même !!!
 

Hellboy

XLDnaute Accro
re a tous

Et bien si tu veux t'éviter de tout marquer è a la main, une boucle comme cell-ci pourrais te sortir du pétrain.

Tu n'as qu'a sélectionner la plage qui contient tes formule et exécuter cette macro. Étant donné que je ne connais pas comment exactement tu a écrit ta formule ds tes cellules, ceci est a titre d'exemple.

Public Sub CoipeParesse()
For Each cell In Selection
   
With cell
    cell = Replace(.Formula, ')', ';' & Chr(.Column + 64) & .Row & ')')
   
End With
Next cell
End Sub

a+
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour Frbcn9, Pascal, Dg62, Marco57, Hellboy, le forum

Eh ben si, on peut déterminer la cellule qui appelle la fonction!
Frbcn9, un application.thiscell te renverra ce que tu cherches c'est à dire la référence de la cellule appelant la fonction. Par contre n'oublie pas le application., car thiscell seul peut renvoyer une erreur.
Voici la traduction dans ton code, je ne sais pas s'il sera fonctionnel car il manque peut être une parenthèse pour que le calcul soit juste.

Cordialement, A+

Code:
Function Calcul(Montant As Currency)
MsgBox Application.ThisCell.Address
Calcul = Round(Montant * 0.15 * (Application.ThisCell.Offset(0, -1).Value - Application.ThisCell.Offset(-1, -1).Value) / 365, 2)
End Function
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Re bonjour

voila le même code avec un traitement différencié appel d'une cellule ou par programme (en cas d'appel par programme, thiscell renvoie une erreur et on utilise activecell). Il ne te reste plus qu'à adapter.
Cela devrait fonctionner.

A+

Code:
Function Calcul(Montant As Currency)
On Error GoTo Traite_Bouton
Calcul = Round(Montant * 0.15 * (Application.ThisCell.Offset(0, -1).Value - Application.ThisCell.Offset(-1, -1).Value) / 365, 2)
Exit Function
Traite_Bouton:
Calcul = Round(Montant * 0.15 * (ActiveCell.Offset(0, -1).Value - ActiveCell.Offset(-1, -1).Value) / 365, 2)
End Function
 

Discussions similaires

Statistiques des forums

Discussions
312 492
Messages
2 088 938
Membres
103 988
dernier inscrit
Feonix