IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Réutiliser une fonction dans une autre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2016
    Messages : 11
    Par défaut Réutiliser une fonction dans une autre
    Bonjour,

    J'ai un problème, je voudrai utiliser la fonction period_since_valo dans une autre fonction mais j'ai le code d'erreur incompatibilité de type.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Function Period_since_valo(Frequence As Double, _
    Date_valo As Double, _
    Date_emmision As Double, _
    NbColonne As Long) As Double()
    
    Dim I As Integer
    
    Dim Tab_period() As Double
    
    ReDim Tab_period(NbColonne)
    
    For I = LBound(Tab_period) To NbColonne
    
    Tab_period(I) = 1 / Frequence * (I + 1) - ((Date_valo - Date_emmision) / 360)
    
    Next I
    
    Period_since_valo = Tab_period
    
    Function Pricing_flow_bond(Coupon As Double, _
    Principal As Double, _
    Taux As Double, _
    NbColonne As Long, Period_since_valo() As Double) As Double()
    
    Dim I As Integer
    
    Dim Flow_bond() As Double
    
    ReDim Flow_bond(NbColonne)
    
    For I = LBound(Flow_bond) To NbColonne
    
    Flow_bond(I) = Coupon * Principal * Exp(-Taux * Period_since_valo)
    
    Next I
    
    Pricing_flow_bond = Flow_bond
    
    End Function
    
    Sub InsertionFlowB()
    
    Dim Tbl3() As Double
    Dim I As Long
    
    Tbl3 = Pricing_flow_bond(Cells(7, 2).Value, Cells(6, 2).Value, Cells(8, 2).Value, Cells(4, 2).Value * Cells(5, 2).Value, Period_since_valo(Cells(4, 2).Value, Cells(3, 2).Value, Cells(2, 2).Value, Cells(4, 2).Value * Cells(5, 2).Value))
    Si vous avez une piste ce serait top

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    dans la déclaration de ta fonction Period_since_valo
    tu spécifies 4 paramètres.
    Ces paramètres sont obligatoires, ce qui signifie que dans l'instruction qui appelle
    cette fonction, 4 valeurs doivent être passées en argument.
    Or, dans l'appel suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Flow_bond(I) = Coupon * Principal * Exp(-Taux * Period_since_valo)
    tu ne passes aucune valeur à la fonction!
    Ça ne peut pas marcher comme ça!
    De plus ta fonction retourne un tableau de double, ce qui n'est pas évident à manipuler
    pour un débutant!
    Tu devrais plus diviser ton programme en séquences plus faciles à gérer.
    Par exemple, stocker le tableau retournée par ta fonction dans une variable.
    et ensuite seulement utiliser cette variable dans l'instruction qui calcul Flow_bond(I)
    Cordialement,

  3. #3
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2016
    Messages : 11
    Par défaut
    Merci Philippe pour ton aide ! J'ai réessayé en passant les arguments de la fonction period_since_valo mais j'ai toujours le message "Incompatibilité de type"...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     Function Pricing_flow_bond(Coupon As Double, _
                               Principal As Double, _
                               Taux As Double, _
                               NbColonne As Long) As Double()
    Dim I As Integer
    Dim Flow_bond() As Double
     
    ReDim Flow_bond(NbColonne)
     
        For I = LBound(Flow_bond) To NbColonne
            Flow_bond(I) = Coupon * Principal * Exp(-Taux * Period_since_valo(Cells(4, 3).Value, Cells(3, 3).Value, Cells(2, 3).Value, Cells(4, 3).Value * Cells(5, 3).Value))
    
        Next I
     
        Pricing_flow_bond = Flow_bond
        
                               End Function
    
     Sub InsertionFlowB()
    
        Dim Tbl3() As Double
        Dim I As Long
    
        Tbl3 = Pricing_flow_bond(Cells(7, 2).Value, Cells(6, 2).Value, Cells(8, 2).Value, Cells(4, 2).Value * Cells(5, 2).Value)

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    1- Essai d'apprendre à utiliser les balises [CODE] ( le petit # dans les outils!)
    2- passer des cells en argument, c'est franchement horrible!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Period_since_valo(Cells(4, 3).Value, Cells(3, 3).Value, Cells(2, 3).Value, Cells(4, 3).Value * Cells(5, 3).Value)
    Le but d'une fonction, c'est pas d'aller pêcher les données, c'est juste de faire des calculs sur les données que lui passe
    le procédure qui utilise les service de la fonction.
    (THEZE te l'avait déja dit!)
    3- s'il y a incompatibilité de type, c'est probablement que l'une des données renvoyée par tes cells n'a pas le type de données
    des paramètres de la fonction.
    NB: ne pas oublier que, par défaut, les paramètres sont passés ByRef (par référence), et donc il faut que le types des argumentes corresponde rigoureusement
    au type des paramètres.
    4- il te faudrait chercher dans les tutoriels du site, un tutoriel sue les bases de vba.
    Cordialement,

    EDIT: ta fonction à 5 paramètres, et tu ne passes que 4 valeurs!(si je lis bien!)

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Appel d'une fonction dans une iframe sur un autre domaine
    Par morikann dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/06/2007, 18h46
  5. Réponses: 8
    Dernier message: 10/01/2007, 21h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo