Pb de fonction avec ActiveCell

  • Initiateur de la discussion Initiateur de la discussion frbcn9
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

F

frbcn9

Guest
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.
 
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.
 
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.
 
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
 
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 !!!
 
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+
 
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
 
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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
3
Affichages
208
Réponses
3
Affichages
877
R
Réponses
3
Affichages
831
Retour