![]() |
|
Forum
|
|
|
#1 (permalink) |
|
XLDnaute Nouveau
Date d'inscription: juillet 2005
Messages: 2
|
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. |
|
|
|
| ANNONCES | |||
|
|
|
|
#2 (permalink) |
|
XLDnaute Accro
|
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.
__________________
@+ ![]()
|
|
|
|
|
|
#3 (permalink) |
|
Guest
Messages: n/a
|
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. |
|
|
|
#4 (permalink) |
|
Super Moderator
Date d'inscription: février 2005
Localisation: Rennes
Messages: 10 686
|
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
__________________
Pascal(Visitez mon Blog Photo)Vous pouvez devenir "Supporter XLD", plus de renseignements ICI |
|
|
|
|
|
#5 (permalink) |
|
XLDnaute Occasionel
Date d'inscription: juin 2005
Messages: 113
|
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 |
|
|
|
|
|
#6 (permalink) |
|
Guest
Messages: n/a
|
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 !!! |
|
|
|
#7 (permalink) | |
|
XLDnaute Accro
Date d'inscription: mars 2005
Messages: 1 286
|
Bonjour a tous
Je met mon grain de sel. Il te faux récuperer la cellule qui fait l'ojet du calcul. Citation:
|
|
|
|
|
|
|
#8 (permalink) | |
|
XLDnaute Accro
Date d'inscription: mars 2005
Messages: 1 286
|
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. Citation:
|
|
|
|
|
|
|
#9 (permalink) |
|
XLDnaute Impliqué
Date d'inscription: mars 2005
Localisation: Sermaise
Messages: 873
|
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
__________________
![]() à la mi août, tous les chats sont roux... |
|
|
|
|
|
#10 (permalink) |
|
XLDnaute Impliqué
Date d'inscription: mars 2005
Localisation: Sermaise
Messages: 873
|
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
__________________
![]() à la mi août, tous les chats sont roux... |
|
|
|
![]() |
| Liens sociaux |
| Outils de la discussion | |
|
|