Aide pour développer une fonction !

  • Initiateur de la discussion Initiateur de la discussion Etienne2323
  • 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 !

Etienne2323

XLDnaute Impliqué
Bonjour à tous,
encore une fois, je vous remercie de prendre de votre temps pour vous pencher sur mon problème. Je viens vers vous ce matin avec un petit défi de programmation. Je cherche à développer une fonction personnalisée qui remplacerait le calcul matriciel que j'emploie actuellement. Toute la problématique est les contraintes sont exposées dans le fichier Rendements.xls. Les deux fichiers sont toutefois nécessaires. En vous remerciant beaucoup !

Si vous avez des questions ou que quelque chose n'est pas claire, ne vous gênez surtout pas. Je sais que j'ai la nette tendance à manquer de limpidité dans mes explications.

Cordialement,

Étienne
 

Pièces jointes

Re : Aide pour développer une fonction !

Bonjour PierreJean,

je vais faire de mon mieux pour vous traduire ça en bon français.

La fonction de départ, avant qu'elle soit modifiée est la suivante :

{=produit(1+[plage])^(1/nombre d'année) -1}

Pour intégrer le fait que la date choisie est variable tout comme le sont les numéros de colonne pour les ticker, j'ai dû improviser un peu.

J'ai utilisé la fonction indirect de manière à pouvoir jouer avec les paramètres à l'intérieur du produit matriciel.

1) Donc, le premier equiv sert à déterminer le numéro de la colonne qui correspond au bon ticker (donc à l'horizontal)

2) Avec une rechercheh, je transfère le numéro de colonne trouvé, par exemple 3, en lettre, donc C dans mon exemple, dans une petite table que j'ai faite dans l'onglet paramètres.

3) Le second equiv sert à aller chercher la ligne correspondant à la date choisie.

4) Avec une petite manipulation (Nombre d'année * 12 -1), j'arrive à obtenir la date de début pour mon produit (par exemple 2 ans plus tot). Je soustrait donc le chiffre obtenu au résultat du equiv pour la date.

5) Je fait une concaténation (je ne sais pas si c'est le bon terme 😉 ) pour obtenir le résultat suivant (toujours un exemple) : C150:C185

Donc, avec la fonction indirect, j'arrive à entrer la feuille dans laquelle le produit matriciel doit être effectué, ainsi que les plages à couvrir.

Finalement, le petit (1/nombre d'années) est utilisé de la même manière que dans le cas d'une moyenne géométrique. C'est essentiel à la formule. Sinon, on se retrouve avec des rendements de plus en plus gros plus les années passent.

En espérant avoir été plus clair !

Merci de votre aide !

Cordialement,

Étienne

Edit : J'oubliais, la fonction si(esterreur(produit ... au départ sert uniquement au fait que si le rendement n'existe pas où qu'il y a une erreur quelconque, alors mettre un "s.o." plusque qu'un #VALEUR, c'est plus esthétique quand on présente les résultats.
 
Dernière édition:
Re : Aide pour développer une fonction !

Bonjour PierreJean,
votre macro est magique. C'est exactement ce que je cherche à faire. Si c'était juste de moi, j'intègrerais un code comme celui-ci sans aucune hésitation. Par contre, mes patrons sont plutôt hésitant face à l'implantation de macros puisqu'ils considèrent qu'ils n'ont pas les compétences dans l'entreprise pour faire des modifications en cas d'erreur. Si jamais vous arrivez à faire une fonction personnalisée avec un code comme celui-ci, ce serait vraiment bien. Sinon, je vous remercie déjà beaucoup pour votre macro et votre temps !

Cordialement,

Étienne
 
Re : Aide pour développer une fonction !

Bonjour Etienne2323, Bonsoir PierreJean,

Quelle différence entre une macro et une fonction que l'on a créée ? et ce pour répondre à :

"mes patrons sont plutôt hésitant face à l'implantation de macros puisqu'ils considèrent qu'ils n'ont pas les compétences dans l'entreprise pour faire des modifications en cas d'erreur"

Dans les deux cas, c'est du code "macrotique". Le premier (macro) sera appellé par un bouton ou tout ce que l'on veut, et le second sera appellé par une formule du type "=MaFonction", c'est du pareil au même... Il faudra du code derrière...., donc de la macro.

On est plus tout à fait sous Excel seul, on profite du VBA, donc de la programmation, donc.... Macro ou fonction créée, pas de différence, ceci pour tes patrons....

Bon après-midi Etienne, bonne fin de soirée PierreJean et à tous.

Jean-Pierre
 
Re : Aide pour développer une fonction !

Bonsoir jeanpierre,
effectivement, vous avez entièrement raison. Je suis actuellement en train d'adapter cette macro à ma situation réelle. Tant qu'à sortir d'Excel, pourquoi ne pas en sortir pour vrai et y aller avec VBA ! Je vais essayer de leur produire un résultat final sans faille pour qu'ils ne puissent pas dire autre chose que "Bon boulot Étienne" ! Vous pourrez vous dire que c'est un peu grâce à vous, les grands manitous d'Excel et de ce forum ! 😉 qui m'avez donné la piste de solution !

Merci beaucoup pour votre aide et votre temps !

Bonne soirée !

Étienne
 
Re : Aide pour développer une fonction !

Rebonjour Pierre,
pourrais-je abuser de votre savoir encore un petit peu ? Je dois incorporer dans VBA une fonction d'Excel qui me servait à obtenir mon rendement depuis la création du fonds. La plage est donc toujours variable. La fonction Excel est la suivante :

=MIN(12/(12*(ANNEE(DateRapport)-ANNEE(DateCreation))+MOIS(DateRapport)-MOIS(DateCreation)+(JOUR(DATE(ANNEE(DateCreation);MOIS(DateCreation)+1;0))-JOUR(DateCreation))/JOUR(DATE(ANNEE(DateCreation);MOIS(DateCreation)+1;0)));1)

Ma meilleure version pour l'instant dans VBA est la suivante.

Code:
Exposant = 12 / (12 * Year(DateRapport) - Year(DateCreation(i))) + Month(DateRapport) - Month(DateCreation(i)) + Day(DateSerial(Year(DateCreation(i)), Month(DateCreation(i)) + 1, 0)) - Day(DateCreation(i)) / Day(DateSerial(Year(DateCreation(i)), Month(DateCreation(i)) + 1, 0))

Toutefois, je n'arrive pas à y ajouter le min. Auriez-vous une piste à me proposer ?

Merci encore une fois !!

Étienne
 
Re : Aide pour développer une fonction !

Rebonjour,
veuillez ne pas tenir compte du dernier message, j'ai fini par y arriver !

Code:
AnneeExposant = Year(DateRapport) - Year(DateCreation(i))
MoisExposant = Month(DateRapport) - Month(DateCreation(i))
JourExposant = Day(DateSerial(Year(DateCreation(i)), Month (DateCreation(i)) + 1, 0)) - Day(DateCreation(i)) / Day(DateSerial(Year(DateCreation(i)), Month(DateCreation(i)) + 1, 0))
Exposant = 12 / ((12 * AnneeExposant) + MoisExposant + JourExposant)
        
If Exposant < 1 Then
     Exposant = Exposant
Else
     Exposant = 1
End If

Une simple condition suffisait pour faire mon min.

En vous remerciant pour votre temps et votre patience !

Cordialement,

Étienne
 
- 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
Retour