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 :

Problème de réutilisation d'une fonction


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 Problème de réutilisation d'une fonction
    Bonjour,

    Je souhaite réutiliser une fonction dans une procédure mais je bloque.

    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
    Function Period_since_valo()
    
    'Déterminer le nombre de collonne du tableau dynamique
    Dim x As Integer
     x = Cells(4, 2) * Cells(5, 2)
     
    Dim i As Integer
    Dim Tab_period() As Single
    
    ReDim Tab_period(0, x)
    For i = 0 To x
    Tab_period(0, i) = 1 / (Cells(4, 2)) * (i + 1) - ((Cells(3, 2) - Cells(2, 2)) / 360)
    Next i
    End Function
    
    Function Pricing_flow_bondB()
    Dim x As Integer
     x = Cells(4, 2) * Cells(5, 2)
    Dim i As Integer
    Dim Flow_bondB() As Single
    ReDim Flow_bondB(0, x)
    For i = 0 To x
    Flow_bondB(0, i) = Cells(7, 2) * Cells(6, 2) * Exp(-Cells(8, 2) * Period_since_valo(0,i))
    
    'ici j'aurai besoin de la fonction period_since_valo avec i qui va de 0 à i. 
    Next i
    
    Range(Cells(13, 1), Cells(13, x)).Value = Flow_bondB()
    Range(Cells(13, 1), Cells(13, x)).Borders.Value = 1
    Range(Cells(13, 1), Cells(13, x)).NumberFormat = "0.00"
    
    Dim Valeur_termB As Single
    
    Valeur_termB = Cells(6, 2) * Exp(-Cells(8, 2) * Period_since_valo)
    'Ici j'aurai besoin de la valeur de Period_since_valo avec i = x 
    
    P = Application.Sum(Flow_bondB()) + Valeur_termB
    Merci d'avance pour votre aide, je bloque dessus depuis un bout de temps ...


  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,

    quelques remarques:
    Ta fonction Function Period_since_valo() est déclarée sans paramètre.
    Or tu l'appelles une fois sans paramètre et une fois avec 2 paramètres(Period_since_valo(0,i)).
    Si tu dois lui passer des valeurs en argument, il faut définir les paramètres correspondants, éventuellement en Optional(facultatif).
    De plus ta fonction ne renvoi pas de valeur:
    il n' y a pas d'instruction NomDeLaFonction=ValeurARenvoyer
    HTH,

  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,

    J'ai fait quelques modifications en suivant tes conseils mais j'ai un beug.

    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
    Function Period_since_valo(i As Integer)
    Dim x As Integer
     x = Cells(4, 2) * Cells(5, 2)
     
    Dim i As Integer
    Dim Tab_period() As Single
    
    ReDim Tab_period(0, x)
    
    'Calculer les valeurs
    
    For i = 0 To x
    
    Tab_period(i) = 1 / (Cells(4, 2)) * (i + 1) - ((Cells(3, 2) - Cells(2, 2)) / 360)
    
    Next i
    
    Period_since_valo(i) = Tab_period(i) 
    'Cela me renvoie à l'erreur : l'indice n'appartient à la sélection 
    Merci d'avance

  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- tu ne peux pas avoir un paramètre nommé i, et une variable locale ayant le même nom.
    Dans ce cas, c'est la variable locale(Dim i As Integer) qui prend le pas sur le paramètre, et tu perds la valeur du paramètre.

    2- syntaxe de l'instruction qui rend la valeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ' à gauche du signe égal, c'est le nom de la fonction, sans argument
    Period_since_valo = Tab_period(i)
    Cordialement,

  5. #5
    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
    Super merci beaucoup Philippe

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Dans une fonction, il est déconseillé d'utiliser des "Range" et autres objets mais plutôt des valeurs. par exemple, si je prends ta première fonction, elle pourrait ressembler à ça :
    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
     
    Function Period_since_valo(Valeur1 As Double, _
                               Valeur2 As Double, _
                               Valeur3 As Double, _
                               NbColonne As Long) As Double() '<-- double parenthèses si la fonction retourne un tableau
     
        Dim I As Integer
        Dim Tab_period() As Double
     
        ReDim Tab_period(NbColonne)
     
        For I = LBound(Tab_period) To NbColonne '<-- ou UBound(Tab_period)
     
            Tab_period(I) = 1 / Valeur1 * (I + 1) - (Valeur2 - Valeur3) / 360
     
        Next I
     
        Period_since_valo = Tab_period '<-- ici la fonction retourne le tableau
     
    End Function
    et cette fonction peut être appelée de cette façon :
    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
     
    Sub Test()
     
        Dim Tbl
        Dim I As Long
     
        Tbl = Period_since_valo(Cells(4, 2).Value, Cells(3, 2).Value, Cells(2, 2).Value, Cells(4, 2).Value * Cells(5, 2).Value)
     
        For I = LBound(Tbl) To UBound(Tbl)
     
            Debug.Print Tbl(I)
     
        Next I
     
    End Sub
    Dans cet exemple, la fonction retourne un tableau (d'où la présence des parenthèses). Les valeurs des cellules sont passées en argument de même qu'une opération pour déterminer le nombre de colonnes.

Discussions similaires

  1. problème de variable dans une fonction
    Par K4trix dans le forum C
    Réponses: 9
    Dernier message: 06/07/2006, 09h38
  2. Réponses: 7
    Dernier message: 05/05/2006, 09h48
  3. Problème d'execution d'une fonction
    Par 12_darte_12 dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 17/03/2006, 11h37
  4. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50
  5. Réponses: 7
    Dernier message: 12/03/2006, 21h18

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