Imbrication de fonctions (personnalisée et Excel)

Fermé
Gedaes Messages postés 26 Date d'inscription dimanche 16 décembre 2018 Statut Membre Dernière intervention 17 décembre 2018 - Modifié le 16 déc. 2018 à 10:19
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 - 17 déc. 2018 à 23:30
Bonjour,

Mon but : calculer la matrice de covariance d'un portefeuille dont je n'ai que les prix
J'ai donc créé une fonction ReturnMatrix qui calcule les rendements : OK elle marche bien et renvoie la matrice de rendements dans excel quand on la teste
Mon but est maintenant de créer la matrice covariance MAIS (car il y a toujours un mais) je suis obligée d'utiliser ici aussi comme paramètre de ma fonction covarmat les prix (cela fait partie d'un gros devoir et mon professeur impose cette difficulté.

Je dois donc dans ma deuxième fonction covarmat, appeler la fonction ReturnMatrix l'appliquer au prix puis appliquer aux résultats CovarianceP. Vous vous doutez que si je suis là c'est que j'ai un petit bémol...

J'arrive bien à appeler ma fonction ReturnMatrix quand je teste cela sans ma boucle ça marche bien mais je n'arrive pas à appliquer CovarianceP à mon tableau temporaire...

PS : quand je teste covarmat directement sur ma plage de prix elle fonctionne donc ce n'est pas la fonction elle-même le problème mais bien mon appellation

Fonction ReturnMatrix:
'fonction calculant la matrice des rendements du portefeuille
Function ReturnMatrix(prices As Range) As Variant
 
'permet la mise à jour lors d'une modification sur la feuille, comme une fonction excel normale
Application.Volatile
 
Dim res()
 
Dim i As Integer, j As Integer
Dim nombredelignes As Integer, nombredecolonnes As Integer
 
nombredelignes = prices.Rows.Count
nombredecolonnes = prices.Columns.Count
 
'Formate la matrice de résultat selon la taille de la matrice de prix du départ
ReDim res(nombredelignes, nombredecolonnes)
 
For i = 1 To nombredelignes
   For j = 1 To nombredecolonnes
        res(i, j) = prices(i + 1, j) / prices(i, j) - 1
    Next j
Next i
 
ReturnMatrix = res
End Function


Fonction covarmat (appliquant covariance aux résultats de ReturnMatrix):
Function covarmat(prices As Range) As Variant
 
'permet la mise à jour lors d'une modification sur la feuille, comme une fonction excel normale
Application.Volatile
 
Dim matriceresultat()
Dim temporaryreturn As Variant
Dim x As Integer, y As Integer
Dim nbredecolonnes As Integer
 
    'Compte le nombre de lignes
    nbredecolonnes = prices.Columns.Count
 
'Formate la matrice de résultat en une matrice carrée
ReDim matriceresultat(nbredecolonnes, nbredecolonnes)
 
    'applique la fonction rendement à la plage de prix
    temporaryreturn = ReturnMatrix(prices)
 
 
    For x = 1 To nbredecolonnes
      For y = 1 To nbredecolonnes
      'applique la covariance entre la colonne x et la colonne y des rendements retournés ci-dessus
      matriceresultat(x, y) = Application.WorksheetFunction.Covariance_P(temporaryreturn.Columns(x), temporaryreturn.Columns(y))
      Next y
    Next x
 
covarmat = matriceresultat
End Function



Merci beaucoup à ceux qui prendront le temps de m'aider!!!
A voir également:

2 réponses

yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
16 déc. 2018 à 10:10
bonjour, quelques suggestions:
- déclarer les types de tes variables, et n'utiliser
variant
que quand c'est indispensable
- utiliser les noms de tes fonctions dans ta description. je vois 9 fonctions en tout: une fonction, ma fonction, ma deuxième fonction, fonction rendement, fonction covariance, fonction rendements, covarmat, ReturnMatrix, Covariance_P
- tu écris "je n'arrive pas à appliquer ma fonction covariance à mon tableau temporaire", et tu n'expliques pas ce qui ne fonctionne pas: message d'erreur, ...
- je crois deviner que tu n'es pas certain d’appeler correctement covarmat(), et tu ne nous décris pas comment tu l'appelles
- tu écris "sans ma boucle": peux-tu être plus précis?
0
Gedaes Messages postés 26 Date d'inscription dimanche 16 décembre 2018 Statut Membre Dernière intervention 17 décembre 2018
16 déc. 2018 à 10:17
Bonjour,
Merci d'abord pour ton retour.
- mes variables sont pourtant déclarées à chaque fois au début selon leur type (integer etc), je ne comprends pas ta remarque
- il n'y a que deux fonctions pourtant mais je n'ai peut être pas été claire (je vais le modifier) : ReturnMatrix puis covarmat (qui applique la Covariance_P à la fonction rendement)
- il n'y a aucun message d'erreur c'est bien ça mon problème ma fonction me renvoie simplement le fameux #Valeur je ne sais donc absolument pas d'où vient mon erreur...
- je pense que c'est plutôt ma façon d'appliquer covariance_P qui ne doit s'appliquer que sur une colonne
- je veux dire que si je mets directement temporaryreturn en sortie de covarmat cela me renvoie bien ma plage de données mais lorsque j'applique la covariance dessus rien ne va #Valeur
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > Gedaes Messages postés 26 Date d'inscription dimanche 16 décembre 2018 Statut Membre Dernière intervention 17 décembre 2018
16 déc. 2018 à 10:22
je vois 2 dim sans type, et 4
variant
.
"ma fonction me renvoie simplement": quelle fonction, et comment l'appelles-tu?
0
Gedaes Messages postés 26 Date d'inscription dimanche 16 décembre 2018 Statut Membre Dernière intervention 17 décembre 2018
16 déc. 2018 à 10:31
Les dim sans type sont Redim par la suite comme je l'ai appris.. N'est ce pas ça?
Pour ce qui est des Variant deux sont directement sur mes fonctions et non sur mes variables. Je n'ai pas le choix pour cette syntaxe la ReturnMatrix et Covarmat doivent être as Variant (imposé dans mon devoir).

La fonction covarmat, c'est d'elle qui me pose problème seulement je ne parle d'aucune autre. Je l'appelle comme une fonction matricielle normale en sélectionnant ma plage de cellule, sélectionnant ma plage paramètre puis CTRL+Shift+Enter. Ce n'est pas l'appelation dans Excel mon problème comme je le spécifiais car quand je teste sur une plage de cellule normale la covarmat fonctionne. Le problème vient bel et bien du fait d'appliquer covarmat SUR ReturnMatrix.
J'ai l'impression de ne pas m'exprimer assez clairement à tes yeux je m'en excuse ^^
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > Gedaes Messages postés 26 Date d'inscription dimanche 16 décembre 2018 Statut Membre Dernière intervention 17 décembre 2018
Modifié le 16 déc. 2018 à 10:35
si tu as un doute sur l'instruction suivante
matriceresultat(x, y) = Application.WorksheetFunction.Covariance_P(temporaryreturn.Columns(x), temporaryreturn.Columns(y))

je suggère de la découper ainsi:
dim rg as range, rg1 as range, rg2 as range, cc as double
set rg = temporaryreturn
set rg1 = rg.Columns(x)
set rg2= rg.Columns(y)
cc= Application.WorksheetFunction.Covariance_P(rg1, rg2)
matriceresultat(x, y) = cc

tu pourras soit obtenir un message d'erreur, soit observer le contenu de chaque variable.
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > Gedaes Messages postés 26 Date d'inscription dimanche 16 décembre 2018 Statut Membre Dernière intervention 17 décembre 2018
16 déc. 2018 à 10:43
redim affecte les dimensions, pas le type. rien ne t’empêche de faire
Dim matriceresultat() as double
.
quid des 2 autres
variant
?
peux-tu montrer le code de covermat qui fonctionne, sans appeler ReturnMatrix?
0
Bonjour

ReturnMatrix te rend un tableau, pas un objet Range. Or ta fonction covarmat est écrite pour travailler sur un Range :
matriceresultat(x, y) = Application.WorksheetFunction.Covariance_P(temporaryreturn.Columns(x), temporaryreturn.Columns(y))

le .Colums(x) et .Columns(y) n'existent pas sur les tableaux.
Il faut que tu extraies les colonnes de ton tableau, et que tu modifies aussi Covariance_P pour pouvoir lui passer des tableaux simples au lieu de Range.
(Pour faciliter l'extraction des colonnes, tu auras probablement intérêt à permuter les indices i et j dans ReturnMatrix)
0
Utilisateur anonyme
16 déc. 2018 à 11:16
Edit :
Si tu peux utiliser une feuille pour stocker temporairement tes données, modifie plutôt ReturnMatrix pour écrire dans cette feuille au lieu d'un tableau.
Comme ça, ReturnMatrix pourrait rendre un objet Range, et tu n'as rien à modifier ailleurs.
0
Gedaes Messages postés 26 Date d'inscription dimanche 16 décembre 2018 Statut Membre Dernière intervention 17 décembre 2018
16 déc. 2018 à 15:34
C'est tout à fait ça je pense que tu as mis le doigt sur le problème que je soupçonnais! Ta deuxième méthode serait merveilleuse et simple mais malheureusement "interdite" ici car je réalise ce code pour un devoir et mon prof nous impose de stocker les résultats de Range temporairement justement.... :'(

Je pense donc qu'il faut creuser ta première solution qui m'a l'air la bonne.
Une fille de ma classe m'a suggéré l'idée (je pense ça judicieux) de remplir un tableau temporaire avec les colonnes de mon tableau comme tu le dis.
J'ai tenté de faire cela avec une boucle for mais je n'ai pas du tout réussi..
Peut être que cela venait justement du fait de la permutation des indices comme tu le dis à la fin? Pourrais-tu m'expliquer ? Je pense vraiment que tu es sur la bonne voie et pourrais me débloquer de 3 jours de blocage...
0
Gedaes Messages postés 26 Date d'inscription dimanche 16 décembre 2018 Statut Membre Dernière intervention 17 décembre 2018
16 déc. 2018 à 15:35
Tu parles également de modifier covariance_P pour lui passer des tableaux simples au lieu de Range, étant une fonction Excel comment puis-je faire ça?
Merci beaucoup pour ton aide en tout cas déjà
0
Utilisateur anonyme > Gedaes Messages postés 26 Date d'inscription dimanche 16 décembre 2018 Statut Membre Dernière intervention 17 décembre 2018
16 déc. 2018 à 21:04
J'ignorais que covariance_P était une fonction Excel, sinon je ne t'aurais pas proposé de la modifier. C'est te dire mon niveau en Excel...
Mais puisque tu ne peux pas la modifier, tu dois obligatoirement lui passer deux objets Range, et je ne connais pas (mais je ne connais pas grand-chose) d'autre méthode pour obtenir des objets Range, que de prendre des cellules d'une feuille. Donc je ne vois pas d'autre méthode que d'utiliser une feuille temporaire.

Tu dis que ton prof t'impose de stocker les résultats de Range temporairement, mais je ne vois pas très bien ce que ça veut dire :
Parles-tu d'un objet Range ? On ne parle pas habituellement du résultat d'un objet
Parles-tu de la propriété Worksheet.Range ? Là, on parle bien du résultat puisqu'une propriété est une fonction, mais ce résultat est un objet Range et toi, ce que tu mémorise temporairement, ce n'est pas un objet Range : tu ne respectes pas plus sa consigne.
0
Gedaes Messages postés 26 Date d'inscription dimanche 16 décembre 2018 Statut Membre Dernière intervention 17 décembre 2018
16 déc. 2018 à 21:12
Oui Covariance_P est la fonction de covariance d'Excel donc je ne vais pas pouvoir agir dessus et je vais devoir réussir à transformer mes objets en Range comme tu le dis.

Je me suis en effet mal exprimée tu ne peux forcément pas comprendre! Je voulais dire que je suis obligée de stocker temporairement les résultats de ReturnMatrix (évidemment pas de Range cela ne veut rien dire c'est normal que tu sois perdu...)
0